我们知道 BIOS 中断 (INT) 0x19 用于搜索引导签名 (0xAA55)。如果找到,则在 0x7C00 加载并执行我们的引导加载程序。
我的问题:为什么是 0x7C00?是什么原因 ?如何通过一些方法对其进行评价?
我们知道 BIOS 中断 (INT) 0x19 用于搜索引导签名 (0xAA55)。如果找到,则在 0x7C00 加载并执行我们的引导加载程序。
我的问题:为什么是 0x7C00?是什么原因 ?如何通过一些方法对其进行评价?
可能是因为 MBR 被加载到内存中(通过 BIOS)到 0x7c00 地址然后 int 0x19 在扇区 0x7c00 上搜索 MBR 扇区签名 0xAA55
关于 0xAA55:
不是校验和,而是更多的签名。它确实提供了一些简单的证据来证明存在一些 MBR。
0xAA55 也是一个交替的位模式:1010101001010101
它通常用于帮助确定您是在小端还是大端系统上,因为它将读取为 AA55 或 55AA。我怀疑这是为什么将它放在 MBR 末尾的部分原因。
大约 0x7c00:
查看此网站(这可能有助于您找到答案):https ://www.glamenv-septzen.net/en/view/6
这可能已经死了,但我要回答。
在任何引导加载程序的开始,当您将段的原点设置为0x7c00
然后寄存器跳转地址也到那个。因此,理想情况下,如果您查看一些告诉您如何使用 int0x19
命令的在线资源,它们将指导您如何跳转到另一个地址。
为了解决这个问题,您最好在每次跳转到新地址时将堆栈重置为 0。
(这似乎重复了以下问题:
0000:7c00 处的内存对引导顺序有什么意义?
BIOS 是否将 512 字节引导加载程序复制到 0x7c00)
受前者答案的启发,我将引用两个来源:
所以,先从 David Bradley 的回复中回答关于 16KB 模型的问题:
它必须在 32KB 的机器上启动。DOS 1.0 至少需要 32KB,因此我们并不担心尝试以 16KB 进行引导。
要执行 DOS 1.0,至少需要 32KB,所以没有考虑 16KB 模型。
其次是“为什么是 32KB-1024B?”的答案:
我们希望为操作系统在 32KB 内加载自身留出尽可能多的空间。808x Intel 架构将内存范围的第一部分用于软件中断,然后是 BIOS 数据区。因此,我们将引导加载放在 0x7C00 (32KB-1KB) 处,以便在两者之间留出所有空间供操作系统加载。引导扇区是 512 字节,当它执行时,它需要一些空间来存放数据和堆栈,所以这是另外的 512 字节。所以 INT 19H 执行后的内存映射如下所示:
不,那个案子不在考虑范围之内。IBM PC 5150 ROM BIOS 开发团队成员之一,David Bradley 博士说:
“DOS 1.0 至少需要 32KB,因此我们并不担心尝试以 16KB 启动。”
(注意:DOS 1.0 最低要求 16KiB 还是 32KiB?我不知道哪个正确。但是,至少在 1981 年的早期 BIOS 开发中,他们认为 32KiB 是 DOS 的最低要求。)
BIOS 开发团队决定 0x7C00 是因为:
- 他们希望为操作系统在 32KiB 内加载自身留出尽可能多的空间。
- 8086/8088 使用 0x0 - 0x3FF 作为中断向量,后面是 BIOS 数据区。
- 引导扇区为 512 字节,引导程序的堆栈/数据区域需要更多的 512 字节。
- 因此,选择了 0x7C00,即 32KiB 的最后 1024B。
一旦操作系统加载并启动,引导扇区在电源重置之前永远不会使用。因此,操作系统和应用程序可以自由使用 32KiB 的最后 1024B。
我希望这个答案足以确定它为什么/如何发生。