ARM架构中的Exception Level(EL)
在ARM架构中,Exception Level(EL)是一个关键概念,它表示了处理器当前处理异常或中断的层次。ARMv8-A架构定义了四个Exception Levels:EL0、EL1、EL2和EL3,其中EL0是最低层次,通常用于用户空间的应用程序,而EL3是最高层次,通常用于系统级的服务和中断处理。
当一个异常在较低的EL(例如EL0)发生时,它可能会被传递到更高的EL(例如EL2)进行处理。在这个过程中,需要确定使用哪个Execution State(执行状态)的指令集来处理这个异常。这是因为ARMv8-A架构支持两种执行状态:AArch32(32位执行状态)和AArch64(64位执行状态)。
让我们通过一个具体的例子来解释这个概念:
假设我们有以下的Execution State配置:
- EL0:运行在AArch32状态
- EL1:运行在AArch64状态
- EL2:运行在AArch64状态
现在,如果在EL0(即用户空间的应用程序)发生了一个异常,并且这个异常被传递到EL2进行处理,那么此时我们需要查看比EL2低一级的EL(即EL1)的Execution State来决定使用哪个指令集来处理这个异常。
因为EL1是运行在AArch64状态,所以即使原始的异常是在EL0的AArch32状态下发生的,当异常被传递到EL2进行处理时,它仍然会使用AArch64指令集。
这是因为ARMv8-A架构规定,当异常从一个较低的EL传递到一个较高的EL时,会使用较高EL的Execution State来处理这个异常。
此外,向量表(Vector Table)中的指令块(也称为向量表条目或异常处理程序条目)是用来快速跳转到相应的异常处理程序的。因此,在EL2响应EL0的异常时,会根据EL1的Execution State来选择向量表中的适当条目,作为异常处理的入口点。
总结来说,如果发生异常的EL与响应异常的EL不同,并且发生异常的EL低于响应异常的EL,那么会使用比响应异常的EL低一级的EL的Execution State来决定使用哪个指令集来处理这个异常。这确保了异常可以在正确的执行状态下得到处理。
举个例子
在ARMv8-A架构中,FIQ(Fast Interrupt Request)和IRQ(Interrupt Request)是两种类型的异常,分别对应于快速中断和普通中断。这些异常可以在不同的Exception Levels(ELs)之间传递和处理。为了处理这些异常,系统中会有一个向量表(Vector Table),其中包含了指向不同异常处理程序的入口点。
向量表中的每个条目(或称为指令块)都有一个固定的偏移量,这个偏移量通常是基于异常类型和当前执行状态的。当异常发生时,处理器会根据当前的Execution State和异常类型,从向量表中选取相应的条目,并跳转到该条目指定的地址开始执行异常处理程序。
现在,我们根据你提供的例子来解释这个过程:
EL0:AArch32,EL1:AArch64,EL2:AArch64,EL0发生的FIQ在EL2响应,EL1的Execution State为AArch64,所以execution会跳到offset为0x500的指令块处理异常
-
在这个例子中,一个FIQ异常在EL0(用户空间,32位执行状态)中发生。由于某些原因(如配置或异常处理机制的设计),这个异常被传递到EL2进行处理。
-
当异常传递到EL2时,处理器会查看比EL2低一级的EL(即EL1)的Execution State来确定使用哪个指令集。因为EL1是在AArch64状态下运行的,所以处理器将使用AArch64指令集来处理这个FIQ异常。
-
接下来,处理器会查找向量表中对应于FIQ异常和AArch64执行状态的条目。假设这个条目的偏移量是0x500,那么处理器会跳转到向量表中偏移为0x500的位置,从那里开始执行FIQ异常处理程序。
EL2用的SP是SP_EL0,IRQ exception发生在EL2并在EL2响应,那么execution会跳到offset为0x080的指令块处理异常 -
在这个例子中,一个IRQ异常在EL2中发生并在EL2中响应。这意味着异常处理程序将直接在EL2中执行,不需要传递到其他更低的EL。
-
尽管EL2使用的是SP_EL0(即EL0的栈指针),这通常是为了异常处理过程中的栈管理,但这并不直接影响异常处理程序的执行状态和向量表的查找。
-
处理器会查找向量表中对应于IRQ异常和当前执行状态的条目。如果当前执行状态是AArch64,并且向量表中对应于IRQ异常和AArch64执行状态的条目的偏移量是0x080,那么处理器会跳转到向量表中偏移为0x080的位置,从那里开始执行IRQ异常处理程序。
需要注意的是,向量表的布局和偏移量的具体值是由系统设计和配置决定的,并且可能会根据不同的平台和硬件配置有所不同。因此,在实际系统中,需要参考具体的硬件文档和系统设计来确定向量表的布局和偏移量。
复位异常
在ARMv8-A架构中,复位异常(Reset exception)是一个特殊的异常,它在系统启动或复位时发生。复位异常的处理方式与其他异常有所不同,因为它没有一个固定的返回地址,也就是说,复位后处理器执行的地址是由硬件或软件定义的,而不是由向量表提供的。
-
复位异常处理的地址:当系统复位时,处理器从RVBAR_ELn(Reset Vector Base Address Register at ELn)中定义的地址开始执行。这里的n表示当前实现中最高的Exception Level(EL)级数。换句话说,RVBAR_ELn寄存器中存放的是复位后处理器开始执行的地址。
-
栈指针的使用:在复位异常处理期间,使用的栈指针(SP)是对应当前EL的SP_ELn,而不是SP_EL0。这意味着,如果复位发生在EL2,那么将使用SP_EL2作为栈指针。
-
与ARMv7的不同:在ARMv7架构中,复位处理程序的地址存放在向量表中。但在ARMv8-A中,这个地址存放在RVBAR_ELn寄存器中,这是一个重要的区别。
-
复位后的执

最低0.47元/天 解锁文章
1787

被折叠的 条评论
为什么被折叠?



