ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理)

2024-02-26 07:20

本文主要是介绍ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写目录标题

  • 一,同步异常的分析
    • 1.1 同步异常分析-异常链接寄存器ELR
    • 1.2 同步异常分析-异常综合寄存器ESR,Exception Syndrome Register
    • 1.3 同步异常分析-错误地址寄存器FAR,Fault Address Register
  • 二, 同步异常的处理示例 Synchronous exception handling
  • 三, 异步异常的处理示例 Asynchronous exception handling

一,同步异常的分析

在文章ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types中提到过,同步异常是处理器在执行指令时产生的异常,是一种精确的,可以具体定位到是哪条指令导致异常的产生。下面笔者将介绍三个用于定位并分析同步异常产生的寄存器。

1.1 同步异常分析-异常链接寄存器ELR

在文章ARMv8-AArch64 的异常处理模型详解之异常向量表vector tables中提到过,同步异常发生时,会将产生同步异常的那条指令的地址写入ELR,所以如果想知道是哪条指令导致异常的产生,软件在处理异常时可以读取ELR中的值进行分析。

1.2 同步异常分析-异常综合寄存器ESR,Exception Syndrome Register

ESR寄存器里保存着一些异常的诊断信息,比如异常产生的原因。在进入异常后,我们可以读取对应异常等级的ESR(ESR_EL1,ESR_EL2或者ESR_EL3),通过解析各个字段的数值所表示的含义,来分析出当前异常产生的原因。
在这里插入图片描述
拿ESR的EC, bits [31:26]举例,这个EC字段指示了当前异常产生的原因,比如当EC == 0b100010时,按照ARM文档的描述,我们可知当前异常是因为PC未对齐(地址不以0x0 0x4 0x8 0xc结尾)。
在这里插入图片描述
除了EC字段,还有IL字段,从该字段可知是32-bit长度还是16bit 长度的指令导致的异常:
在这里插入图片描述

1.3 同步异常分析-错误地址寄存器FAR,Fault Address Register

FAR寄存器将为一些同步异常保存导致异常发生的地址,包括如下同步异常:

  • 指令中止异常(Instruction Abort exceptions), 此时ESR寄存器的EC 值为0x20 或者0x21,
    在这里插入图片描述

  • 数据中止异常,Data Abort exceptions, 此时ESR寄存器的EC 值为0x24 或者 0x25:
    在这里插入图片描述

  • PC对齐错误异常,PC alignment fault exceptions,此时ESR寄存器的EC 值为0x22。
    在这里插入图片描述

  • 调试异常的观察点异常,Watchpoint exceptions,此时ESR寄存器的EC 值0x34 或者0x35:
    在这里插入图片描述
    FAR寄存器中的保存的地址是指令获取或数据访问时,导致指令或数据中止的异常的地址。

二, 同步异常的处理示例 Synchronous exception handling

假设有这么一个场景:执行在EL0的AArch32 应用程序需要向执行在EL1的AArch64 操作系统请求一个堆的内存分配,它需要执行一个SVC指令,产生一个SVC同步异常,这将发生如下事件:

  • 当前的处理器状态PSTATE将会保存到SPSR_EL1中。
  • 产生异常指令(SVC)的下一条指令的地址将会被写入到ELR_EL1中。
  • 异常诊断信息(导致异常发生的原因)将会被记录到ESR_EL1寄存器中。
  • 目标执行状态取决于HCR_EL2.RW 位。
  • 当前的处理器状态PSTATE将会被更新:异常等级将会切到EL1,执行状态更行到AArch64
  • PC将会跳转到VBAR_EL1+ 600的异常向量,因为是同步异常,有来自低异常等级的异常等级切换,并且低的异常等级为AArch32,所以根据异常向量的选择要求,将选择VBAR_EL1+ 600处的异常向量作为异常处理器。
  • 在top exception handler中,在进行异常处理前,当前处理器的寄存器上下文将会被压入到SP_EL1中。
  • 在top exception handler中,根据ESR中的信息,知道当前异常为SVC异常,所以跳转到指定的SVC异常处理函数中。
  • 在SVC异常处理函数执行完成后,回到top exception handler。
  • 在top exception handler中,将之前压入到SP_EL1中的寄存器上下文恢复,并执行ERET指令。
  • ERET指令包括两个步骤:将SPSR_EL1的值恢复到PSTATE中(包括异常等级为EL0,执行状态为AArch32),然后将ELR_EL1中的值写入到PC中。

以上就是执行SVC指令从EL0进入到EL1进行异常处理,然后返回的一般流程。
上述场景还尚未考虑到安全状态的切换,如果是EL0+AArch32+Non-secure状态下,要进入到EL1+AArch64+secure状态进行某些操作,则处理流程将更加复杂。之前的文章提到过,Secure状态的切换必须经过EL3,所以要想实现此操作,中间还需要执行SMC指令进入到EL3。

三, 异步异常的处理示例 Asynchronous exception handling

异步异常,比如中断,是来自处理器外部的信号,或者SError,来自内存系统的的错误反馈。ARM没有规定异步异常应该什么时候发生,并且,关于异步异常与同步异常的优先级问题,如果同步异常和异步异常同时发生,那么处理器先处理哪一个,这个是由处理器的具体实现定义的。
假设有这么一个场景:当处理器在EL0 AArch32状态下执行用户程序时,发生了一个IRQ中断,假设HCR_EL2 和 SCR_EL3都以及被配置成将当前IRQ中断路由到EL1 AArch64状态下处理,下图为该中断的处理流程:
在这里插入图片描述

  • 当前的处理器状态PSTATE将会保存到SPSR_EL1中。
  • 中断发生时,第一条未被执行完成的指令的地址将会被写入到ELR_EL1中。
  • 异常诊断信息(导致异常发生的原因)将会被记录到ESR_EL1寄存器中。
  • 目标执行状态取决于HCR_EL2.RW 位。
  • 当前的处理器状态PSTATE将会被更新:异常等级将会切到EL1,执行状态更行到AArch64
  • PC将会跳转到VBAR_EL1+ 0x680的异常向量,因为是IRQ中断,有来自低异常等级的异常等级切换,并且低的异常等级为AArch32,所以根据异常向量的选择要求,将选择VBAR_EL1+ 0x680处的异常向量作为异常处理器。
  • 在top exception handler中,在进行异常处理前,当前处理器的寄存器上下文将会被压入到SP_EL1中。
  • 在top exception handler中,跳转到指定的IRQ异常处理函数中。
  • 在IRQ处理函数执行完成后,回到top exception handler。
  • 在top exception handler中,将之前压入到SP_EL1中的寄存器上下文恢复,并执行ERET指令。
  • ERET指令包括两个步骤:将SPSR_EL1的值恢复到PSTATE中(包括异常等级为EL0,执行状态为AArch32),然后将ELR_EL1中的值写入到PC中。

以上就是进行IRQ中断异常处理,然后返回的一般流程。需要注意的是,处理器或者说是IRQ handler并没有能力判断中断源,只是收到了IRQ中断信号,并开始IRQ中断处理。至于具体的中断源判断、中断优先级以及中断属性(edge/level, secure/non-sercure)配置的工作,由GIC来完成。通过读取GIC的IAR(Interrupt Acknowledge Registers)寄存器,处理器可以知道当前中断源的中断号。一旦中断被处理完成,处理器可以配置GIC的EOIR(End of Interrupt Register)寄存器,来通知GIC当前中断已经被处理完成,并且该中断的状态也随即会变成inactive。

这篇关于ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/748078

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验