为什么bios会在0000:7c00读取分区的引导记录?那个地址有什么特别之处?在引用地址时,冒号有什么作用?
为什么bios会在0000:7c00读取分区的引导记录?那个地址有什么特别之处?在引用地址时,冒号有什么作用?
简单的答案是,7C00h 是从原始安装的 32k 内存底部开始 1k(512 字节用于引导扇区,另外 512 字节可能用于引导扇区)。
令人满意的答案是,org 7C00h
已经成为引导扇区 - 引导加载程序编程的代名词。
冒号“:”是来自分段内存时代的遗留物,当PC在实模式下运行且一次只能处理64K时使用。冒号左侧的数字是您的段,右侧的数字是您的地址。
如果您想要自己查看内存,则Windows调试命令接受此记法:
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通过在内存顶部以下512字节的位置加载软盘驱动器中A:或硬盘中C:的主引导记录来结束。这意味着从8000 hex中减去0200 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代码。