1. 程式人生 > >FAT32檔案系統結構分析

FAT32檔案系統結構分析

        FAT,英文為File Allocation Table,文件分配表。先要記住幾個概念:
        扇區:一般扇區為512個位元組。
        簇:由若干個扇區組成,是存取資料的最小單位。如果簇大小為16K,檔案大小為1位元組,那也要用一個簇來存,而且該簇不用再拿來他用。

        FAT檔案系統就是專門管理這些簇的。一個檔案可能佔據一個或者多個簇,按正確的順序去讀取這些簇,就可以獲取這個檔案的內容了。

一、FAT32基本結構

FAT32基本結構依次為:DBR及其保留扇區、FAT表1、FAT表2、根目錄和資料區。

1、DBR及其保留扇區

        DBR是檔案系統的引導扇區,位於第0號扇區,它記錄著檔案系統的起始位置、大小、FAT表個數及大小等相關資訊。後面跟著由若干個扇區組成的保留扇區,保留扇區的大小記錄在DBR中。

0x00~0x02:3位元組,跳轉指令。
0x03~0x0A:8位元組,檔案系統標誌和版本號,這裡為MSDOS5.0。
0x0B~0x0C:2位元組,每扇區位元組數,0x0200=512位元組
0x0D~0x0D:1位元組,每簇扇區數,0x08個。
0x0E~0x0F:2位元組,保留扇區數,0x0C22=3106個。
0x10~0x10:1位元組,FAT表個數,0x02。
0x11~0x12:2位元組,FAT32必須等於0,FAT12/FAT16為根目錄中目錄的個數;
0x13~0x14:2位元組,FAT32必須等於0,FAT12/FAT16為扇區總數。
0x15~0x15:1位元組,哪種儲存介質,0xF8標準值,可移動儲存介質。
0x16~0x17:2位元組,FAT32必須為0,FAT12/FAT16為一個FAT 表所佔的扇區數。
0x18~0x19:2位元組,每磁軌扇區數,只對於“特殊形狀”(由磁頭和柱面分割為若干磁軌)的儲存介質有效,0x003F=63。
0x1A~0x1B:2位元組,磁頭數,只對特殊的介質才有效,0x00FF=255。
0x1C~0x1F:4位元組,EBR分割槽之前所隱藏的扇區數,0x0004A800=305152又出現了呢,與MBR中地址0x1C6開始的4個位元組數值相等。
0x20~0x23:4位元組,檔案系統總扇區數,0x00E83800=15218688
0x24~0x27:4位元組,每個FAT表佔用扇區數,0x000039EF=14831
0x28~0x29:2位元組,標記,此域FAT32 特有。
0x2A~0x2B:2位元組,FAT32版本號0.0,FAT32特有。
0x2C~0x2F:4位元組,根目錄所在第一個簇的簇號,0x02。(雖然在FAT32檔案系統下,根目錄可以存放在資料區的任何位置,但是通常情況下還是起始於2號簇)
0x30~0x31:2位元組,FSINFO(檔案系統資訊扇區)扇區號0x01,該扇區為作業系統提供關於空簇總數及下一可用簇的資訊。
0x32~0x33:2位元組,備份引導扇區的位置。備份引導扇區總是位於檔案系統的6號扇區。
0x34~0x3F:12位元組,用於以後FAT 擴充套件使用。
0x40~0x40:1位元組,與FAT12/16 的定義相同,只不過兩者位於啟動扇區不同的位置而已。
0x41~0x41:1位元組,與FAT12/16 的定義相同,只不過兩者位於啟動扇區不同的位置而已 。
0x42~0x42:1位元組,擴充套件引導標誌,0x29。與FAT12/16 的定義相同,只不過兩者位於啟動扇區不同的位置而已
0x43~0x46:4位元組,卷序列號。通常為一個隨機值。
0x47~0x51:11位元組,卷標(ASCII碼),如果建立檔案系統的時候指定了卷標,會儲存在此。
0x52~0x59:8位元組,檔案系統格式的ASCII碼,FAT32。
0x5A~0x1FD:共410位元組,引導程式碼。
0x1FE~0x1FF:簽名標誌“55 AA”。 

2、FSINFO扇區

        FAT32在保留區中增加了一個FSINFO扇區,用以記錄檔案系統中空閒簇的數量以及下一可用簇的簇號等資訊,以供作業系統作為參考。FSINFO資訊扇區一般位於檔案系統的1號扇區,結構非常簡單。

0x200~0x203:4個位元組,擴充套件引導標誌“52 52  61  41”。
0x204~0x3E3:480個位元組,未使用,全部置0。
0x3E4~0x3E7:4個位元組,FSINFO簽名“72  72  41  61”。
0x3E8~0x3EB:4個位元組,檔案系統的空簇數,FF  FF  FF  FF,這個值感覺有問題,格式化SD卡新建一個小於4K的檔案,此處的值變成1C  F6  FE,所以上面的值應該為0x1FF6FF,猜測可能是由於格式化之後就會將此處置FF,新建檔案後才會恢復。
0x3EC~0x3EF:4個位元組,下一可用簇號(0x00000002)。
0x3F0~0x3FD:14個位元組,未使用。
0x3FE~0x3FF:2個位元組,“55 AA”標誌。 
溫馨提示:通常情況下,檔案系統的2號扇區結尾也會被設定“55 AA”標誌。6號扇區也會有一個引導扇區的備份,相應的7號扇區應該是一個備份FSINFO資訊扇區,8號扇區可以看做是2號扇區的備份。

2、FAT1:FAT的含義是檔案分配表,FAT32一般有兩份FAT,FAT1是第一份,也是主FAT。

      FAT2:FAT2是FAT32的第二份檔案分配表,也是FAT1的備份,跟在FAT1的後面。

        檔案系統用簇作為基本單位來存放檔案的資料。對於小檔案,只需要用到一個簇來儲存檔案的所有資料。對於大檔案,就需要分配多個簇,存放同一個檔案的簇不一定連續,這就需要把簇的前後關係用FAT表來存放表示。

        與FAT16類似,FAT32用32bit來描述一個簇。第0、1、2、3個位元組表示第0個簇,第4、5、6、7個位元組表示第1個簇,第8、9、10、11個位元組表示第2個簇…就這樣,每個簇都有4個和它對應的位元組,這4個位元組裡面存放的資料就是檔案中下一個簇大小資料所在的簇號。
        比如要讀new.txt檔案,從根目錄中找到了它,讀它的根目錄資訊知道它的第一個簇的簇號是5,於是把第5號簇的資料送出去,在FAT表中5號簇是第20、21、22、23位元組來表示的,於是去讀第20、21、22、23位元組,得到00000007,知道了檔案接下來的資料儲存在7號簇中,把7號簇的資料送出去,又去讀第28、29、30、31位元組的資料,得到FFFFFFFF,說明檔案到末尾了。

3、根目錄和資料區:

        根目錄就是儲存盤中有哪些檔案,該檔案相關資訊的地方。用32位元組表示一個物件。當從檔案系統中讀檔案的時候,比如讀TEST.txt檔案就是先在根目錄中找到該檔案,然後讀它的資訊,得到它的起始簇號,接著把起始簇號的資料送出去,然後去FAT表得到接下來資料儲存的簇號,把對於資料送出去,一直到結束。

0x00-0x07:檔名,不足8個位元組0x20補全(短檔名8.3命名規則)
0x08-0x0A:副檔名
0x0B:檔案屬性,0x20表示歸檔
0x0D:建立時間的10毫秒位
0x0E-0x0F:檔案建立時間
0x10-0x11:檔案建立日期
0x12-0x13:檔案最後訪問日期
0x14-0x15:檔案起始簇號的高16位 0x0000
0x16-0x17:檔案最近修改時間
0x18-0x19:檔案最近修改日期
0x1A-0x1B:檔案起始簇號的低16位 0x0003
0x1C-0x1F:檔案的長度,0x2206=8710bytes=8.5K