【问题标题】:entry() get into the different address from the entry point I set in the Elfentry() 从我在 Elf 中设置的入口点进入不同的地址
【发布时间】:2012-05-09 07:29:48
【问题描述】:

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

bootloader的一部分,读取elf型内核,然后进入entry(),即入口点地址。

但是,当我反汇编引导加载程序时,entry() 如下:
调用 *0x8018,而不是 *0x800c。
我不知道为什么会这样。 你能帮帮我吗?

【问题讨论】:

  • 请提供文字而不是图片。

标签: operating-system elf osdev


【解决方案1】:

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

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

【讨论】:

  • bootloader asm代码没有问题。它是正确生成的。就像我说的,ELFHDR->e_entry 的值存储在地址0x8018。这就是为什么要调用地址存储在0x8018 的函数,这就是call *0x8018 所做的。 (注意,它是call *0x8018,而不是call 0x8018)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 2011-01-12
  • 2017-11-18
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多