代码之家  ›  专栏  ›  技术社区  ›  Jet Blue

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

  •  4
  • Jet Blue  · 技术社区  · 6 年前

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

    qemu-system-i386 -hda kernel.elf
    

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

    2 回复  |  直到 6 年前
        1
  •  8
  •   Ciro Santilli OurBigBook.com    6 年前

    最小可运行示例

    资料来源: 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 然后进入无限循环。

    资料来源:

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

        2
  •  4
  •   Tsyvarev    6 年前

    简单使用 -kernel 选项:

    qemu-system-i386 -kernel kernel.elf