博主您好,有幸在论坛搜到您一篇博客。「Arm Arch」 安全微架构,里面描述的问题正好我也碰到了,报错如下,但是不太清楚怎么分析,可否请博主指导一下呢?
Unhandled Exception in EL3.
x30 = 0x0000000000b99b84
x0 = 0x00000000304c25b0
x1 = 0x0000ffffa20a0040
x2 = 0x000000000000ff70
x3 = 0x00000000304c25b0
x4 = 0x0000ffffa20b0000
x5 = 0x00000000304d25b0
x6 = 0x0000000000000000
x7 = 0x0000000000000000
x8 = 0x0000000000000000
x9 = 0x0000000000000000
x10 = 0x0000000000000000
x11 = 0x0000000000000000
x12 = 0x0000000000000000
x13 = 0x0000000000000000
x14 = 0x0000000000000000
x15 = 0x0000000000000000
x16 = 0x0000000000426000
x17 = 0x0000ffffa2132dd0
x18 = 0x0000000000000010
这里主要将发生问题时的相关的寄存器 dump 出来,包括通用寄存器 x0 ~ x29,EL3/EL1 模式下的控制寄存器和状态寄存器以及 GIC 相关寄存器。
首先我们要了解 EL3 模式是系统里最高的运行模式,EL1 模式(linux 内核运行的模式)发生的严重异常会陷入到 EL3 模式中,这些异常包括内存非法访问、指令非法访问等。
1 ESR 寄存器分析
在生发问题时,EL3 的错误状态寄存器 ESR_EL3 会报告异常的类型等信息,这个寄存器也是异常症状诊断的寄存器,我们先看看这个寄存器的格式:
里面 EC(31:26) 域是错误代码, 这个案例里 esr_el3 为 0xbe000011,对应的值为 0b101111(0x2f),对应值解释为:
即发生了 SError,需要看 ISS 部分的编码来具体分析。SError 是系统错误的意思,通常是发生了异步异常,通常来自 external aborts。那我们继续看 ISS[24:0],我们这里 ISS 值为 0x11。
由上图不难发现,系统是发生了异步异常,异步通常是说异常同步在错误发生的同时抛出的,而是有一段延迟,比如在关闭中断情况下发生的 data abort,就会在开启中断后触发,表现为异步异常。所以,ESR_EL3 寄存器给我提供的信息就是这些。
2 SError
通常有三种类型的 SError:
内存访问经过 MMU 检查,但是在内存总线上遇到了问题。可能是内存映射错误,访问了不存在的地址
内存或者 cache 的 ECC 校验失败,通常是硬件问题
将 cache 中的脏数据写回到外存中
3 错误返回地址
通过 elr_el3 = 0x0000000000b99d84 可以看出,EL1 发生问题的程序地址为 0x0000000000b99d84,我们也能看到不同 cpu dump 出来的信息是一致的,这个地址需要将 Linux 内核反汇编来查看在哪里。
4 错误访问地址
FAR_EL3 记录了发生同步异常时,访问的数据或者指令的虚拟地址。但是由于这里发生的是异步异常,所以没有参考价值
建议
1.再截取更早的错误日志
2.查找内核中关于内存映射部分的修改