1.FAT12文件系统扇区分配
FAT12文件系统由引导区、FAT表、根目录项表和文件数据区组成,其中引导区程序占用扇区[0],FAT表1占用扇区[1]~[9],FAT表2占用扇区[10]~[18],根目录项表存储于扇区[19]~[32],用户存储的文件或者子目录位于扇区[33]之后。
FAT12 2880扇区 (1474560B) | 逻辑扇区 | 占用扇区 | 内容 | 磁盘CHS参数(磁头/柱面/扇区) |
---|---|---|---|---|
0 | 1(512B) | 引导程序 | 起:0/0/1 | |
1 | 9(4608B) | FAT文件分配表1 | 起:0/0/2 止:0/0/10 | |
10 | 9(4608B) | FAT文件分配表2 | 起:0/0/11 止:1/0/1 | |
19 | 14(9728B) | 目录文件项 | | |
33 | end | 文件数据区 |
表1 - FAT12文件系统扇区分配图
2.FAT12的引导区
引导区存储的比较重要的信息有文件系统的类型、文件系统逻辑扇区总数、每簇包含的扇区数(还有磁道和扇区的关系等等,先不深究吧),引导区最后以0x55AA两个字节作为结束,共占用一个扇区。
标识 | 偏移量 | 类型 | 大小 | 说明 | 默认值 |
---|---|---|---|---|---|
0 | db | 3 | 跳转指令 | ||
BS_OEMName | 3 | db | 8 | OEM字符串,必须为8个字符,不足以空格填空 | MSWIN4.1 |
BPB_BytsPerSec | 11 | dw | 2 | 每扇区字节数 | 200h |
BPB_SecPerClus | 13 | db | 1 | 每簇占用的扇区数 | 1 |
BPB_RsvdSecCnt | 14 | dw | 2 | 保留扇区数 | 1 |
BPB_NumFATs | 16 | db | 1 | FAT表的记录数 | 2 |
BPB_RootEntCnt | 17 | dw | 2 | 最大根目录文件数 | 0e0h |
BPB_TotSec16 | 19 | dw | 2 | 逻辑扇区总数 | 0b40h |
BPB_Media | 21 | db | 1 | 媒体描述符 | 0f0h |
BPB_FATSz16 | 22 | dw | 2 | 每个FAT占用扇区数 | 9 |
BPB_SecPerTrk | 24 | dw | 2 | 每个磁道扇区数 | 12h |
BPB_NumHeads | 26 | dw | 2 | 磁头数 | 2 |
BPB_HiddSec | 28 | dd | 4 | 隐藏扇区数 | 0 |
BPB_TotSec32 | 32 | dd | 4 | 如果BPB_TotSec16是0,则在这里记录扇区总数 | 0 |
BS_DrvNum | 36 | db | 1 | 中断13的驱动器号 | 0 |
BS_Reserved1 | 37 | db | 1 | 未使用 | 0 |
BS_BootSig | 38 | db | 1 | 扩展引导标志 | 29h |
BS_VolID | 39 | dd | 4 | 卷序列号 | 0 |
BS_VolLab | 43 | db | 11 | 卷标,必须是11个字符,不足以空格填充 | |
BS_FileSysType | 54 | db | 8 | 文件系统类型,必须是8个字符,不足填充空格 | FAT12 |
62 | | | 引导代码,由偏移0字节处的短跳转而来 | ||
510 | dw | 2 | 系统引导标识 | 0aa55h |
表2 - 引导区结构
系统的bootloader根据引导区的存储内容可以确定文件系统信息,从引导区第62个字节开始的引导程序,我们就可以初始化外围设备和跳转到二次引导程序或者进入系统入口点。
3.FAT12文件系统的文件索引方法
FAT12文件系统上有两个FAT表和文件目录项表,其文件的索引工作全由这些表共同完成。
FAT表-存储的是关于簇的使用情况,其中
0ff0-0ff7h代表坏簇,磁道或柱面损坏不可使用,在格式式磁盘时由系统自动填充;
0ff8-0fffh代表文件内容结束,到此簇为止;
其它的值代表着下一个簇号,也就是所谓的簇链。
在FAT12文件系统中,最小存储单元是簇,如一个扇区占用512个字节,如果此时文件系统一个簇占用2个扇区,当我需要存储一个1500字节的文件时,将会占用2个簇,即2048个字节,多占用的空间是不可再用了。对于FAT12文件系统,簇的序号由12bit进行编号,也就是说最多只支持4096个簇,这也是FAT12支持的最大文件数量不确定的原因(一个文件可能会占用多个簇)。值得注意的是我们是从簇[2]开始用于存储文件的,且格式化的时候,磁盘卷标通常就会占用了簇[2]的空间。所以实际上我们新建文件或者创建子目录是从簇[3]开始的。
图1 - FAT表字节位置与簇号的存储关系(FAT12中一个簇号占用1.5字节)
文件目录项占用14个扇区,每个项占用32个字节(这里是针对短文件名记录结构而非长文件名文件),表示支持的最大根目录数量=扇区字节数*14/32=224。
FAT文件系统下创建子目录和文件的异同:
类同:
FAT文件系统对于创建文件和创建子目录的操作是基本一致的,都是在文件目录项表中增加32字节来存储其属性和起始簇号等等。
差异:
>>>>在创建文件的时候,会占用文件目录项中的一项(32字节),并会分配至少一个簇的空间给文件,并修改FAT表中对应簇号的状态(如文件结束则填入0ff8-0fffh的内容,如果超过一个簇则填入下一个簇的编号);
>>>>在创建子目录时,其步骤如下:
a.在父目录所在簇上建立新的目录项,存储当前所建文件夹信息;(根目录上的每个32字节文件项均写到这里?)
b.分配一个新簇,给新建的文件夹建立两个目录项:父目录和当前目录;
c.在FAT表中新分配的簇对应的位置上写下文件结束符;
d.建立各部分的链路关系:新建文件夹所对应的目录项的文件起始簇号字段写上新分配簇的簇号,新簇上的两个目录项的文件起始簇号字段分配写上父目录所在簇号。
b.分配一个新簇,给新建的文件夹建立两个目录项:父目录和当前目录;
c.在FAT表中新分配的簇对应的位置上写下文件结束符;
d.建立各部分的链路关系:新建文件夹所对应的目录项的文件起始簇号字段写上新分配簇的簇号,新簇上的两个目录项的文件起始簇号字段分配写上父目录所在簇号。
图2 - FAT12目录项数据结构(偏移以字节为单位,共占用32个字节)
------------------------------------------------------------------------------------------
文件属性:
00000000:普通文件,可随意读写
00000001:只读文件,不可改写
00000010:隐藏文件,浏览文件时隐藏列表
00000100:系统文件,删除的时候会有提示
00001000:卷标,作为磁盘的卷标识符
00010000:目录文件,此文件是一个子目录,它的内容就是此目录下的所有文件目录项
00100000:归档文件
文件的属性可以叠加使用,可以具有多重属性,即设置为只读的时候也可以同时隐藏。
00000001:只读文件,不可改写
00000010:隐藏文件,浏览文件时隐藏列表
00000100:系统文件,删除的时候会有提示
00001000:卷标,作为磁盘的卷标识符
00010000:目录文件,此文件是一个子目录,它的内容就是此目录下的所有文件目录项
00100000:归档文件
文件的属性可以叠加使用,可以具有多重属性,即设置为只读的时候也可以同时隐藏。
------------------------------------------------------------------------------------------
文件创建位置的区别:
当在根目录下创建文件(文件夹)时,由于FAT12文件系统根目录文件项限制于224个,所以在根目录下最多只能存在224个文件(文件夹),当然遇到长文件名的情况,会使得存储文件数量下降。当在非根目录下创建文件(文件夹)时,会在目录分配的新簇中写入相应目录项,所以不受限于根目录文件项数。(这里不知道理解的对不对,请指正)
------------------------------------------------------------------------------------------
文件索引步骤:
先在文件目录项表中找到对应的文件名的那32个字节,在第26字节中,我们得到文件的起始簇号,然后得到文件一个簇空间的内容,再到FAT表中起始簇号对应的偏移字节中得到文件链接的下一个簇号,在从对应的偏移字节中,获取下一个簇号,直至遇到文件结束符,这样就可以得到文件所有内容,以此类推。
4.长文件名的存储规则
(待续。。。)