在linux上使用qemu交叉编译arm程序集并模拟非OS arm环境

在linux上使用qemu交叉编译arm程序集并模拟非OS arm环境,arm,cross-compiling,qemu,bare-metal,Arm,Cross Compiling,Qemu,Bare Metal,目前,我正在尝试测试我编写的arm汇编代码。我在Ubuntu上工作,所以我下载了一个交叉编译器工具链(arm linux gnueabi),这样我就可以编译我的代码,然后用qemu arm测试它。但当我尝试使用arm none eabi gcc编译时,它可以编译,但不能使用qemu arm。我猜它不起作用,因为我是为裸机arm环境编译的。我的问题是如何使用qemu系统arm而不是qemu arm来模拟裸机arm环境并测试我的代码?你想要汇编,你只需要binutils,不要在汇编上使用C编译器,它

目前,我正在尝试测试我编写的arm汇编代码。我在Ubuntu上工作,所以我下载了一个交叉编译器工具链(arm linux gnueabi),这样我就可以编译我的代码,然后用qemu arm测试它。但当我尝试使用arm none eabi gcc编译时,它可以编译,但不能使用qemu arm。我猜它不起作用,因为我是为裸机arm环境编译的。我的问题是如何使用qemu系统arm而不是qemu arm来模拟裸机arm环境并测试我的代码?

你想要汇编,你只需要binutils,不要在汇编上使用C编译器,它可能会工作,但这会让你口齿不清吗?您可能没有单独链接和/或将股票引导和链接器脚本与arm non-eabi gcc分开。下面的示例并不关心arm none eabi-vs arm linux gnueabi-

Qemu UART通常不会实际实现一段时间来等待字符退出,也不需要任何初始化

记忆地图

MEMORY
{
    ram  : ORIGIN = 0x00000000, LENGTH = 32K
}
SECTIONS
{
   .text : { *(.text*) } > ram
}
那么,s

建造

然后按ctrl-a,然后按x退出qemu控制台,返回命令行

这将打印出123456701345670。。。永远或者直到你停止

另一种跑步方式是

qemu-system-arm -M versatilepb -m 128M -kernel notmain.bin
然后ctrl-alt-3(不是F3而是3)将切换到serial0控制台 您可以看到输出,完成后可以关闭qemu控制台

你还可以用其他机器进行试验。当然,它们的外围设备以及架构也会有所不同,大多数都应该与armv4 arm指令兼容,如果是cortex-m,则应该与thumb指令兼容

向其中添加C函数相当简单

arm-linux-gnueabi-as --warn --fatal-warnings -march=armv5t so.s -o so.o
arm-linux-gnueabi-ld so.o -T memmap -o notmain.elf
arm-linux-gnueabi-objdump -D notmain.elf > notmain.list
arm-linux-gnueabi-objcopy notmain.elf -O binary notmain.bin
qemu-system-arm -M versatilepb -m 128M -nographic -kernel notmain.bin
qemu-system-arm -M versatilepb -m 128M -kernel notmain.bin