最近我正在学习操作系统。我想编写一个简单的引导加载程序,它将实模式更改为保护模式,然后加载简单内核
但我无法弄清楚入口地址的问题
首先,我将引导加载程序放在OS.img(qemu)的第一个扇区中,然后内核从第二个扇区开始。
这是我的内核的readelf结果:
入口点地址是0x800c
LMA和VMA如下:
引导加载程序的一部分,它读取elf-type内核然后进入entry(),这是入口点地址。
但是,当我反汇编引导加载程序时,entry()如下:
拨打* 0x8018,而不是* 0x800c
我不知道为什么会这样。
你能帮我吗?
答案 0 :(得分:1)
call *0x8018
会对存储在0x8018
的地址执行调用,这是正确的,因为ELFHDR
为0x8000
且标头中e_entry
的偏移量为0x18
。
真正的问题在于您将片段加载到内存中的方式。应从文件偏移p_vaddr
的地址p_offset
加载每个段。请注意,在您的情况下p_vaddr
是0x8000
,内存中加载elf标头的位置相同,这就是ELFHDR->e_entry
被覆盖的原因。最简单的解决方案是在不同的地址加载elf标头。