Как запустить файл ELF с голым металлом на QEMU?

Как вы запускаете файл эльфа в QEMU? Это мое лучшее предположение:

qemu-system-i386 -hda kernel.elf

Это работает? Файл elf - это ядро, сгенерированное из этого руководства.

2 ответа

Решение

Просто использовать -kernel опция:

qemu-system-i386 -kernel kernel.elf

Минимальный работоспособный пример

Источник: https://github.com/cirosantilli/aarch64-bare-metal-qemu/tree/27537fb1dd0c27d6d91516bf4fc7e1d9564f5a40

Бежать с:

make
qemu-system-aarch64 -M virt -cpu cortex-a57 -nographic -kernel test64.elf -serial mon:stdio

Результат: печатает один символ H в UART, а затем идет в бесконечный цикл.

Источник:

==> test64.ld <==
ENTRY(_Reset)
SECTIONS
{
    . = 0x40000000;
    .startup . : { startup64.o(.text) }
    .text : { *(.text) }
    .data : { *(.data) }
    .bss : { *(.bss COMMON) }
    . = ALIGN(8);
    . = . + 0x1000; /* 4kB of stack memory */
    stack_top = .;
}

==> test64.c <==
volatile unsigned int * const UART0DR = (unsigned int *) 0x09000000;

void print_uart0(const char *s) {
    while(*s != '\0') {         /* Loop until end of string */
         *UART0DR = (unsigned int)(*s); /* Transmit char */
          s++;                  /* Next char */
    }
}

void c_entry() {
     print_uart0("Hello world!\n");
}

==> startup64.s <==
.global _Reset
_Reset:
    mov x0, 0x48
    ldr x1, =0x09000000
    str x0, [x1]
    b .

==> Makefile <==
CROSS_PREFIX=aarch64-linux-gnu-

all: test64.elf

startup64.o: startup64.s
    $(CROSS_PREFIX)as -g -c $< -o $@

test64.elf: startup64.o
    $(CROSS_PREFIX)ld -Ttest64.ld $^ -o $@

clean:
    rm -f test64.elf startup64.o test64.o

Вы можете изменить адрес входа 0x40000000 почти что-либо (пока это не сопоставлено с памятью какого-либо устройства?).

QEMU просто анализирует адрес входа из файла Elf и помещает туда ПК для начала. Вы можете проверить это с помощью GDB:

qemu-system-aarch64 -M virt -cpu cortex-a57 -nographic -kernel test64.elf -S -s &
gdb-multiarch -q -ex 'file test64.elf' -ex 'target remote localhost:1234'

Здесь я перечисляю несколько других настроек, которые могут быть интересны: Как создавать голые металлические ARM-программы и запускать их в QEMU?

Проверено на Ubuntu 18.04.

Другие вопросы по тегам