最近我正在学习操作系统。我想写一个简单的引导加载程序,将实模式更改为保护模式,然后加载简单的内核。
但我无法弄清楚入口地址问题。
起初我将引导加载程序放在 OS.img(qemu) 的第一个扇区,然后内核从第二个扇区开始。
这是我的内核的 readelf 结果:
入口点地址是 0x800c。
而LMA和VMA如下:
bootloader的一部分,它读取elf类型的内核,然后进入entry(),也就是入口点地址。
但是,当我反汇编引导加载程序时,entry() 如下:
调用 *0x8018,而不是 *0x800c。
我不知道为什么会这样。请你帮助我好吗?
问问题
508 次
1 回答
1
call *0x8018
执行对存储在的地址的调用0x8018
,这是正确的,因为标头中的ELFHDR
is0x8000
和偏移量是.e_entry
0x18
真正的问题在于将段加载到内存中的方式。每个段都应该p_vaddr
从文件偏移地址加载p_offset
。请注意,在您的情况下p_vaddr
,0x8000
您将 elf 标头加载到内存中的同一位置,这就是ELFHDR->e_entry
被覆盖的原因。最简单的解决方案是在不同的地址加载 elf 标头。
资料来源:http ://www.skyfree.org/linux/references/ELF_Format.pdf
于 2012-04-29T20:42:27.053 回答