1

我正在开发一个操作系统。我想asm在我的主内核elf中包含一个小程序,它可以作为第一个加载的进程。我无法让这个工作。该程序是initcode.s. 我使用Makefile从 xv6 操作系统源代码修改的以下内容来完成此任务:

initcode:
    $(AS) $(ASFLAGS) initcode.s -o initcode.o
    ld $(LDFLAGS) -N -e start -Ttext 0 -o initcode initcode.o
    objcopy --input binary --output elf32-i386 --binary-architecture i386 initcode.out initcode


kernel.elf: $(OBJECTS) initcode
    ld -T link.ld -melf_i386 $(OBJECTS) -o kernel.elf initcode

内核编译和链接很好。objcopy还创建标记,使我能够从内核代码中找到二进制文件。但是内容initcode被丢弃了。内容与汇编程序步骤中生成的内容不同initcode.out

如何initcode.s在我的 main 中的某个地方包含一个单独的二进制文件,kernel.elf并生成一些标记,以便我可以从我的内核中找到它?有什么建议么?

4

1 回答 1

1

我能想到2个简单的方法。如果您愿意,当然还有更复杂的方法。

  1. 编写一个小实用程序,将 initcode 二进制文件转换为包含 GAS 数据部分的 asm 文件(甚至是 C 文件)。然后组装该文件并将其与您的内核链接。然后,您的 initcode 将作为一个变量出现在您的内核中。

或者

  1. 在链接步骤之后,只需将 initcode 二进制文件“cat”到内核精灵的末尾即可。这个方法取决于你的加载器是否愿意支持这个。
于 2016-02-14T20:50:16.743 回答