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 的值,可以进行栈回溯,获取调用栈
相关推荐
zz_lzh4 天前
arm版AI牛马:armbian(rk3588)设备部署openclaw
arm开发·人工智能·arm
v_JULY_v6 天前
ARM——用于长时序操作的优势奖励建模:采用三态标注策略(前进/后退/停滞),实现对相对优势的估计(含SARM详解)
arm·优势奖励建模·三态标注策略·相对优势的估计·sarm·阶段感知奖励建模·ra-bc
徐某人..7 天前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
程序员黄老师8 天前
一分钟了解ARM发展史与全系列产品
arm开发·嵌入式硬件·arm
同勉共进9 天前
并发编程系列(二)—— store, load 与 RMW
c++·arm·并发编程·x86·store·load·rmw
誰能久伴不乏12 天前
SPI总线通信协议基础与ICM20607传感器驱动开发指南
arm开发·c++·驱动开发·嵌入式硬件·arm
Mike_detailing12 天前
资源分享:VMware-Fusion-25H2u1 和 arm版本win11
macos·arm·虚拟机
独小乐17 天前
019.ADC转换和子中断|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·mcu·arm
独小乐19 天前
018.使用I2C总线EEPROM|千篇笔记实现嵌入式全栈/裸机篇
linux·笔记·单片机·嵌入式硬件·arm·信息与通信
咸鱼不用加盐20 天前
HC32F460 USB CDC通信异常:非对齐访问异常排查
单片机·arm·c·cm4