我正在研究 GRUB2 的源代码,并试图理解为什么 boot.S 中的代码首先将 diskboot.img(core.img 的第一个扇区)加载到地址 0x70000,然后使用 copy_buffer 将其复制到 0x8000 并跳转到继续执行。为什么不直接将图像加载到0x8000?
#define GRUB_BOOT_MACHINE_BUFFER_SEG 0x7000 有一条评论:“磁盘缓冲区必须为 32K 长,并且不能跨越 64K 边界。” 但第一个扇区只占 512 字节。
好的,让我们将其制定为答案。我查看了代码和 git 历史,这是史前的。它们在多个地方(重新)使用相同的加载代码,并使用多个加载代码(取决于环境 - 软盘、磁盘、LS-120、CD 等)加载到同一个地方(即GRUB_BOOT_MACHINE_BUFFER_SEG
.
如果您需要了解更多,我建议您Vladimir “φ-coder” Serbinenko <phcoder@gmail.com>
作为在这些领域工作最多的人联系,并直接询问他;这就是我们可以从代码中“神化”的所有内容,而无需询问作者的意图。