2

我正在研究 GRUB2 的源代码,并试图理解为什么 boot.S 中的代码首先将 diskboot.img(core.img 的第一个扇区)加载到地址 0x70000,然后使用 copy_buffer 将其复制到 0x8000 并跳转到继续执行。为什么不直接将图像加载到0x8000?

#define GRUB_BOOT_MACHINE_BUFFER_SEG 0x7000 有一条评论:“磁盘缓冲区必须为 32K 长,并且不能跨越 64K 边界。” 但第一个扇区只占 512 字节。

4

1 回答 1

1

好的,让我们将其制定为答案。我查看了代码和 git 历史,这是史前的。它们在多个地方(重新)使用相同的加载代码,并使用多个加载代码(取决于环境 - 软盘、磁盘、LS-120、CD 等)加载到同一个地方(即GRUB_BOOT_MACHINE_BUFFER_SEG.

  • 在多个地方重用相同的代码可以降低维护负担。
  • 一些特定于机器或媒体的加载例程不能“仅”加载 512 个字节;它们加载更多(最多 32 KiB;例如,CD 代码总是加载 2048 字节的倍数),然后调用者只需复制出它需要多少——可选地,也可以使用偏移量。

如果您需要了解更多,我建议您Vladimir “φ-coder” Serbinenko <phcoder@gmail.com>作为在这些领域工作最多的人联系,并直接询问他;这就是我们可以从代码中“神化”的所有内容,而无需询问作者的意图。

于 2014-01-30T18:47:44.040 回答