BIT[5:0] DFSC(Data Fault Status Code)解释了data abort发生的状态信息: ![]() *其他bit位解释可以参考ARM v8手册 4.异常入口 每个异常都有特定的异常级别。异常所对应的异常级别是由软件编程决定,或者由异常自身性质决定的。在任何情况下,异常执行时都不会移至较低的异常级别。异常入口的基本执行内容是:
二、异常处理流程 1.异常向量表 当发生异常时,处理器必须执行与之对应的处理程序。处理程序在内存中的存储位置称为异常向量。在ARM体系结构中,异常向量存储在一个表中,该表称为异常向量表。每个异常级别都有其自己的向量表,即EL3,EL2和EL1都有一个,该表包含要执行的指令。 每个表占128个字节,可以保存32条指令(arm64的指令长度也是4字节),以linux kernel-4.19/arch/arm64/kernel/entry.S为例,异常向量表的入口如下图,一共有4组16个表: ![]() 用另外一张表可以更好理解这个异常向量表的入口: ![]() 比如当前代码运行在内核空间,发生了data abort,异常向量表的入口地址就是0x200。 2.kernel_ventry 异常发生后,处理器从对应的异常向量表入口地址开始执行,第一条指令是kernel_ventry。kernel_ventry是一个宏定义,先检查栈空间是否有溢出,然后跳转到指定的异常处理标签。 ![]() 以下以EL1发生data abort异常为例介绍异常处理流程。 EL1发生data abort异常后进入对应的异常向量表入口,先检查栈是否有溢出,然后跳转至:el1_sync(data abort属于同步异常)。 ![]() 3.elx_sync (1)保存现场 el1_sync第一条指令执行kernel_entry 1。kernel_entry也是一个宏定义,首先将CPU寄存器保存到栈空间,因为这些寄存器接下来会被覆盖使用。为了保证kernel_exit时能恢复准确的现场,这里有必要对第一现场先做保存。 ![]()
|