您的位置:首页 > 编程语言 > VB

桌面电脑操作系统开发笔记(1)——MBR和VBR

2014-05-16 11:20 239 查看
桌面电脑操作系统开发笔记(1)——MBR和VBR



桌面电脑的操作系统是从BIOS接过电脑(CPU)的控制权的。

传统BIOS(与EFI BIOS区别)会把启动介质的第一个扇区(0号)(一般称为“主引导记录”,英文master boot record,缩写MBR,通常是512字节)读进内存0x7C00~0x7DFF的区域,然后跳转执行0x7C00处的语句。这时CPU工作在实模式(real mode)之下,在这个模式下默认操作数大小是16位,CPU采用简单的分段寻址(段寄存器×16+偏移量),最多可以访问从0到0xFFFFF的16×64KB=1MB内存。

传统BIOS根据设定的顺序检查介质(硬盘、U盘、光盘等)是否存在并可启动,若可启动,就加载其首个扇区并移交控制权。检查是否可启动的方法一般是检查首个扇区的最后两个字节是否为0x55、0xAA。如果是硬盘或者是仿硬盘启动的U盘(如USB-HDD引导模式的),BIOS一般还会检查MBR偏移量为0x1BE开始的四项16字节长的主分区表项,是否至少有一项的首个字节为0x80(指示活动分区,即可引导启动的分区)。

关于MBR的格式,可参考http://en.wikipedia.org/wiki/Master_boot_record

也可参考我归纳的:/article/10151264.html

关于Windows 7和8的MBR,可参考http://www.starman.vertcomp.com/asm/mbr/W7MBR.htm

在Windows下可以用管理员权限打开WinHex工具来查看和修改MBR。WinHex有MBR的模板。

一般来说,MBR的工作是检查其偏移量为0x1BE(在内存中就是0x7DBE)开始的四项16字节的主分区表项,找到活动分区,加载活动分区的首个扇区(卷引导记录,英文volume boot record,缩写VBR)到0x7C00~0x7DFF处并转移控制权(跳转执行0x7C00处的语句)。MBR在加载VBR之前,很可能需要将自己复制到内存中的另外一个地方。许多MBR的做法是把自己复制到中断向量表IVT的后面内存地址0x400之后,0x6000之前,把临时的栈设在0x7C00之前的一段内存。

MBR需要调用BIOS提供的中断服务来加载硬盘、U盘等介质上的内容到内存中。通常使用的是BIOS的0x13号中断(int 13h)的(AH=42h)子功能。

关于实模式的中断服务,可参考http://ctyme.com/intr/int.htm

关于int 13h,AH=42h中断服务,可参考http://www.ctyme.com/intr/rb-0708.htm

要注意的是,该中断服务要提供的磁盘地址包(disk address packet)中的内存地址(transfer buffer)域要用实模式的格式,即

| 低16位  | 高16位  |

| 偏移量  | 16位段  |

卷引导记录VBR除了包含引导启动代码,还包含文件系统的元数据。VBR的引导启动代码的主要工作是从该卷中加载操作系统引导启动的文件(例如Windows XP的NTLDR和Windows Vista、7、8的BOOTMGR)到内存并转移控制权。

WinHex也有FAT16、FAT32和NTFS等文件系统的VBR的模板。

关于Windows 7的NTFS的VBR,可参考http://www.starman.vertcomp.com/asm/mbr/W7VBR.htm

关于FAT文件系统的VBR,可参考http://en.wikipedia.org/wiki/File_Allocation_Table

也可参考我整理的:/article/10151265.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: