天天看點

FAT32檔案系統的存儲組織結構

     為了分析FAT32檔案系統的存儲組織結構,我們來建立一個實實在在的檔案系統:将U盤插入電腦,将U盤格式化成FAT32分區格式:

​​

FAT32檔案系統的存儲組織結構

​​

以建好的U盤FAT32檔案系統為基礎,下面從檔案系統的各個組成來分别加以介紹。

分區引導扇區DBR

用winhex打開U盤顯示如下:

​​

FAT32檔案系統的存儲組織結構

​​

這是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處得部分内容如下:

​​

FAT32檔案系統的存儲組織結構

​​

     顯然沒有錯,這就是我們FAT1所存儲的位置,隻是目前沒有存儲檔案,是以FAT比較簡單罷了。

FAT2表位置的定位:

     在我們前面介紹分區引導記錄的時候提到,在偏移24H處存儲了FAT表所占用的扇區個數,我們又知道FAT2是緊鄰FAT1的,是以可以很容易得到FAT2的存儲位置的偏移位址:FAT1的起始偏移位址+FAT1的大小=4800H+1DEEH*200H=3C2400H,我們貼出3C2400H處的部分内容如下:

​​

FAT32檔案系統的存儲組織結構

​​

      顯然沒有錯,這就是我們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處的部分内容如下:

​​

FAT32檔案系統的存儲組織結構

​​

     目錄區的一個目錄項占用32個位元組,可以是長檔案名目錄項、檔案目錄項、子目錄項等。

                                          短檔案名格式的目錄項  

   對于短檔案名格式的目錄項。其參數意義如下:

​​

FAT32檔案系統的存儲組織結構

​​

   根據參數定義,我們來分析一下上圖的目錄項 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位元組的空間。其目錄項定義如:

​​

FAT32檔案系統的存儲組織結構

​​

下面是我建立的長檔案名檔案夾abcdefghijklmnopqrstuvwxyz1234567890的目錄項:

​​

​​