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

Operating system entry()进入与我在Elf中设置的入口点不同的地址,operating-system,elf,osdev,Operating System,Elf,Osdev,最近我在学习操作系统。我想编写一个简单的引导加载程序,它将实际模式更改为保护模式,然后加载简单内核。 但我无法解决入口地址问题。 首先,我将引导加载程序放在OS.img(qemu)的第一个扇区,然后内核从第二个扇区开始。 下面是我的内核的readelf结果: 入口点地址为0x800c。 LMA和VMA如下: 引导加载程序的一部分,它读取elf类型内核,然后进入entry(),这是入口点地址。 但是,当我反汇编引导加载程序时,条目()如下所示: 呼叫*0x8018,而不是*0x800c。

最近我在学习操作系统。我想编写一个简单的引导加载程序,它将实际模式更改为保护模式,然后加载简单内核。
但我无法解决入口地址问题。
首先,我将引导加载程序放在OS.img(qemu)的第一个扇区,然后内核从第二个扇区开始。
下面是我的内核的readelf结果:
入口点地址为0x800c。
LMA和VMA如下:

引导加载程序的一部分,它读取elf类型内核,然后进入entry(),这是入口点地址。

但是,当我反汇编引导加载程序时,条目()如下所示:
呼叫*0x8018,而不是*0x800c。
我不知道为什么会这样。
您能帮助我吗?

call*0x8018
执行对存储在
0x8018
的地址的调用,这是正确的,因为
ELFHDR
0x8000
,而头中
e_条目的偏移量是
0x18

真正的问题在于将段加载到内存中的方式。每个段应从文件偏移量
p\u偏移量
加载到地址
p\u vaddr
。请注意,在您的示例中,
p_vaddr
0x8000
,这与加载elf头的内存中的位置相同,这就是为什么
ELFHDR->e_条目
被覆盖的原因。最简单的解决方案是在不同的地址加载elf头


来源:

call*0x8018
执行对存储在
0x8018
的地址的调用,这是正确的,因为
ELFHDR
0x8000
,而头中
e_条目的偏移量是
0x18

真正的问题在于将段加载到内存中的方式。每个段应从文件偏移量
p\u偏移量
加载到地址
p\u vaddr
。请注意,在您的示例中,
p_vaddr
0x8000
,这与加载elf头的内存中的位置相同,这就是为什么
ELFHDR->e_条目
被覆盖的原因。最简单的解决方案是在不同的地址加载elf头


来源:

引导加载程序asm代码没有问题。它是正确生成的。正如我所说,
ELFHDR->e_entry
的值存储在地址
0x8018
处。这就是为什么要调用存储在
0x8018
的地址的函数,这就是
call*0x8018
所做的。(注意,它是
调用*0x8018
,而不是
调用0x8018
)。引导加载程序asm代码没有问题。它是正确生成的。正如我所说,
ELFHDR->e_entry
的值存储在地址
0x8018
处。这就是为什么要调用存储在
0x8018
的地址的函数,这就是
call*0x8018
所做的。(请注意,它是
call*0x8018
,而不是
call 0x8018
)。请提供文本而不是图像。请提供文本而不是图像。