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
)。请提供文本而不是图像。请提供文本而不是图像。