FAT32文件系统的存储组织结构(一)
对磁盘的物理结构。逻辑结构和存储结构有了比較深入的了解后,我们来细致探讨FAT32文件系统的存储组织结构。
说到文件系统的组织结构,我们应该立即意识到。这指的是文件系统在同一个分区内的组织结构,在这个话题上,我们全然能够无论分区之外的全部事情。
为了分析FAT32文件系统的存储组织结构,我们来建立一个实实在在的文件系统:将U盘插入电脑,将U盘格式化成FAT32分区格式:
以建好的U盘FAT32文件系统为基础,以下从文件系统的各个组成来分别加以介绍。
分区引导扇区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: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字节的扩展分区參数块(扩展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:未用 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
0FB6C640660FB6D180E23FF7E286CDC0ED0641660FB7C966F7E1668946F8837E1
6007538837E2A007732668B461C6683C00CBB0080B90100E82B00E94803A0FA7DB
47D8BF0AC84C074173CFF7409B40EBB0700CD10EBEEA0FB7DEBE5A0F97DEBE0
98CD16CD196660663B46F80F824A00666A0066500653666810000100807E02000F8
52000B441BBAA558A5640CD130F821C0081FB55AA0F851400F6C1010F840D00FE4
602B4428A56408BF4CD13B0F96658665866586658EB2A6633D2660FB74E1866F7F1
FEC28ACA668BD066C1EA10F7761A86D68A56408AE8C0E4060ACCB80102CD13666
10F8254FF81C300026640490F8571FFC34E544C445220202020202000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000
00000000000000D0A52656D6F7665206469736B73206F72206F74686572206D656469
612EFF0D0A4469736B206572726F72FF0D0A507265737320616E79206B657920746F2
0726573746172740D0A0000000000ACCBD80000
偏移1FEH:有效扇区结束标志 55 AA
到此分区引导扇区介绍结束。
文件分配表FAT
简单介绍:
FAT表(文件分配表),是FAT文件系统中用于磁盘数据索引和定位而引进的一种链式结构。在FAT文件系统中,文件的存储按照FAT表制定的簇链式数据结构来进行。同一时候,FAT文件系统将组织数据时使用的文件夹也抽象为文件,以简化对数据的管理。
FAT1表位置的定位:
在我们前面介绍分区引导记录的时候提到,在偏移0EH处存储了保留扇区的个数。这个保留扇区数指的就是当前分区内DBR到FAT表之间的全部扇区的个数(包含DBR但不包含FAT表)。因此,我们能够定位FAT表所在的起始偏移位置了,即24H*200H=4800H。我们贴出4800H处得部分内容例如以下:
显然没有错,这就是我们FAT1所存储的位置,仅仅是当前没有存储文件,所以FAT比較简单罢了。
FAT2表位置的定位:
在我们前面介绍分区引导记录的时候提到,在偏移24H处存储了FAT表所占用的扇区个数,我们又知道FAT2是紧邻FAT1的,所以能够非常easy得到FAT2的存储位置的偏移地址:FAT1的起始偏移地址+FAT1的大小=4800H+1DEEH*200H=3C2400H,我们贴出3C2400H处的部分内容例如以下:
显然没有错,这就是我们FAT2所存储的位置,内容与FAT1同样。
FAT表的特性:
FAT表由一系列大小相等的FAT表项组成。它有例如以下特性:
FAT32中每一个簇的簇地址,使用32bit(4个字节)记录在FAT表中。FAT表中的全部字节位置以4个字节为单位进行划分,并对全部划分后的位置由0进行地址编号。0 号地址与1号地址被系统保留并存储特殊标志内容。
从2号地址開始。每一个地址相应于数据区的簇号,FAT表中的地址编号与数据区中的簇号同样。我们称FAT中的这些地址为FAT表项,FAT表项中记录的值称为FAT表项值。
当文件系统被创建,也就是进行格式化操作时,分配给FAT区域的空间将会被清空,在FAT1与FAT2的0号表项与1号表项写入特定值。因为创建文件系统的同一时候也会创建根文件夹,也就是为根文件夹分配了一个簇空间,通常为2号簇。所以2号簇所相应的2号FAT表项也会被写入一个结束标记。
假设某个簇未被分配使用。它所相应的FAT表项内的FAT表项值即用0进行填充。表示该FAT表项所相应的簇未分配使用。
当某个簇已被分配使用时,则它相应的FAT表项值也就是该文件的下一个存储位置的簇号。假设该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记,对于FAT32而言。代表文件结束的FAT表项值为0x0FFFFFFF。
假设某个簇存在坏扇区,则整个簇会用FAT表项值0x0FFFFFF7标记为坏簇。不再使用,这个坏簇标记就记录在它所相应的FAT表项中。
因为簇号起始于2。所以FAT表的0号表项与1号表项不与不论什么簇相应。
FAT32的0号表项值总是“F8FFFF0F”。1号表项可能被用于记录脏标志。以说明文件系统没有被正常卸载或者磁盘表面存在错误。只是此值似乎并不重要,因此我们仅仅要了解就能够。正常情况下,1号表项值为“FFFFFFFF”或“FFFFFF0F"。
在文件系统中新建文件时,假设新建的文件仅仅占用一个簇。为其分配的簇所相应的FAT表项将会被写入结束标记。假设新建的文件不仅仅占用一个簇,则在其所占用的每一个簇相应的FAT表项中写入为其分配的下一簇的簇号,在最后一个簇相应的FAT表项中写入结束标记。
新建文件夹时,仅仅为其分配一个簇的空间,相应的FAT表项中写入结束标记。当文件夹增大超出一个簇的大小时。将会在空暇空间中继续为其分配一个簇。并在FAT表中为其建立FAT表链以描写叙述它所占用的簇情况。
对文件或文件夹进行删除操作时,它们所相应的FAT表项将会被清空,设置为0以表示其所相应的簇处于未分配状态。
根文件夹区
简单介绍:
在FAT32文件系统中,根文件夹的位置不再硬性地固定,能够存储在分区内可寻址的随意簇内,只是通常根文件夹是最早建立的(格式化就生成了)文件夹表。所以,我们看到的情况基本上都是根文件夹首簇紧邻FAT2,占簇区顺序上的第1个簇(即2号簇)。同一时候,FAT32文件系统将根文件夹当做普通的数据文件来看,全部没有了文件夹项数的限制,在须要的时候能够分配空簇,存储很多其它的文件夹项。
起始偏移地址定位:
根文件夹起始扇区=保留扇区数+FAT×2+(起始簇-2)x每簇的扇区数。在我们前面介绍分区引导记录的时候提到,偏移2CH处保存了根文件夹起始簇号是2,所以求得根文件夹起始扇区是24H+1DEEH*2H+(2-2)*8H=3C00H,即求得偏移地址3C00H*200H=780000H,我们贴出780000H处的部分内容例如以下:
文件夹区的一个文件夹项占用32个字节,能够是长文件名称文件夹项、文件文件夹项、子文件夹项等。
短文件名称格式的文件夹项
对于短文件名称格式的文件夹项。其參数意义例如以下:
根据參数定义,我们来分析一下上图的文件夹项 54 45 53 54 5F 46 41 54 33 32 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的一个重要的特点是全然支持长文件名称。长文件名称依旧是记录在文件夹项中的。
为了低版本号的OS或程序能正确读取长文件名称文件,系统自己主动为全部长文件名称文件创建了一个相应的短文件名称,使相应数据既能够用长文件名称寻址,也能够用短文件名称寻址。
不支持长文件名称的OS或程序会忽略它觉得不合法的长文件名称字段,而支持长文件名称的OS或程序则会以长文件名称为显式项来记录和编辑,并隐藏起短文件名称。
当创建一个长文件名称文件时,系统会自己主动加上相应的短文件名称。其原则例如以下:
(1)、取长文件名称的前6个字符加上"~1"形成短文件名称。扩展名不变。
(2)、假设已存在这个文件名称。则符号"~"后的数字递增,直到5。
长文件名称的实现有赖于文件夹项第12字节属性字节,当此字节的值为0FH时,支持长文件名称的系统会将其当做长文件名称的根据,而仅仅支持短文件名称的系统会觉得是异常而忽略掉。
系统将长文件名称以13个字符为单位进行分割。每一组占领一个文件夹项。所以可能一个文件须要多个文件夹项,这时长文件名称的各个文件夹项按倒序排列在文件夹表中,以防与其它文件名称混淆。
长文件名称中的字符採用unicode形式编码,每一个字符占领2字节的空间。其文件夹项定义如:
以下是我建立的长文件名称文件夹abcdefghijklmnopqrstuvwxyz1234567890的文件夹项: