armv7-a 异常排查

  • dfsr: data fault status register
    • 发生异常时,该寄存器能够表示引起异常的原因,如非对齐访问、mmu translation fault 等等
    • 读取 dfsr 到 rx 寄存器 :mrc p15,0,rx,c5,c0,0
  • dfar: data fault address register
    • 保存了引起 data abort 异常的地址(VA 虚拟地址)
    • 读取 dfar 到 rx 寄存器:mrc p15,0,rx,c6,c0,0
  • cpsr: Current Program Status Register
    • 用于保存 保存处理器状态和控制信息
    • 在特权模式下 (除了 user 模式),可以通过使用 cps 指令修改 cpsr 寄存器的 M4:0,让处理器处于不同的模式
    • 读取 cpsr到 rx 寄存器中:mrs rx, cpsr
  • spsr: Saved Program Status Registers
    • 发生异常时,cpsr 会被复制到 spsr,然后 cpsr 寄存器的中相关字段更新为异常模式
    • 可通过该寄存器得知异常前的工作模式
    • 读取 spsr 到 rx 寄存器中:mrs rx, 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 的值,可以进行栈回溯,获取调用栈
相关推荐
T1mzhou14 小时前
ARM64 Linux 6.10 内核驱动(12):dd.c:probe/ remove、延迟 probe
linux·服务器·c语言·arm开发·arm
T1mzhou18 小时前
ARM64 平台安全学习记录
linux·服务器·arm开发·arm
zhangzhangkeji1 天前
stm32 3-4 : 按键控制 LED,光敏传感器控制蜂鸣器
stm32·arm
zhangzhangkeji2 天前
stm32 ,3-2:led 闪烁、流水灯、蜂鸣器
stm32·arm
zhangzhangkeji2 天前
stm32 笔记 - 3-1:GPIO 输出
stm32·arm
零依赖极客2 天前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm
奔跑的架构师2 天前
[A-50]ARMv9/v8-DVFS系统架构
linux·arm开发·架构·系统架构·arm
zhangzhangkeji3 天前
stm32 笔记 - 2:库函数方式的初始化,项目的文件结构
stm32·arm
zhangzhangkeji3 天前
stm32 笔记 - 1:, 环境与项目搭建, 寄存器方式点灯
arm
T1mzhou4 天前
ARM64 Linux 6.10 内核驱动(13):bus.c / driver.c 总线两张表,驱动怎么挂上去
linux·服务器·c语言·arm开发·arm