为什么 bios 在 0000:7c00 处读取分区的引导记录?这个地址有什么特别之处?':' 在引用地址时做什么?
4 回答
简单的答案是 7C00h 是 1k(引导扇区的 512 字节加上可能使用的引导扇区的额外 512 字节)距离原始 32k 安装内存的底部。
令人高兴的答案是,它org 7C00h
已成为引导扇区的代名词——引导加载程序编程。
“:”是分段内存时代的遗留物,当时 PC 以实模式运行,一次只能处理 64K。“:”左边的数字是你的段,右边的数字是你的地址。
如果您想自己在内存中四处寻找,则 windows debug 命令接受此表示法:
C:\Users\Seth> debug
-d0000:7c00
0000:7C00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C10 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C50 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C60 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C70 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
关于这个特定地址,它只是一个被挑选来加载 MBR 的地址,参见:https ://web.archive.org/web/20140701052540/http://www.ata-atapi.com/hiwmbr.html
“如果找到 MBR,则将其读入内存位置 0000:7c00 并且 INT 19 跳转到内存位置 0000:7c00”
在最初的 IBM PC 中,拥有超过 32K 的 RAM 被认为是不可思议的。在分段寻址术语中,这是 0000:8000,其中 8000 十六进制是 32768 十进制。当时的方式是 BIOS POST 通过在 A: 中加载软盘的引导扇区或在 C: 中加载硬盘驱动器的主引导记录来结束内存顶部以下 512 字节的位置,这意味着从 0200 hex 中减去8000 hex 得到 7C00。因此引导序列将第一个有效的 512 字节首扇区加载到其中,然后将指令指针设置为 0000:7C00 以执行它。我曾经为这些第一个扇区编写代码以加载操作系统。
阅读这篇文章:
http://en.wikibooks.org/wiki/X86_Assembly/Bootloaders
从上面的 URL,BIOS(实际上是 PC 硬件)将在 0000:7c00 处跳转到内存以继续在 16 位模式下执行。
并从上面引用:
引导加载程序在程序员必须了解的某些条件下运行才能成功地进行引导加载程序。以下内容与 PC BIOS 启动的引导加载程序有关:
- 驱动器的第一个扇区包含其引导加载程序。
- 一个扇区是 512 字节——最后两个字节必须是 0xAA55(即 0x55 后跟 0xAA),否则 BIOS 会将驱动器视为无法启动。
- 如果一切正常,所述第一个扇区将被放置在 RAM 地址 0000:7C00,并且 BIOS 的角色已经结束,因为它将控制权转移到 0000:7C00。(即它 JMPs 到那个地址)
所以从启动开始,如果你想让 CPU 开始执行你的代码,它必须位于内存中的 0000:7c00。这部分代码是从硬盘的第一个扇区加载的——也是由硬件完成的。并且只有第一个扇区被加载,代码的其余部分必须由这个初始的“引导加载程序”加载。
有关硬盘第一扇区和 7c00 设计的更多信息:
http://www.ata-atapi.com/hiwdos.html
http://www.ata-atapi.com/hiwmbr.html
请不要与 CPU 的启动模式混淆 - 它将获取并执行的第一条指令位于物理地址 0xfffffff0(参见第 9-5 页):
在这个阶段,它正在执行非易失性(这意味着你不能轻易地对其重新编程,因此不属于引导加载程序的责任)BIOS 代码。