Qemu模拟树莓派GDB调试:Rust裸机代码为何从0x0000而非0x8000启动?
树莓派2裸机Rust程序调试与输出问题解决
一、程序指针停在0x0000的原因及修复
QEMU的raspi2b机器使用-kernel参数时,默认按照Linux内核镜像格式(如zImage)解析加载,你的裸机二进制文件缺少内核头部,导致QEMU无法正确加载到0x8000,最终PC停在ARM复位地址0x0000。
修正QEMU启动命令:改用-device loader直接指定加载地址,替代-kernel:
qemu-system-arm -M raspi2b -nographic -s -S -device loader,file=target/binary/my_custom_code.img,addr=0x8000
如果你的代码未在0x0000放置异常向量表,需额外添加跳转指令让复位后跳转到0x8000:
qemu-system-arm -M raspi2b -nographic -s -S \ -device loader,file=target/binary/my_custom_code.img,addr=0x8000 \ -device loader,addr=0x0,data=0xEA00001F,data-len=4
(0xEA00001F是ARM指令b 0x8000的机器码)
二、GDB调试异常的修复
- 指定ARM架构:启动GDB后先设置目标架构为armv7,避免寄存器显示异常:
gdb target/armv7a-none-eabi/debug/my_custom_code.elf (gdb) set architecture armv7 (gdb) target remote localhost:1234 - 验证调试功能:连接成功后,PC应指向0x8000,此时可正常设置断点、执行
step/next/continue等调试命令。
三、Mini UART无输出的检查项
- GPIO配置正确性:
- 确保GPIO14/15被设置为ALT5模式(对应mini UART),需正确配置
GPFSEL1寄存器的第12-14位(GPIO14)和15-17位(GPIO15)为010。 - 配置
GPPUD和GPPUDCLK0寄存器禁用GPIO14/15的上拉下拉。
- 确保GPIO14/15被设置为ALT5模式(对应mini UART),需正确配置
- Mini UART初始化:
- 写入
AUX_ENABLES寄存器(地址0x20215004)启用mini UART(置位第0位)。 - 设置波特率:
AUX_MU_BAUD=(250000000 / (16 * 波特率)) - 1,例如115200波特对应值为130。 - 配置
AUX_MU_LCR_REG为0x3(8位数据位,无校验)。 - 写入
AUX_MU_CNTL_REG置位第0位启用发送功能。
- 写入
- QEMU控制台映射:
-nographic参数已默认将mini UART绑定到终端,无需额外配置,只要初始化正确即可输出。
内容的提问来源于stack exchange,提问作者LucioleMaléfique
相关产品推荐
相关产品推荐

