ARMv8 相较于 ARMv7,在整体架构上有了较大的变化,ARMv8 实现了 4 个异常等级EL0~EL3,EL0 运行用户态程序,EL1运行 Guest OS,EL2运行 hypervisor,EL3 运行 secure monitor 程序。 EL0、EL1 是 ARM 芯片必须实现的异常级别,EL2、EL3 异常级别是可选的 另外还有个安全世界,EL1、EL2 可以通过 smc 指令切...
ESR_ELx (exception Syndrome register )异常综合寄存器/异常状态寄存器 : 反应异常的原因等信息 该寄存器只有ELR_EL1 ELR_EL2 ELR_EL3, 没用ELR_EL0. 例如:s 16bit指令的异常、32bit指令的异常、simd浮点运算的异常、MSR/MRS的异常… FAR_ELx (Fault Address Register) 错误的地址寄存器 当取指令或取数据...
kernel_entry保存完第一现场之后,接下来读取esr_el1寄存器的值,并判断异常的具体类型。如2.3.5章节所描述的ESR寄存器定义,ESR包含的异常信息主要用于异常处理程序确定异常原因,其中ESR_ELn的BIT[31:26] EC域指示处理程序执行的对应异常类型。 发生DataAbort时,EC = 0b100101,即ESR_ELx_EC_DABT_CUR=0x25,el1_...
ventry el1_error_invalid // Error EL1t ventry el1_sync // Synchronous EL1h。以el1级发生同步异常为例,具体分析内核异常处理过程 ventry el1_irq // IRQ EL1h ventry el1_fiq_invalid // FIQ EL1h ventry el1_error_invalid // Error EL1h ventry el0_sync // Synchronous 64-bit EL0 ventry e...
ELR_EL1,用于EL1的异常。 如果实现了EL2,ELR_EL2用于EL2的异常。 如果实现了EL3,ELR_EL3用于EL3的异常。 (5)ESR(Exception Syndrome Register) 异常综合表征寄存器ESR_ELn包含的异常信息用以异常处理程序确定异常原因。仅针对同步异常和SError进行更新。因为IRQ或FIQ中断处理程序从通用中断控制器(GIC)寄存器的信息...
PSTATE寄存器里的DAIF域都设置为1,相当于把调试异常、系统错误(SError)、 IRQ中断以及FIQ中断都关闭了。 更新了ESR_ELx寄存器,里面包含了同步异常发生的原因 SP执行SP_ELx。 切换到对应的EL,然后跳转到异常向量表里执行。 当异常发生后,操作系统需要做哪些事情?
对于同步异常和 SError,将异常原因写入 ESR_ELx 对于与地址相关的异常,将出错的地址写入 FAR_ELx 异常处理完成后,基本就是上述的逆操作,总体如下图所示: 上述描述有一个小问题,异常处理通常都是在更高级别或者同级别处理(EL0 不能处理异常),那这个更高级别指的是哪个级别,有多高?
kernel_entry el, \regsize //kernel_entry是宏,主要完毕寄存器压栈操作。 mov x0,sp //x0,x1,x2是传给函数bad_mode函数的參数。 sp是当前栈指针。 mov x1,#\reason //x1是发生异常的原因,用于读取一个结构体。在函数bad_mode中会介绍 mrs x2,esr_el1 //通过分析bad_mode及其它函数。确定esr_el1...
当异常发生时,我们可以从ESR_ELn寄存器中获取对应的异常状态。 Bits[31:26] 用来确定异常的类型,Exception class Bit[25]: 用来确定异常指令的长度,0代表16位异常指令,1代表32位异常 Bits[24:0]: 用来确定具体的异常,每种异常类型独立定义此字段 比如: ...
EL1:系统特权,通常用于操作系统内核,比如linux、rtos。如果系统使能了虚拟化扩展,运行虚拟机操作系统内核。 EL2:运行虚拟化扩展的虚拟机监控器(hypervisor)。 EL3:运行安全世界中的安全监控器(secure monitor)。 ARMv8允许切换应用程序的运行模式,在一个64位操作系统的ARMv8处理器中,我们可以同时运行A64指令集和A32...