You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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调试异常的修复

  1. 指定ARM架构:启动GDB后先设置目标架构为armv7,避免寄存器显示异常:
    gdb target/armv7a-none-eabi/debug/my_custom_code.elf
    (gdb) set architecture armv7
    (gdb) target remote localhost:1234
    
  2. 验证调试功能:连接成功后,PC应指向0x8000,此时可正常设置断点、执行step/next/continue等调试命令。

三、Mini UART无输出的检查项

  1. GPIO配置正确性:
    • 确保GPIO14/15被设置为ALT5模式(对应mini UART),需正确配置GPFSEL1寄存器的第12-14位(GPIO14)和15-17位(GPIO15)为010。
    • 配置GPPUD和GPPUDCLK0寄存器禁用GPIO14/15的上拉下拉。
  2. 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位启用发送功能。
  3. QEMU控制台映射:-nographic参数已默认将mini UART绑定到终端,无需额外配置,只要初始化正确即可输出。

内容的提问来源于stack exchange,提问作者LucioleMaléfique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:03:28