【问题标题】:How does GRUB load the kernel at 0x100000GRUB 如何在 0x100000 加载内核
【发布时间】:2017-08-28 18:03:49
【问题描述】:

我正在从头开始编写引导加载程序和内核,我的目标是创建一个可以由 GRUB 和我的引导加载程序加载的内核。不过,问题不在于内核。我不知道如何在 grub 加载内核的 0x100000 处加载内核。 0x100000 不够小,无法放入 16 位寄存器,并且太大而无法使用分段(使用 BIOS 中断读取磁盘时使用地址缓冲区 es:bx)。

所以我的问题是,GRUB 是如何将内核加载到内存中的?

【问题讨论】:

  • 我不知道 GRUB 是怎么做到的,但你可以在虚幻模式下轻松做到
  • 难道我不需要编写磁盘驱动程序吗?
  • 您可以在该模式下使用 BIOS 中断,因此没有问题。这只是具有巨大分段限制的实模式。
  • Harold 是正确的,您可以使用unreal mode,它允许您在不处于保护模式的情况下潜在地寻址所有 4gb 内存。在OSDev Wik 上有一个进入大型虚幻模式的示例。您将能够在内存访问中使用 32 位寄存器。问题是 BIOS 磁盘读取例程使用 Segment:offset,因此您必须将扇区加载到前 1mb,然后将它们复制到 0x100000 及以上(使用类似指令movsb 将工作
  • 是的,处于虚幻模式不会改变跳转到保护模式或 64 位长模式的过程

标签: x86-64 grub2


【解决方案1】:

我正在通过 Little Os Book 构建内核,据我所知,内核加载在 1MB 地址,因为它是在链接描述文件中指定的。

您可以查看本书here,阅读链接内核部分

【讨论】:

  • 虽然这是一个答案,但它并没有回答 OP 提出的问题。 OP 想知道引导加载程序(如 GRUB)如何寻址 1MiB 以上的内存,因为实模式仅限于访问前 1MiB+64KiB-16 字节。
猜你喜欢
  • 2020-07-01
  • 2016-08-19
  • 1970-01-01
  • 2014-11-14
  • 2020-12-08
  • 2010-09-17
  • 2020-10-11
  • 2012-08-02
  • 2023-04-09
相关资源
最近更新 更多