gpt4 book ai didi

kernel - 如何在 QEMU 上运行裸机 ELF 文件?

转载 作者:行者123 更新时间:2023-12-02 06:41:44 24 4
gpt4 key购买 nike

如何在 QEMU 上运行 elf 文件?这是我最好的猜测:

qemu-system-i386 -hda kernel.elf

这个有用吗? elf文件是由此tutorial生成的内核.

最佳答案

最小可运行示例

来源: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 文件中的入口地址,并将 PC 放在那里开始。您可以使用 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'

这里我列出了一些您可能感兴趣的其他设置:How to make bare metal ARM programs and run them on QEMU?

在 Ubuntu 18.04 上测试。

关于kernel - 如何在 QEMU 上运行裸机 ELF 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49913745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com