【发布时间】: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 位长模式的过程