【问题标题】:cross compile an arm assembly and simulate non OS arm environment wih qemu on linux在 linux 上使用 qemu 交叉编译 arm 程序集并模拟非 OS arm 环境
【发布时间】:2018-07-09 19:52:14
【问题描述】:

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

【问题讨论】:

    标签: arm cross-compiling qemu bare-metal


    【解决方案1】:

    你想要汇编你只需要 binutils,不要在汇编上使用 C 编译器,它可能会工作,但这不会在你的嘴里留下不好的味道吗?您可能没有单独链接和/或使用 arm-non-eabi-gcc 保留股票引导程序和链接器脚本。下面的例子不关心 arm-none-eabi- vs arm-linux-gnueabi-

    Qemu uart 往往实际上并没有实现等待字符出去的时间,也不需要任何初始化,YMMV。

    内存映射

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

    所以.s

    .globl _start
    _start:
        b reset
        b hang
        b hang
        b hang
        b hang
        b hang
        b hang
        b hang
    
    hang: b hang
    
    reset:
        ldr r0,=0x101f1000
        mov r1,#0
    top:
        add r1,r1,#1
        and r1,r1,#0x07
        orr r1,r1,#0x30
        str r1,[r0]
        b top
    

    构建

    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
    

    然后 ctrl-a 然后 x 退出 qemu 控制台回到命令行。

    这将永远打印出 1234567012345670... 或直到您停止它

    另一种运行方式是

    qemu-system-arm -M versatilepb -m 128M -kernel notmain.bin
    

    然后 ctrl-alt-3 (不是 F3 而是 3) 将切换到 serial0 控制台 你可以看到输出,完成后可以关闭 qemu 控制台。

    您可以尝试其他机器。他们的外围设备当然会有所不同,架构也不同,大多数应该兼容 armv4 arm 指令或拇指指令(如果是 cortex-m)。

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

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2014-03-14
      • 2012-12-19
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多