entry()进入我在Elf中设置的入口点的不同地址

时间:2012-04-29 03:24:23

标签: operating-system elf osdev

最近我正在学习操作系统。我想编写一个简单的引导加载程序,它将实模式更改为保护模式,然后加载简单内核 但我无法弄清楚入口地址的问题 首先,我将引导加载程序放在OS.img(qemu)的第一个扇区中,然后内核从第二个扇区开始。
这是我的内核的readelf结果: enter image description here
入口点地址是0x800c LMA和VMA如下:
enter image description here
引导加载程序的一部分,它读取elf-type内核然后进入entry(),这是入口点地址。
enter image description here
但是,当我反汇编引导加载程序时,entry()如下: enter image description here
拨打* 0x8018,而不是* 0x800c 我不知道为什么会这样。 你能帮我吗?

1 个答案:

答案 0 :(得分:1)

call *0x8018会对存储在0x8018的地址执行调用,这是正确的,因为ELFHDR0x8000且标头中e_entry的偏移量为0x18

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

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