FAT12文件系统详解

         FAT12是计算机文件系统,DOS时代就开始使用的文件系统(File System),直到2009年仍然在软盘上使用。

主磁盘结构

  • 引导扇区(Boot Sector)位于第一个扇区,在软盘上就是0柱面(磁道)0磁头1扇区。

  • 文件分配表(FAT)紧接着引导扇区的是两个完全相同的FAT表,每个FAT表占用9个扇区

  • 根目录区FAT表之后是根目录区,根目录区长度不固定

  • 数据区根目录后面就是数据区

FAT12文件系统引导扇区结构信息:

  •  BS_jmpBoot:从上表可以看出,在引导程序的起始处,首先定义的是BS_jmpBoot字段。从字面意思可知,它是一句跳转代码,这是由于BS_jmpBoot字段后面的数据不是可执行程序,而是FAT12文件系统的组成结构信息,故此必须跳过这部分内容。字段长度为3,说明汇编代码jmp short Label_start;nop经过编译后,一共生成三个字节的机器码,其中nop会生成一个字节的机器码,jmp shortLabel_start会生成两个字节的机器码。
  • BS_OEMName:记录制造商的名字,亦可自行为文件系统命名。
  • BPB_SecPerClus:描述了每簇扇区数。由于每个扇区的容量只有512B,过小的扇区容量可能会导致软盘读写次数过于频繁,从而引入簇(Cluster)这个概念。簇将2的整数次方个扇区作为一个“原子”数据存储单元,也就是说簇是FAT类文件系统的最小数据存储单位。
  • BPB_RsvdsecCnt:指定保留扇区的数量,此域值不能为0。保留扇区起始于FAT12文件系统的第一个扇区,对于FAT12而言此位必须为1,也就意味着引导扇区包含在保留扇区内,所以FAT表从软盘的第二个扇区开始。
  • BPB_NumFATs:指定FAT12文件系统中FAT表的份数,任何FAT类文件系统都建议此域设置为2。设置为2主要是为了给FAT表准备一个备份表,因此FAT表1与FAT表2内的数据是一样的,FAT表2是FAT表1的数据备份表。
  • BPB_RootEntCnt:指定根目录可容纳的目录项数。对于FAT12文件系统而言,这个数值乘以32必须是BPB_BytesPersec的偶数倍。
  • BPB_Totsec16:记录着总扇区数。这里的总扇区数包括保留扇区(内含引导扇区)、FAT表、根目录区以及数据区占用的全部扇区数,如果此域值为0,那么BPB_Totsec32字段必须是非0值。
  • BPB_Media:描述存储介质类型。对于不可移动的存储介质而言,标准值是0xF8。对于可移动的存储介质,常用值为0xF0,此域的合法值是0xF0、0xF8、0xF9、0xFA、0xFB、0xFC、0xFD、0xFE、0xFF:另外提醒一点,无论该字段写入了什么数值,同时也必须向FAT[O]的低字节写入相同值。
  • BPB_FATSz16:记录着FAT表占用的扇区数。FAT表1和FAT表2拥有相同的容量,它们的容量均由此值记录。
  • Bs_volLab:指定卷标。它就是Windows或Linux系统中显示的磁盘名。
  • BS_FilesysType:描述文件系统类型。此处的文件系统类型值为'FAT12 ',这个类型值只是一个字符串而已,操作系统并不使用该字段来鉴别FAT类文件系统的类型。

FAT12文件系统分配图:

FAT表  

        FAT12文件系统以簇为单位来分配数据区的存储空间(扇区),每个簇的长度为BPB_BytesPerSec *BPB_SecPerclus字节,数据区的簇号与FAT表的表项是一一对应关系。因此,文件在FAT类文件系统的存储单位是簇,而非字节或扇区,即使文件的长度只有一个字节,FAT12文件系统也会为它分配一个簇的磁盘存储空间。此种设计方法可以将磁盘存储空间按固定存储片(页)有效管理起来,进而可以按照文件偏移,分片段访问文件内的数据,就不必一次将文件里的数据全部读取出来。

        FAT表中的表项位宽与FAT类型有关,例如,FAT12文件系统的表项位宽为12 bit、FAT16文件系统的表项位宽为16 bit、FAT32文件系统的表项位宽为32 bit。当一个文件的体积增大时,其所需的磁盘存储空间也会增加,随着时间的推移,文件系统将无法确保文件中的数据存储在连续的磁盘扇区内,文件往往被分成若干个片段。借助FAT表项,可将这些不连续的文件片段按簇号链接起来,这个链接原理与C语言的单向链表极为相似。

         其中,FAT[O](FAT表项0)的低8位在数值上与BPB_Media字段保持一致,剩余位全部设置为1。由于之前表中的BPB_Media字段数值是F0h,故此FAT[0]的值是FF0h。在文件系统初始化期间,已经明确地将FAT[1]赋值为FFFh,想必这是为了防止文件系统误分配该表项。
        现在,大部分操作系统的FAT类文件系统驱动程序都直接跳过这两个FAT表项的检索,使它们不再参与计算。因此,FAT[0]和FAT[1]的数值已经不再那么重要了,有时候这两个值为0也是没问题的。

根目录区和数据区

        从本质上讲,根目录区和数据区都保存着与文件相关的数据,只不过根目录区只能保存目录项信息,而数据区不但可以保存目录项信息,还可以保存文件内的数据。
        此处提及的目录项是一个由32 B组成的结构体,它既可以表示成一个目录,又可以表示成一个文件,其中记录着名字、长度以及数据起始簇号等信息,下表是目录项的完整结构。对于树状的目录结构而言,树的层级结构自然是通过代表着目录的目录项结构建立起来,从根目录开始经过目录项的逐层嵌套渐渐地形成了树状结构。

摘自《一个64位操作系统的设计与实现》

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

What’smean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值