перекрестная компиляция сборки руки и имитация среды руки без ОС с помощью qemu в Linux

В настоящее время я пытаюсь протестировать код сборки руки, который я написал. Я работаю над Ubuntu, поэтому скачал цепочку инструментов кросс-компилятора (arm-linux-gnueabi), чтобы скомпилировать свой код, а затем протестировать его с помощью qemu-arm. Но когда я пытаюсь скомпилировать с помощью arm-none-eabi-gcc, он компилируется, но не работает с qemu-arm. Я предполагаю, что это не работает, потому что я компилирую для голой металлической среды. Мой вопрос заключается в том, как я могу использовать qemu-system-arm вместо qemu-arm для имитации среды с голой металлической рукой и тестирования моего кода?


person E.Bil    schedule 30.01.2018    source источник


Ответы (1)


Вам нужна сборка, вам нужен только binutils, не используйте компилятор C для сборки, он может работать, но разве это не оставляет неприятный привкус во рту? Вероятно, вы не скомпоновали отдельно и/или оставили стандартный скрипт начальной загрузки и компоновщика с помощью arm-non-eabi-gcc. Пример ниже не заботится о arm-none-eabi- vs arm-linux-gnueabi-

Уарты Qemu, как правило, фактически не реализуют количество времени ожидания выхода символа и не требуют никакой инициализации, YMMV.

карта памяти

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

so.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, либо с инструкциями большого пальца, если это cortex-m.

Добавить функции C к этому довольно просто.

person old_timer    schedule 01.02.2018