




在 QEMU vexpress-a9 上运行用户程序失败可能有多种原因。以下是系统性排查方案:
sd.bin) 是否成功挂载。日志中应有类似以下信息: FileSystem initialized!
or
mount sd0 to / success # 在 RT-Thread 的 shell 中手动挂载
msh /> mount sd0 / # 尝试挂载到根目录
msh /> ls /bin # 查看 ELF 文件是否存在readelf 确认用户程序是否匹配 ARM v7 Cortex-A9: arm-none-eabi-readelf -h your_app.elf确认输出包含:
Machine: ARM
Flags: Version5 EABI, hard-float ABI # 或 soft-float(需与内核匹配)-mfloat-abi=softfp 或 soft。userapps/ 的编译配置中添加:CFLAGS += -mfloat-abi=soft # 或 softfp确保内核启用了关键选项(通过 menuconfig):
# 在 qemu-vexpress-a9 BSP 目录执行
scons --menuconfig检查并启用:
# 挂载 sd.bin 检查内容
sudo mount -o loop sd.bin /mnt
ls /mnt/bin # 应看到 ELF 文件
sudo umount /mnt sudo mkfs.vfat sd.bin # 重新格式化为 FAT32 msh /> /bin/your_app.elf # 或 /sd/bin/your_app.elf"exec: file not found" → 文件路径或 ELF 格式错误。"segment fault" → 内存布局冲突(检查内核页表配置)。applications/main.c 启动了用户程序: // 添加自启动命令,例如:
system("exec /bin/your_app.elf");board.c): #define RT_HW_HEAP_END ((void*)(0x60000000 + 64 * 1024 * 1024))清理后完整重建:
# 在 qemu-vexpress-a9 BSP 目录
scons -c
scons
# 重新注入用户程序到 sd.bin
cp userapps/root/bin/*.elf ~/sd_mount/bin/
sync
# 启动 QEMU
./qemu-nographic.shcomponents/lwp/lwp_user.c 中添加日志: #define DBG_ENABLE
#define DBG_LVL DBG_LOG
#include 重新编译内核,观察 ELF 加载过程的日志输出。
./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 配置)。
通过逐步验证以上环节,通常可定位并解决用户程序无法运行的问题。
举报
更多回帖