「Arm Arch」 安全微架构 问题分析咨询

博主您好,有幸在论坛搜到您一篇博客。「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(3126) 域是错误代码, 这个案例里 esr_el3 为 0xbe000011,对应的值为 0b1011110x2f),对应值解释为:
       即发生了 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.查找内核中关于内存映射部分的修改
​