CPU处理器模式与异常

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寄存器中,这是一个重要的区别。

  • 复位后的执

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值