1、FAT32文件系统的存储组织结构(一) (2012-05-19 16:57) 标签: FAT32 文件系统 分类: 文件系统 对磁盘的物理结构,逻辑结构和存储结构有了比较深入的了解后,我们来仔细探讨FAT32文件系统的存储组织结构。说到文件系统的组织结构,我们应该马上意识到,这指的是文件系统在同一个分区内的组织结构,在这个话题上,我们完全可以不管分区之外的所有事情。 为了分析FAT32文件系统的存储组织结构,我们来建立一个实实在在的文件系统:将U盘插入电脑,将U盘格式化成FAT32分区格式: 以建好的U盘FAT32文件系统为基础,下面从文件系统的各个
2、组成来分别加以介绍。 分区引导扇区DBR 用winhex打开U盘显示如下: 这是FAT32分区引导记录 ,定义如下: 偏移00H: 3字节的 跳转指令 EB 58 90,跳过下面的BPB和扩展BPB部分 偏移03H:8字节的硬盘分区类型文本字符名:4D 53 44 4F 53 35 2E 30 即: MSDOS5.0 偏移0BH: 25字节的分区参数块(BPB),细分如下: 偏移0BH:扇区字节数 00 02 即0X0200,512字节 偏移0DH:每簇扇区数 08即每簇包括8个扇区 偏移0EH:保留扇区数 24 00即保留36个扇区 偏移10H:
3、FAT表份数 02即两个FAT表 偏移11H:未用 00 00 偏移13H:未用 00 00 偏移15H:介质类型 F8即本地硬盘 偏移16H:未用 00 00 偏移18H:每磁道扇区数 3F 00 即每磁道63扇区 偏移1AH:磁头数 FF 00即255个磁头 偏移1CH:隐藏扇区数 80 1F即8064个隐藏扇区 偏移20H:磁盘总扇区数 80 F0 77 00即总共7860352个扇区(7860352*512=4024500224,因为我的U盘是4G) 偏移24H:52字节的扩展分区参数块(扩
4、展BPB),细分如下: 偏移24H:FAT表占用扇区数 EE 1D 00 00即FAT表占7662个扇区 偏移28H:未用 00 00 00 00 偏移2CH:根目录入口簇号 02 00 00 00即根目录从02号簇开始 偏移30H:文件系统信息扇区号 01 00即扇区1 偏移32H:备份引导扇区的位置 06 00即6号扇区(第7个扇区),从WINHEX中我们也可以看到,6号扇区的内容和0号引导扇区内容 是 一样的 偏移34H:未用 00 00 00 00 00 00 00 00 00 00 00 00 偏移40H:物理磁盘号 00 偏移41H
5、未用 00 偏移42H:扩展引导标志 29即0X29 偏移43H:磁盘序列号F1 2A 27 04通常为一随机数 偏移47H:卷标ASCII 4E 4F 20 4E 41 4D 45 20 20 20 20 即NO NAME 偏移52H:文件系统格式ASCII 46 41 54 33 32 20 20 20即FAT32 偏移5AH:分区引导代码 420字节: 33C98ED1BCF47B8EC18ED9BD007C884E028A5640B408CD137305B9FFFF8AF166
6、 0FB6C640660FB6D180E23FF7E286CDC0ED0641660FB7C966F7E1668946F8837E1 6007538837E2A007732668B461C6683C00CBB0080B90100E82B00E94803A0FA7DB 47D8BF0AC84C074173CFF7409B40EBB0700CD10EBEEA0FB7DEBE5A0F97DEBE0 98CD16CD196660663B46F80F824A00666
7、A0066500653666810000100807E02000F8 52000B441BBAA558A5640CD130F821C0081FB55AA0F851400F6C1010F840D00FE4 602B4428A56408BF4CD13B0F96658665866586658EB2A6633D2660FB74E1866F7F1 FEC28ACA668BD066C1EA10F7761A86D68A56408AE8C0E4060ACCB80102CD1
8、3666 10F8254FF81C300026640490F8571FFC34E544C445220202020202000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000 00000000000000D0A52656D6F7665206469736B73206F72206F74686572206D656469
9、 612EFF0D0A4469736B206572726F72FF0D0A507265737320616E79206B657920746F2 0726573746172740D0A0000000000ACCBD80000 偏移1FEH:有效扇区结束标志 55 AA 到此分区引导扇区介绍结束。 文件分配表FAT 简介: FAT表(文件分配表),是FAT文件系统中用于磁盘数据索引和定位而引进的一种链式结构。在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录
10、也抽象为文件,以简化对数据的管理。 FAT1表位置的定位: 在我们前面介绍分区引导记录的时候提到,在偏移0EH处存储了保留扇区的个数,这个保留扇区数指的就是当前分区内DBR到FAT表之间的所有扇区的个数(包括DBR但不包括FAT表)。因此,我们可以定位FAT表所在的起始偏移位置了,即24H*200H=4800H。我们贴出4800H处得部分内容如下: 显然没有错,这就是我们FAT1所存储的位置,只是当前没有存储文件,所以FAT比较简单罢了。 FAT2表位置的定位: 在我们前面介绍分区引导记录的时候提到,在偏移24H处存储了FAT表所占用的扇区个数,我们
11、又知道FAT2是紧邻FAT1的,所以可以很容易得到FAT2的存储位置的偏移地址:FAT1的起始偏移地址+FAT1的大小=4800H+1DEEH*200H=3C2400H,我们贴出3C2400H处的部分内容如下: 显然没有错,这就是我们FAT2所存储的位置,内容与FAT1相同。 FAT表的特性: FAT表由一系列大小相等的FAT表项组成,它有如下特性: FAT32中每个簇的簇地址,使用32bit(4个字节)记录在FAT表中。FAT表中的所有字节位置以4个字节为单位进行划分,并对所有划分后的位置由0进行地址编号。0 号地址与1号地址被系统保留并存储特殊
12、标志内容。从2号地址开始,每个地址对应于数据区的簇号,FAT表中的地址编号与数据区中的簇号相同。我们称FAT中的这些地址为FAT表项,FAT表项中记录的值称为FAT表项值。 当文件系统被创建,也就是进行格式化操作时,分配给FAT区域的空间将会被清空,在FAT1与FAT2的0号表项与1号表项写入特定值。由于创建文件系统的同时也会创建根目录,也就是为根目录分配了一个簇空间,通常为2号簇,所以2号簇所对应的2号FAT表项也会被写入一个结束标记。 如果某个簇未被分配使用,它所对应的FAT表项内的FAT表项值即用0进行填充,表示该FAT表项所对应的簇未分配使用。
13、 当某个簇已被分配使用时,则它对应的FAT表项值也就是该文件的下一个存储位置的簇号。如果该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记,对于FAT32而言,代表文件结束的FAT表项值为0x0FFFFFFF。 如果某个簇存在坏扇区,则整个簇会用FAT表项值0x0FFFFFF7标记为坏簇,不再使用,这个坏簇标记就记录在它所对应的FAT表项中。 由于簇号起始于2,所以FAT表的0号表项与1号表项不与任何簇对应。FAT32的0号表项值总是“F8FFFF0F”。1号表项可能被用于记录脏标志,以说明文件系统没有被正常卸载或者磁盘表面存在错误。不过此值似乎并不重要
14、因此我们只要了解就可以。正常情况下,1号表项值为“FFFFFFFF”或“FFFFFF0F"。 在文件系统中新建文件时,如果新建的文件只占用一个簇,为其分配的簇所对应的FAT表项将会被写入结束标记。如果新建的文件不只占用一个簇,则在其所占用的每个簇对应的FAT表项中写入为其分配的下一簇的簇号,在最后一个簇对应的FAT表项中写入结束标记。 新建目录时,只为其分配一个簇的空间,对应的FAT表项中写入结束标记。当目录增大超出一个簇的大小时,将会在空闲空间中继续为其分配一个簇,并在FAT表中为其建立FAT表链以描述它所占用的簇情况。 对文件或目录进行删除操作时
15、它们所对应的FAT表项将会被清空,设置为0以表示其所对应的簇处于未分配状态。 根目录区 简介: 在FAT32文件系统中,根目录的位置不再硬性地固定,可以存储在分区内可寻址的任意簇内,不过通常根目录是最早建立的(格式化就生成了)目录表。所以,我们看到的情况基本上都是根目录首簇紧邻FAT2,占簇区顺序上的第1个簇(即2号簇)。同时,FAT32文件系统将根目录当做普通的数据文件来看,所有没有了目录项数的限制,在需要的时候可以分配空簇,存储更多的目录项。 起始偏移地址定位: 根目录起始扇区=保留扇区数+FAT×2+(起始簇-2)x每簇的扇区数,在我们前面介绍分区引导记
16、录的时候提到,偏移2CH处保存了根目录起始簇号是2,所以求得根目录起始扇区是24H+1DEEH*2H+(2-2)*8H=3C00H,即求得偏移地址3C00H*200H=780000H,我们贴出780000H处的部分内容如下: 目录区的一个目录项占用32个字节,可以是长文件名目录项、文件目录项、子目录项等。 短文件名格式的目录项 对于短文件名格式的目录项。其参数意义如下: 根据参数定义,我们来分析一下上图的目录项 54 45 53 54 5F 46 41 54 33 3
17、2 20 08 00 00 00 00 00 00 00 00 00 00 19 95 10 3F 00 00 00 00 00 00。其中起始11字节54 45 53 54 5F 46 41 54 33 32 20 是卷标TEST_FAT32;第12字节08指示当前目录项保存的是卷标;第23-24字节19 95即9519H,是最近修改时间:19点40分50秒;第25-26字节10 3F即3F10H,是最近修改日期:2011年8月16日; 长文件名格式的目录项 FAT32的一个重要的特点是完全支
18、持长文件名。长文件名依然是记录在目录项中的。为了低版本的OS或程序能正确读取长文件名文件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的OS或程序会忽略它认为不合法的长文件名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。 当创建一个长文件名文件时,系统会自动加上对应的短文件名,其原则如下: (1)、取长文件名的前6个字符加上"~1"形成短文件名,扩展名不变。 (2)、如果已存在这个文件名,则符号"~"后的数字递增,直到5。 长文件名的实现有
19、赖于目录项第12字节属性字节,当此字节的值为0FH时,支持长文件名的系统会将其当做长文件名的依据,而只支持短文件名的系统会认为是异常而忽略掉。系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。 长文件名中的字符采用unicode形式编码,每个字符占据2字节的空间。其目录项定义如: 下面是我建立的长文件名文件夹abcdefghijklmnopqrstuvwxyz1234567890的目录项: 博客推荐文章 · FAT32和NTFS文件系统 (2012-02-07 1
20、1:48:18) · FAT32文件系统的存储组织结构(一) (2012-05-19 16:57:56) · FAT32文件系统的存储组织结构(二) (2012-05-19 17:40:57) · Linux mount/umount (2012-05-31 15:25:12) · Linux下USB从(USB gadget) 驱动配置与使用 (2012-04-18 16:41:56) FAT32文件系统的存储组织结构(二) (2012-05-19 17:40) 标签: FAT32 文件系统 分类: 文件系统 前面已经基于一个格式化的空
21、U盘分析了一下FAT32文件系统存储的组织结构,下面我们从文件操作的角度来分析一下文件系统的运作机制。由于换了个U盘,所以仍然贴出刚格式化的空U盘的几个重要的数据区如下: 我们可以看出,在分区格式化的时候,系统将卷标TEST_FAT32存储在2号簇,即跟目录区,如上面根目录贴图所示。同时,在FDT区2号簇标记位置写入了文件结束符FF FF FF 0F。显然,FAT32文件系统将目录当做普通文件来处理的。 下面我们在根目录下新建一个文件夹TEST1,看会有什么变化: 建立了TEST1文件夹后,FDT变成如下: 根目录变成如下: 重新分配了3号簇: 从上面的变化可以
22、直观的看出,系统在新建文件夹时完成了如下动作: a.在父目录所在簇上建立新的目录项,存储当前所建文件夹信息。 b.分配一个新簇,给新建的文件夹建立两个目录项:父目录和当前目录。 c.在FDT表中新分配的簇对应的位置上写下文件结束符。 d.建立各部分的链路关系:新建文件夹所对应的目录项的文件起始簇号字段写上新分配簇的簇号,新簇上的两个目录项的文件起始簇号字段分配写上父目录所在簇号(此处是0,本来我以为是2,即根目录所在簇,不知道为什么,可能特地用0指示根目录吧)和当前簇号(此处是3)。 为了验证我们上面分析的正确性,我们再在TEST1文件夹下建立
23、新文件夹TEST11,看是否做了如下操作: a.在父目录(即TEST1)所在簇(即3号簇)上建立新的目录项,存储TEST11文件夹信息。 b.分配一个新簇(应该是4号簇),给新建的文件夹(即TEST11)建立两个目录项:父目录和当前目录。 c.在FDT表中新分配的簇(应该是4号簇)对应的位置上写下文件结束符。 d.建立各部分的链路关系:新建文件夹(即TEST11)所对应的目录项的文件起始簇号字段写上新分配簇的簇号(应该是4号簇),,新簇上的两个目录项的文件起始簇号字段分配写上父目录所在簇号(3号簇)和当前簇号(应该是4号簇)。 新建TEST
24、11文件夹后FDT变成: 根目录没有变化: 3号簇变成: 新分配4号簇: 显然我们的估计没有错的,也进一步证明我们前面的分析是正确的。 下面我们再分析建立文件的情况 我们先建立一个100字节的文件TEST.TXT,然后把这个文件拷贝到U盘的根目录下,FDT变成如下: 根目录变成: 新分配5号簇保存文件内容: 从上面的变化可以直观的看出,系统新建文件和新建文件夹所完成的操作是一样一样的: a.在父目录所在簇上建立新的目录项,存储当前所建文件信息。 b.分配一个新簇,存储新建的文件的内容。 c.在FDT表中新分配的簇
25、对应的位置上写下文件结束符。 d.建立链路关系:新建文件所对应的目录项的文件起始簇号字段写上新分配簇的簇号。 结束总结: 1.在FAT32文件系统中,目录和文件的存储采用统一的方式。 2.文件系统的操作的单位是簇,每新建立一个文件或文件夹,至少会重新分配一个簇号。 3.如果一个文件或目录的内容要多个簇才能存储得下,则系统会分配多个簇来存储文件或目录的内容 4.当需要多个簇时,这些簇可能连续也可能不连续,但无论是连续或是不连续,系统都是采用FDT链表的形式来组织的。 · (2012-05-31 15:25:12)






