armv7-a 异常排查

  • dfsr: data fault status register
    • 发生异常时,该寄存器能够表示引起异常的原因,如非对齐访问、mmu translation fault 等等
    • 读取 dfsr 到 r[x] 寄存器 :mrc p15,0,r[x],c5,c0,0
  • dfar: data fault address register
    • 保存了引起 data abort 异常的地址(VA 虚拟地址)
    • 读取 dfar 到 r[x] 寄存器:mrc p15,0,r[x],c6,c0,0
  • cpsr: Current Program Status Register
    • 用于保存 保存处理器状态和控制信息
    • 在特权模式下 (除了 user 模式),可以通过使用 cps 指令修改 cpsr 寄存器的 M[4:0],让处理器处于不同的模式
    • 读取 cpsr到 r[x] 寄存器中:mrs r[x], cpsr
  • spsr: Saved Program Status Registers
    • 发生异常时,cpsr 会被复制到 spsr,然后 cpsr 寄存器的中相关字段更新为异常模式
    • 可通过该寄存器得知异常前的工作模式
    • 读取 spsr 到 r[x] 寄存器中:mrs r[x], spsr
  • pc
    • 对于 cortex-a,同步异常与异步异常均不会自动保存任何寄存器到 异常前上下文的栈中
    • 此时 lr 会被设置为 pc + 8
    • 异常的那条 pc = lr - 8 (此时的 lr 为异常模式的 lr)
    • 根据 pc 可以定位到具体执行了那条指令产生了异常
  • lr
    • 异常时,处理器会自动切换状态
    • 此时 lr 的值也会随着切换到异常模式下的 lr
    • 如果想要恢复异常前的 lr,则需要根据 spsr 得知异常前的工作模式,然后强行切换到那个模式,把 lr 恢复回来
    • 切换模式使用 cps 指令操作 cpsr 寄存器
  • sp
    • 与 lr 同理,切模式将异常上下文的 sp 恢复回来
    • 得知 sp 的值,可以进行栈回溯,获取调用栈
相关推荐
Stone.Wu5 天前
快速理解ARM Cortex-M流水线:指令执行过程通俗解释
arm
我在人间贩卖青春5 天前
汇编之分支跳转指令
汇编·arm·分支跳转
我在人间贩卖青春5 天前
汇编之加载存储指令
汇编·arm·寄存器加载存储
我在人间贩卖青春5 天前
汇编之状态寄存器访问指令
汇编·arm·状态寄存器
我在人间贩卖青春5 天前
汇编之软中断指令和协处理指令
汇编·arm·软中断·协处理
我在人间贩卖青春5 天前
汇编之数据处理指令
汇编·arm·数据处理指令
fly的fly8 天前
浅析 QT远程部署及debug方案
qt·物联网·arm
切糕师学AI10 天前
ARM标准汇编(armasm)中的标号(Label)
汇编·arm
CHENG-JustDoIt11 天前
嵌入式开发 | ARM Cortex-M 系列中M3、M4、M23 和 M33四款处理器的深度对比分析
arm开发·单片机·嵌入式硬件·arm
toradexsh19 天前
在NXP iMX8QM上使用 Jailhouse
arm·nxp·toradex·imx8mp·jailhouse