RT-Thread论坛
直播中

李慧

8年用户 971经验值
私信 关注
[问答]

使用qemu-vexpress-a9 运行用户程序跑不了怎么解决?

求助!!编译ART-Pi-smart中的userapps工程 https://gitee.com/createshare/ART-Pi-smart.git
,能够正常生成elf文件

然后进入官方的rt-thread库中,
https://github.com/RT-Thread/rt-thread
把userapps/root/bin 目录下的所有 elf 文件等,全部 拷贝到 qemu-vexpress-a9 的 sd.bin 镜像文件中。
然后成功编译rt-threadbspqemu-vexpress-a9的内核态.elf文件

使用./qemu-nographic.sh 模拟用户态程序的运行,显示如下

sd.bin中是有elf文件的

且它们是由ARM 架构编译的。



回帖(1)

刘杰

2025-10-13 18:15:14

在 QEMU vexpress-a9 上运行用户程序失败可能有多种原因。以下是系统性排查方案:




1. 确认文件系统挂载



  • 检查内核启动日志:观察 QEMU 启动时的输出,确认 SD 卡 (sd.bin) 是否成功挂载。日志中应有类似以下信息:
     FileSystem initialized!
    or
    mount sd0 to / success

  • 手动挂载测试
     # 在 RT-Thread 的 shell 中手动挂载
    msh /> mount sd0 /         # 尝试挂载到根目录
    msh /> ls /bin             # 查看 ELF 文件是否存在




2. 验证 ELF 文件兼容性



  • 检查 ELF 架构:使用 readelf 确认用户程序是否匹配 ARM v7 Cortex-A9:
     arm-none-eabi-readelf -h your_app.elf

    确认输出包含:


     Machine: ARM
    Flags: Version5 EABI, hard-float ABI  # 或 soft-float(需与内核匹配)

  • 内核与用户程序 ABI 一致性

    • 如果内核编译为 soft-float(常见配置),用户程序必须使用 -mfloat-abi=softfpsoft

    • 解决方案:在 userapps/ 的编译配置中添加:
      CFLAGS += -mfloat-abi=soft   # 或 softfp





3. 内核用户态支持配置


确保内核启用了关键选项(通过 menuconfig):


   # 在 qemu-vexpress-a9 BSP 目录执行
   scons --menuconfig

检查并启用:



  • RT-Thread Kernel → Enable RT-Thread userspace(必选)

  • RT-Thread Components → ELF executable format(必选)

  • POSIX layer and C standard library(若用户程序依赖 POSIX API)




4. SD 卡镜像制作验证



  • 确认文件已正确注入
     # 挂载 sd.bin 检查内容
    sudo mount -o loop sd.bin /mnt
    ls /mnt/bin                # 应看到 ELF 文件
    sudo umount /mnt

  • 文件系统类型:确保使用 FAT32 格式(RT-Thread 默认支持):
     sudo mkfs.vfat sd.bin       # 重新格式化为 FAT32




5. 用户程序加载调试



  • 手动执行测试:在 RT-Thread shell 中直接运行:
     msh /> /bin/your_app.elf    # 或 /sd/bin/your_app.elf

  • 观察错误信息

    • 若提示 "exec: file not found" → 文件路径或 ELF 格式错误。

    • 若提示 "segment fault" → 内存布局冲突(检查内核页表配置)。





6. 关键代码修改点



  • 入口程序配置:确认 applications/main.c 启动了用户程序:
     // 添加自启动命令,例如:
    system("exec /bin/your_app.elf");

  • 内存映射调整board.c):
    确保用户内存空间足够(通常需保留 64MB+):
     #define RT_HW_HEAP_END ((void*)(0x60000000 + 64 * 1024 * 1024))




7. 重新构建步骤


清理后完整重建:


   # 在 qemu-vexpress-a9 BSP 目录
   scons -c
   scons
   # 重新注入用户程序到 sd.bin
   cp userapps/root/bin/*.elf ~/sd_mount/bin/
   sync
   # 启动 QEMU
   ./qemu-nographic.sh



8. 附加调试手段



  • 开启内核 ELF 加载调试
    components/lwp/lwp_user.c 中添加日志:
     #define DBG_ENABLE
    #define DBG_LVL DBG_LOG
    #include

    重新编译内核,观察 ELF 加载过程的日志输出。


  • QEMU GDB 调试
     ./qemu-nographic.sh -s -S   # 暂停等待 GDB
    arm-none-eabi-gdb rtthread.elf
    (gdb) target remote :1234




常见问题解决:




  • 问题:ELF 执行后系统卡死

    → 用户程序堆栈溢出(增大 LWP_HEAP_SIZE 或减少程序内存占用)。




  • 问题:open: Permission denied

    → 文件系统权限问题(确认 SD 卡挂载为可读写)。




  • 问题:-1: Operation not permitted

    → 内核未启用用户态(检查 RT_USING_USERSPACE 配置)。




通过逐步验证以上环节,通常可定位并解决用户程序无法运行的问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分