为什么bios读取分区的启动记录0000:7c00?那个地址有什么特别之处? ':'在引用地址时做了什么?
答案 0 :(得分:18)
简单的答案是7C00h是从最初的32k安装内存的底部开始的1k(引导扇区为512字节,另外还有512字节用于可能的引导扇区)。
快乐的答案是org 7C00h
已经成为引导扇区 - 引导加载程序编程的同义词。
答案 1 :(得分:11)
“PC”是分段内存天数的延续,当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的地址,请参阅:http://www.ata-atapi.com/hiwmbr.html
“如果找到MBR,它将被读入内存0000:7c00并且INT 19跳转到内存位置0000:7c00”
答案 2 :(得分:2)
阅读这篇文章:
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时,其作用已结束。 (即它 JMP到那个地址)
所以从启动开始,如果你想让CPU开始执行你的代码,它必须位于内存0000:7c00。而这部分代码是从硬盘的第一个扇区加载的 - 也是由硬件完成的。并且它只是第一个被加载的扇区,然后代码的其余部分必须由这个初始的“引导程序”加载。
有关硬盘第一扇区和7c00设计的更多信息:
http://www.ata-atapi.com/hiwdos.html
http://www.ata-atapi.com/hiwmbr.html
请不要与CPU的启动模式混淆 - 它将获取和执行的第一条指令位于物理地址0xfffffff0(参见第9-5页):
并且在此阶段它正在执行非易失性(意味着您无法轻松地重新编程,因此不是引导加载程序的责任)BIOS代码。
答案 3 :(得分:1)
为什么选择7C00?对于初始/原始IBM PC BIOS,最好由BIOS程序员/硬件设计人员来回答。
如果您能找到 IBM个人计算机技术参考手册的副本,则可能包含一些线索。
答案 4 :(得分:0)
在最初的IBM PC中,超过32K的RAM被认为是不可想象的。用分段寻址术语来说,这是0000:8000,其中8000 hex是十进制32768。时间的方式是BIOS POST的结束,方法是将软盘的Boot Sector加载到A:或将硬盘驱动器的Master Boot Record加载到C:,位于内存顶部下方512字节的位置,这意味着要从中减去0200十六进制8000十六进制获得7C00。因此,引导序列将第一个有效的512字节的第一个扇区加载到其中,然后将指令指针设置为0000:7C00来执行它。我曾经为这些第一个扇区编写代码以加载操作系统。