D_D系统构建-MBR(1)

来源:互联网 发布:策略经营单机手游 知乎 编辑:程序博客网 时间:2024/06/05 03:09

MBR,英文含义:Main Boot Record),主引导纪录,是位于磁盘最前边的一段引导(Loader)代码,一般写于磁盘第一个扇区处,且最后两个 字节为0xAA55。它是我们的系统上电后第一个运行的磁盘程序(在它前面实际还有很多固件程序,bios等,主要完成硬件自检工作,这阶段发生任何异常,比如内存异常,显卡异常,磁盘异常等均会中止,当然这一块我们不关注,也无法干预),最简单的理解就看成是由我们的pc把它加载到内存地址0:0x7c00处,然后将执行权利交由它来运行。

MBR到内存的映射关系:


这个扇区因为只有512字节,实际可用只有446字节,后面64字节是分区表,最后以0xaa55结束,很明显无法完成复杂的操作,因此它的使命一般是加载第二个程序,将控制权交由第二个程序运行,比如我们这里的Loader.

MBR结构:



因为我们只有一个磁盘,所以64字节的分区表可以进行直接覆盖,毕竟我们只是尝试,在后面熟悉了后,可以进一步了解这个分区表并使用它来定位到每一个分区(所谓分区,就类似我们在window上习惯将一个硬盘划分为c盘,D盘等,而分区表则是纪录每个分区的起始位置,大小等信息)

当然我们为了让它能加载 loader,会要求它按照我们的文件系统来查询Loader,读取Loader文件到指定内存区域,并将控制权交由它。

这里,我可以告诉你,加上这个文件系统读取,总字节肯定会超过512字节,你要是强制从第一扇区开始写,紧跟着的是扇区里面内容还记得吗?那是我们的文件系统区,这样肯定会破坏文件系统内容,严重的导致无法查询到Loader文件。

MBR禁止覆盖区域(标红处):



那就没有办法了吗?

办法肯定有,软件上从来就没有搞不定的办法。其实很简单。我们规定了我们只用4096个扇区(编号从0开始,范围0-4095),换成字节就是4096*512=2M字节,我们的磁盘实际会分配10M,可以把mbr超出512字节的写到4096开始的扇区中,这样在运行mbr时,第一件事就是把4096开始的加载到0x7e00开始处,对应上图中的RSV区域。

很明显,这里面还需要获取mbr的总长度,或者总扇区数目,这些都简单。

这样,我们的磁盘利用会变成这样:


其中,MBR-1与MBR-2共同组成MBR,


总结起来,对MBR我们需要处理的事情为:1.MBR超过512字节时,如何 写入磁盘中。2.在系统读取第一个扇区到内存0x7c00时,如何保证该扇区的mbr标识0xaa55存在,否则系统无出错。2. 加载到内存后,如何知道自己的总长度并能把自己剩余的内存全部加载进内存中。

下一章节,会一一解决这些问题。届时,我们将逐步介绍nasm, dd bochs等工具。大家要使用时,可提前通过apt-get工具来安装nasm bochs ; dd工具为ubuntu自带,不需要安装 。