



磁盘的第1扇区是MBR,第2扇区是系统的第1个分区(Partition1),也就是我们说的C盘,这是我们的文件系统驱动程序需要检测并加载文件系统来解析的扇区。操作系统把整个磁盘当作第0分区(Partition0)。下面是属于Partition1分区的第1扇区结构。
   
   这一扇区是512B,使用标准的分区结构来描述分区的基本信息。
   因为我们不需要使用启动分区的代码,所以可将其初始化为0,但是BPB和EBPB结构是需要填写的,以便文件系统挂载分区时进行识别。启动扇区应该结合文件系统来设计,比如我们可以省略最后应该标记的55 AA,就是因为后面编写的LDFS文件系统不需要检查。但是在内核下的NTFS文件系统和Disk磁盘类驱动需要检查启动分区标志,又不能省略。
大家应该还记得,之前在MBR计算要读取的扇区数时(80000h/512-8),是需要在扇区数上减掉8扇区的。因为第1个扇区存放的是MBR的代码,第2个扇区是启动分区,另外6扇区保留给LDFS文件系统使用。
什么是LDFS文件系统呢?我们先来讨论一个问题。对于一块磁盘来说,我们根据512B划分一个扇区,这些扇区是用来存储数据的。存储的数据有大有小,甚至跨扇区,现在我们要保存一块数据,假定是256B,那么用1扇区就可以存放。现在我们考虑的问题是,把它存放在磁盘的哪里呢?第1扇区存放MBR的代码,不能使用;第2扇区是启动分区,不能使用;第3~8扇区作为保留扇区,也不能使用,因此我们只能考虑存放在第9扇区。这样第9扇区我们用去了256B,对于这一扇区(512B)来说还剩余256B空间,这些信息我们需要记住。现在我们又有一块数据,大小是400B,我们把它放到哪里呢?很明显,上次在第9扇区的后256B空间还未用完,现在我们把这块数据的前256B放到第9扇区后半部,还有144字节需要存储,我们想当然是存放在第10扇区,这样第10扇区我们就用了144B空间,这些信息我们又要记住。照这样计算,要存储第3块数据、第4块数据、第5块数据呢?随着数据块的增多,上面这种方法显然是行不通的。这就需要一个有效的方式来组织管理不同的数据块。经过上面的分析,显然我们能总结出一些基本特征。数据块,首先应有大小,这是必需的。它存放在磁盘起始位置,这也是必需的。不同的数据块也必须区分,即标识,要么用标号,要么用名称。标号肯定不理想,取名称好记。现在我们知道了一个有意义且能管理的数据块需要有大小(可为0)、位置、名称这些最基本的因素,我们也称之为“文件”。有一点值得我们注意的是,在我们的电脑中查看文件,会有一些文件大小为0的情况,其实它表示的是文件对应的数据部分为0,而不是说文件结构为0。任何一个文件,只要存在名称,就会占用磁盘空间。
我们定义的LDFS文件系统是一系列结构数组,每个结构就是一个文件,默认数组大小为64,存放的是文件列表,最多能存放64个文件。根据文件名,通过LDFS文件系统,就能定位文件在磁盘的位置。每个文件都用一个结构表示,大小为32B,下面是其宏定义:
   第1个字段(或称成员)FileFlags表示文件的状态,若为1,表示文件在osloader阶段需要加载,若为0,表示文件不存在,或者如果存在,保留给NTFS文件系统驱动使用;第2个字段FileStart表示文件在磁盘中的起始位置;第3个字段FileSize表示文件的大小;第4个字段FileName表示文件的名称,限定文件名称的最大长度为20B。以下列举的就是LDFS格式的文件数组列表:
   通过LOAD_BOOT_FILE宏,NASM自动帮我们连接并定位到磁盘特定的位置上。我们通过这样的方式把文件安装到磁盘里,这些文件属于LDFS文件系统格式,只能由LDFS解析。上面是我们学习ReactOS使用的文件。如果是学习WRK,加载的文件又是不同的,这部分没有列出,可以参看boot.asm源码部分,注意有些数据可能被注释了,去掉注释即可。要么设置使用ReactOS文件,要么设置使用WRK文件。每次切换时,都需要重新编译。