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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在QEMU上运行裸机ELF文件?相关的知识,希望对你有一定的参考价值。

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

qemu-system-i386 -hda kernel.elf

这有用吗? elf文件是从这个tutorial生成的内核。

答案

只需使用-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 != '') {         /* Loop until end of string */
         *UART0DR = (unsigned int)(*s); /* Transmit char */
          s++;                  /* Next char */
    }
}

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

==> 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上测试过。

以上是关于如何在QEMU上运行裸机ELF文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何编译一个简单的multiboot2裸机可执行文件?

如何让qemu产生外部中断并跳转到isr(裸机代码)

ucore lab1 练习4—bootloader加载ELF格式OS

Intel Galileo 裸机 UART

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

如何编写不依赖操作系统的程序。就是裸机上可以运行的。汇编或c语言生成文件都是exe啊只能在win下