0000:7c00内存地址在引导过程中的意义是什么?

22

为什么bios会在0000:7c00读取分区的引导记录?那个地址有什么特别之处?在引用地址时,冒号有什么作用?


1
为什么是7C00?这个问题可能最好由一位初始/原始IBM PC BIOS的BIOS程序员/硬件设计者来回答。如果您能找到《IBM个人计算机技术参考手册》的副本,它可能会包含一些线索。 - user113476
4个回答

24

简单的答案是,7C00h 是从原始安装的 32k 内存底部开始 1k(512 字节用于引导扇区,另外 512 字节可能用于引导扇区)。

令人满意的答案是,org 7C00h 已经成为引导扇区 - 引导加载程序编程的代名词。


1
额外的512字节可能是用于引导堆栈。 - Anton Tykhyy
1
@Mike Gonta:多年来,我一直在寻找这样的答案,查阅了许多文档和教程,但都没有结果。但是你的回答是最好的,解决了这个谜团。非常感谢你。你给了我最后一块拼图,导致我找到了这个链接:http://www.glamenv-septzen.net/en/view/6 ... 但是对我来说还有一个谜团:为什么他们使用55 AA作为引导标志?我怀疑这与它们的位模式有关:01010101 10101010,但不知道具体原因。也许你知道吗? - SasQ

13

冒号“:”是来自分段内存时代的遗留物,当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"


4

在最初的IBM PC中,拥有超过32K RAM被认为是不可想象的。按照段地址寻址术语,这是0000:8000,其中8000十六进制为32768十进制。当时的时尚风格是BIOS POST通过在内存顶部以下512字节的位置加载软盘驱动器中A:或硬盘中C:的主引导记录来结束。这意味着从8000 hex中减去0200 hex以获得7C00。因此,引导序列将第一个有效的512字节的第一扇区加载到内存,并将指令指针设置为0000:7C00以执行它。我曾经编写过这些第一扇区的代码以加载操作系统。


1
如果你能引用一个来源来支持这个观点,那么这应该是被接受的答案。不知道为什么被接受的答案与Windows debug相关。 - Matviy Kotoniy
1
实际上,最初的IBM PC配备了16、32或64 KB RAM,其中16K版本仅适用于ROM BASIC(不带软盘)。即使是最早的主板也支持升级到256KB内存,这在当时并不被认为是特别出奇。 - fuz
我使用了@jlettvin的答案来回应类似的问题:https://dev59.com/fXDXa4cB1Zd3GeqP8yBi#70555759,并在此处提到了可能的来源——引用“来自最初IBM BIOS开发团队的开发人员Dr. David Bradley的话语”:https://en.wikipedia.org/wiki/David_Bradley_(engineer)#Other_accomplishments - saulius2

3

请阅读此文章:

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页):

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf

在这个阶段,它正在执行非易失性(意味着您不能轻松地重新编程它,因此不是引导加载程序责任的一部分)BIOS代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接