1

最近我正在学习操作系统。我想写一个简单的引导加载程序,将实模式更改为保护模式,然后加载简单的内核。
但我无法弄清楚入口地址问题。
起初我将引导加载程序放在 OS.img(qemu) 的第一个扇区,然后内核从第二个扇区开始。
这是我的内核的 readelf 结果: 在此处输入图像描述
入口点地址是 0x800c。
而LMA和VMA如下:
在此处输入图像描述
bootloader的一部分,它读取elf类型的内核,然后进入entry(),也就是入口点地址。
在此处输入图像描述
但是,当我反汇编引导加载程序时,entry() 如下: 在此处输入图像描述
调用 *0x8018,而不是 *0x800c。
我不知道为什么会这样。请你帮助我好吗?

4

1 回答 1

1

call *0x8018执行对存储在的地址的调用0x8018,这是正确的,因为标头中的ELFHDRis0x8000和偏移量是.e_entry0x18

真正的问题在于将段加载到内存中的方式。每个段都应该p_vaddr从文件偏移地址加载p_offset。请注意,在您的情况下p_vaddr0x8000您将 elf 标头加载到内存中的同一位置,这就是ELFHDR->e_entry被覆盖的原因。最简单的解决方案是在不同的地址加载 elf 标头。

资料来源:http ://www.skyfree.org/linux/references/ELF_Format.pdf

于 2012-04-29T20:42:27.053 回答