对磁盘的物理结构。逻辑结构和存储结构有了比較深刻的了解后,咱们来细致探讨FAT32文件系统的存储组织结构。html
说到文件系统的组织结构,咱们应该当即意识到。这指的是文件系统在同一个分区内的组织结构,在这个话题上,咱们全然可以不管分区以外的所有事情。api
为了分析FAT32文件系统的存储组织结构,咱们来创建一个实实在在的文件系统:将U盘插入电脑,将U盘格式化成FAT32分区格式:数据结构
以建好的U盘FAT32文件系统为基础,如下从文件系统的各个组成来分别加以介绍。ui
分区引导扇区DBR编码
用winhex打开U盘显演示样例如如下:url
这是FAT32分区引导记录 ,定义例如如下:spa
偏移00H: 3字节的 跳转指令 EB 58 90,跳过如下的BPB和扩展BPB部分.net
偏移03H:8字节的硬盘分区类型文本字符名:4D 53 44 4F 53 35 2E 30 即: MSDOS5.0unix
偏移0BH: 25字节的分区參数块(BPB),细分例如如下:code
偏移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的文件夹项: