Raspberry Pi Zero 2 W裸机程序两条mov指令顺序不同导致崩溃?
问题原因排查
- 核心原因:启动代码存在r5/r6寄存器的未初始化依赖
你使用的裸机工程的start.S文件中,在你插入代码的位置之后,存在直接使用r5或r6寄存器的逻辑,没有提前做初始化赋值,默认依赖芯片上电或者GPU加载内核后这两个寄存器的初始值。比如原代码可能直接用r5作为GPIO外设的基地址访问寄存器,你先给r5赋值为0x5会导致后续访问0x5这个非法内存地址,触发数据中止异常直接崩溃;而交换指令顺序后,r6被赋值为0x3、r5被赋值为0x5刚好符合原代码对这两个寄存器的初始值预期,因此可以正常运行。你可以直接查看start.S中插入代码位置的后续逻辑,确认是否有未初始化就使用r5、r6的指令。 - 次要可能:指令对齐异常
如果你编译时使用Thumb指令集,不同顺序的mov指令可能存在16位和32位的宽度差异,导致后续跳转目标地址的最低位被意外修改——ARM架构下跳转切换指令集时,目标地址最低位为1代表Thumb状态,为0代表ARM状态,位值错误会触发未定义指令异常。你可以在编译参数中添加-marm强制使用32位对齐的ARM指令集,或者在_start标签后添加.align 2指令强制4字节对齐验证问题是否复现。 - 其他可能:链接地址偏移问题
如果你的链接脚本对代码段起始地址、中断向量表位置有硬编码要求,插入代码后修改了main函数、中断向量表等关键标号的地址偏移,指令顺序不同时可能导致关键地址不满足外设访问的对齐要求(比如GPIO寄存器必须4字节对齐访问),触发总线错误。你可以通过arm-none-eabi-objdump -D kernel.elf反汇编两种情况的固件,对比符号地址差异即可确认。
内容的提问来源于stack exchange,提问作者Pierrick Monchoix
相关产品推荐
相关产品推荐

