- 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 的值,可以进行栈回溯,获取调用栈
armv7-a 异常排查
EINT2024-10-12 10:57
相关推荐
zhangzhangkeji8 小时前
笔记 24 -2 :linux 内核编译,实验举例,及编译脚本zhangzhangkeji10 小时前
笔记 23 :linux 内核基础知识,内核的目录抓不住时间的沙12 小时前
N1搭建Hexo个人博客,部署到Github躺不平的理查德1 天前
ARCH与交叉编译器的关系奔跑的架构师3 天前
[A-49]ARMv9/v8-PSCI接口规范与工作流程简介zhangzhangkeji5 天前
笔记 22 - 5a :彭老师 15章,uboot 启动,linux 挂载 nfs 文件系统,组网与启动 NFS 服务zhangzhangkeji6 天前
笔记 22 - 4a :彭老师 15章,uboot 启动,zynq zturn ,uboot 启动参数分析;QSPI 操作zhangzhangkeji8 天前
笔记 21-9 :彭老师 14章,系统移植,涉及 emmc / SD 的 uboot 命令zhangzhangkeji9 天前
笔记 21-7 :彭老师 14章,系统移植,uboot 常用命令,shell 里 $() 和 ${}zhangzhangkeji9 天前
笔记 21-5c :彭老师 14章,系统移植,TF启动卡制作,启动卡制作脚本分析