Uboot的bad_save_user_regs
下面是一个宏定义,从名字“bad_save_user_regs”就可以猜测它是用来保存程序“出错”时用户态的寄存器的值。 从下面的“use bad_save_user_regs for abort/prefetch/undef/swi ...” 可以知道,这些“错误”是就是发生abort、prefetch、undef、swi异常时。 为什么我把“出错”、“错误”加上引号?因为这些“错误”,有时候是故意加入的, 就是为了触发异常处理程序,从而完成某些事情,比如:系统调用就是通过swi异常实现的。 CODE: .macro bad_save_user_regs //bad_save_user_regs为宏名字 sub sp, sp, #S_FRAME_SIZE // 这个宏既然是用来“保存寄存器”的,那保存在哪呢?自然是保存在“栈”中:先令sp指针自减S_FRAME_SIZE // 这些被保存的寄存器称为“帧”,它们的总长度是S_FRAME_SIZE stmia sp, {r0 - r12} @ Calling r0-r12 // 这句话就是保存,把r0至r12保存到SP中,stmia sp中的ia表示,sp的值increase after save, //就是保存一个,就增加4个字节。所以,r0 - r12这13个寄存器就被从下到上保存在刚刚划出的大小为 //S_FRAME_SIZE的这段空间里了 // 要注意的是,这句指令执行完后,sp的值又恢复成原值,就是“sub sp, sp, #S_FRAME_SIZE”后的值 // 这小段代码,都是计算发生“abort stack”的值 ldr r2, _armboot_start // r2等于_armboot_start所指向的值,就是u-boot在内存中存放的开始地址, 就是0x33f80000 sub r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN) //0x33f80000 - (CONFIG_STACKSIZE+CFG_MALLOC_LEN): //CONFIG_STACKSIZE是正常程序运行时的栈大小,CFG_MALLOC_LEN是堆的大小 sub r2, r2, #(CFG_GBL_DATA_SIZE+8) @ set base 2 words into abort stack // CFG_GBL_DATA_SIZE是一个全局变量的大小,8:两个字,用来存放发生这些异常时的pc、cpsr寄存器 ldmia r2, {r2 - r3} @ get pc, cpsr // 把发生异常时,使用get_bad_stack保存的pc、cpsr寄存器加载到r2,r3 add r0, sp, #S_FRAME_SIZE @ restore sp_SVC // r0=原来的SP值 add r5, sp, #S_SP // 从这句指令看,原来SP之上,也是用来保存寄存器的 // S_SP等于52,表示“原来SP + 52”的地方,是保存sp寄存器 mov r1, lr // r1=lr stmia r5, {r0 - r3} @ save sp_SVC, lr_SVC, pc, cpsr // “原来SP + 52”的地方 存入 r0,即“原来的SP值”,就是sp_SVC,即被中断时的SP值 // “原来SP + 56”的地方 存入 r1,即lr,就是lr_SVC,即被中断时的lr值 // “原来SP + 60”的地方 存入 r2,即pc,就是“使用get_bad_stack保存的pc”,即被中断时的pc值 // “原来SP + 64”的地方 存入 r3,即cpsr,就是“使用get_bad_stack保存的cpsr”,即被中断时的cpsr值 // 52、56、60、64对应S_SP、S_LR、S_PC、S_PSR mov r0, sp // r0=sp .endm
http://blog.csdn.net/ltt305210390/article/details/9270181
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· MQ 如何保证数据一致性?
· 《HelloGitHub》第 108 期
· 一个基于 .NET 开源免费的异地组网和内网穿透工具