【方辉专栏】ARM64体系结构编程与实践学习笔记(五) 异常处理
发布时间:2022-07-25

摘要: 本文主要对Armv8体系的异常处理的基本概念进行介绍。

关键字:Armv8、体系结构、ARM架构、异常处理、中断、复位、同步异常、异步异常


1. 异常处理的基本概念

异常是任何可能导致当前正在执行的程序暂停并导致状态更改以执行代码来处理该异常的事件。Armv8体系结构将异常分为两大类:同步异常和异步异常。


1.1同步异常

同步异常是指处理器执行某条指令而直接导致的异常,往往需要在异常处理函数处理该异常之后,处理器才能继续执行。这意味着同步异常与执行流同步。

常见的同步异常如下:

  • 尝试访问一个异常等级不恰当的寄存器。
  • 尝试执行没有定义的指令
  • 使用没有对齐的SP
  • 尝试执行与PC指针没有对齐的指令。


1.2 异步异常

异步异常是指异常触发的原因与处理器当前正在执行的指令无关的异常,中断属于异步异常的一种。因此与当前指令流不同步。这意味着无法准确保证何时会发生异步异常。Armv8-A 架构只要求它在有限的时间内发生。也可以暂时屏蔽异步异常。这意味着异步异常可以在发生异常之前处于挂起状态。


常见的异步异常包括物理中断和虚拟中断。物理中断是响应于 PE 外部产生的信号而产生的。虚拟中断可以由外部产生,也可以由在 EL2 处执行的软件产生。


Arm 架构有两种中断类型,IRQ 和 FIQ。在旧版本的 Arm 架构中,FIQ 被用作更高优先级的快速中断。在Armv8-A 和 Armv9-A 中 FIQ 与 IRQ 具有相同的优先级。


IRQ 和 FIQ 具有独立的路由控制,通常用于实现安全和非安全中断。


Armv8.8-A 和 Armv9.3-A 添加了不可屏蔽中断 (NMI) 。


2. 异常处理及返回

当发生异常时,中断当前程序流程。处理元件 (PE) 将更新当前状态并分支到向量表中的某个位置。通常这个位置将包含通用代码,用于将当前程序的状态推送到堆栈上,然后分支到进一步的代码。


当发生异常时,必须保留当前状态以便可以返回。PE 会自动保存异常返回地址和当前PSTATE.存储在通用寄存器中的状态必须由软件保存。然后,PE 会将当前更新为PSTATE体系结构中为该异常类型定义的类型,并分支到向量表中的异常处理程序。


获取异常的PSTATE位置存储在 System registerSPSR_ELx中,其中 <x> 是获取异常的异常级别的编号。异常返回地址存储在 中ELR_ELx,其中 <x> 是异常被处理到的异常级别。


软件可以通过从 AArch64 执行 ERET 指令来启动异常返回。这将根据SPSR_ELx的值配置返回的异常级别,其中 <x> 是返回的级别。SPSR_ELx包含要返回的目标级别和目标执行状态。


执行 ERET 指令时,状态将从SPSR_ELx 中恢复,程序计数器将更新为ELR_ELx中的值。


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


关于亿道电子

亿道电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。

20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。亿道电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。

欢迎关注“亿道电子”公众号

了解更多研发工具软件知识