概念解释
- 一个操作系统从开机到开始运行需要经历的过程
引导→加载内核入内存→跳入保护模式→开始执行内核 - 引导扇区把加载内核、准备保护模式等工作交给
Loader
模块来做,因为引导扇区只有512字节。而loader
模块没有512字节的限制,会方便的多。
FAT12
- FAT12是DOS时代就开始使用的文件系统
- 文件系统把磁盘划分为以下层次
扇区(Sector):磁盘上的最小数据单元。
簇(Cluster):一个或多个扇区。
分区(Partition):通常指整个文件系统。 - 引导扇区是整个软盘的第0个扇区,其中有一个很重要的数据结构叫BPB。引导扇区的格式如下,其中名称以BPB_开头的域属于BPB,以BS_开头的域只是引导扇区的一部分
- 紧接着引导扇区的是两个完全相同的FAT表,每个占用9个扇区。第二个FAT之后是根目录区的第一个扇区。根目录区的后面是数据区
- 规定Loader只能放在根目录中,而根目录信息存放在FAT2后面的根目录区中
- 根目录区位于第二个FAT表之后,开始的扇区号为19,它由若干个目录条目(Directory Entry)组成,条目最多有BPB_RootEntCnt个。由于根目录区的大小是依赖于BPB_RootEntCnt的,所以长度不固定。根目录区中的每一个条目占用32字节(如下图)。
- 通过过
FreeDos
在这张虚拟软盘中添加以下几个文本文件:
RIVER.TXT,内容为riverriverriver。
FLOWER.TXT,内容为300个单词flower,用来测试文件跨越扇区的情况。(可以先建一个小文件,最后再把它改长,这样可以
让它对应的簇不连续,便于观察和理解。)
TREE.TXT,内容为treetreetree。 - 再添加一个HOUSE目录,然后在目录HOUSE下添加两个文本文件:
CAT.TXT,内容为catcatcat。
DOG.TXT,内容为dogdogdog。 - 由于根目录区从第19扇区开始,每个扇区512字节,所以其第一个字节位于偏移19_512=9728=0x2600处。
- 以RIVER.TXT为例,它的各项值如表所示
- 因为规定Loader只能放在根目录中,所以寻找Loader时,只要发现文件名正确就认为找到。
DIR_FstClus
:文件的开始簇号。由于之前定义过一簇只包含一个扇区,所以在这里"簇" = "扇区"
- 数据区的第一个簇的簇号是2,而不是0或者1。RIVER.TXT的开始簇号就是2,也就是说,此文件的数据开始于数据区第一个簇。
- 假设根目录区共占用RootDirSectors 个扇区(根目录区条目最多有BPB_RootEntCnt个):
- 可以算出RootDirSectors =14
数据区开始扇区号=根目录区开始扇区号+14=19+14=33(的偏移量是0x4200(512×33))
- 可以通过根目录区找到文件的开始簇号,对于小于512字节的文件来
说,FAT表用处真的不大,但如果文件大于512字节,我们需要FAT表来找到所有的簇(扇区)。FAT表有两个,FAT2可看做是FAT1的备份,FAT1的开始扇区号是1,偏移为512字节(0x200)。
- 每12位称为一个FAT项,代表一个簇
第0个和第1个FAT项始终不使用,从第2个FAT项开始表示数据区的每一个簇。第2个FAT项表示数据区第一个簇。 - FAT项的值代表的是文件下一个簇号,但如果值大于或等于0xFF8,则表示当前簇已经是本文件的最后一个簇。如果值为0xFF7,表示它是一个坏簇。
- 根据根目录表可以找到FLOWER.TXT的开始簇号(DIR_FstClus)为3,对应第三个FAT项,根据此FAT项值为0x008,下一个簇号为8,第8个FAT项的值为0x009,接下来第9个FAT项值为0x00A,第0xA个FAT项值为0xFFF(大于0xFF8)。结束。所以,FLOWER.TXT占用了第3、8、9、10,共计4个簇。