答案 0 :(得分:1)
只需使用-kernel
选项:
qemu-system-i386 -kernel kernel.elf
答案 1 :(得分:1)
最小的可运行示例
运行方式:
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上测试。