显然,FAT32文件系统是一个相对复杂的文件系统,一个引导扇区的空间,很难装载完整的引导代码,因为即使操作系统核心文件放在根目录下,也需要搜索整个根目录,找到操作系统文件,并加载该文件。这个过程需要两个扇区左右的代码量。但是通过预置一些变量到引导扇区,可以大大减少FAT32文件系统的引导扇区尺寸,使得代码能够被容纳在一个引导扇区中。比如,下面是标准的FAT32文件系统引导扇区的布局:
此后就是可执行的引导代码。
显然,其中很多信息是无用的,尤其是在FAT32文件系统上。比如BPB_TotSec16等变量。在配置启动扇区的时候,可省略这些变量,从而腾出更多的空间来安排引导代码,使FAT32文件系统的引导代码能够放到一个扇区内。下面是经过“预置”处理后的引导扇区结构:
此后跟着真正的可执行代码。
这样预置后,不但节约了大约20B的空间,而且很多变量已经被预置(这些被预置的变量,称为预置变量),无需计算(比如cluster大小)。而如果按照传统的引导扇区,则需要安排专门代码计算这些变量值。这样综合下来,可节约大约60B的空间。不要小看这60B,在汇编语言实现的引导扇区中,60B可以实现分析FAT32根目录项的功能,而这是FAT32引导扇区的核心功能。(www.xing528.com)
同时,可以优化启动扇区的代码,省略一些不必要的判断。比如int13号调用功能,目前多数BIOS都提供这项功能,就无需判断BIOS是否支持int13调用了。同时,由于操作系统是运行在32位CPU上,可通过使用CPU的32位寄存器(比如EAX、EBX等)和32位指令扩大数据处理范围,以节约代码量。
具体的实现过程是,在Hello China的安装过程中,提供一个磁盘分析工具,用于读取或计算cluster的尺寸等预置变量,然后写入引导扇区。
采用上述措施后,Hello China实现了在一个引导扇区内,引导FAT32文件系统上的操作系统的功能。而通常情况下,这些功能是需要在两个以上的扇区内实现的。
上述实现方法,是不需要操作系统核心文件在硬盘上固定位置的。虽然对某些变量做了预置,但是引导过程并没有改变,引导扇区还是首先读入根目录,在根目录中搜索操作系统核心文件。找到后再查询FAT表,找到操作系统核心文件在磁盘上的具体位置,然后依次读入。因此,即使操作系统核心文件的位置不断变化,也不会影响操作系统的加载。显然,这种“预置引导法”既克服了操作系统引导扇区过大的问题,也规避了固定操作系统核心文件位置的不利之处。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。