FAT32(File Allocation Table)是一種32位的FAT檔案系統,微軟在1996年8月發布,
FAT32的數字32是下面會講到的FAT中每個表項的長度,
磁盤(硬碟)是資料的載體,而檔案系統則是將這些資料以某種合理的結構組織起來方便作業系統的管理,
借此文分析一下微軟的FAT32檔案系統格式:(本文分析的FAT32磁區是D盤,大小為128MB!環境為VMware虛擬機下的XP系統!)
FAT32由4個部分組成,分別是DBR,FAT1,FAT2和DATA,如圖:

DBR:該磁區的引導程式,在DBR的結尾部分會有一些重要的保留扇區(這些保留扇區屬于DBR,圖中未畫出)
FAT1:FAT的首要檔案分配表
FAT2:檔案分配表的備份
DATA:資料區(最小單位為簇(cluster),一般2個扇區為1簇,是微軟規定的一種磁盤存盤單位,與Linux的block概念類似)
FAT32的DBR結構圖:

紅色:跳轉指令,將當前執行流程跳轉到引導程式處,占2位元組,對應匯編JUMP 58H; NOP;
藍色:OEM代號,由創建該檔案系統的廠商規定,占8位元組,一般為”MSDOS5.0”
綠色:BPB(BIOS Paramter Block),從DBR的第12個位元組開始共占用79位元組,記錄了檔案系統的重要資訊,相關欄位引數見下表
粉紅色:DBR引導程式,如果該磁區沒安裝作業系統那么這段程式是沒用的
黃色:DBR結束標記
BPB表: | ||
偏移 | 位元組 | 含義 |
BH | 2 | 每扇區的位元組個數 |
DH | 1 | 每簇扇區數 |
EH | 2 | 保留的扇區個數 |
10H | 1 | FAT個數 |
11H | 2 | 不使用(根目錄數量,FAT32已突破此限制,已無效,一般為0) |
13H | 2 | 不使用(扇區總數,小于32M時才使用) |
15H | 1 | 存盤介質描述符 |
16H | 2 | 不使用(FAT占的扇區數,小于32M時才使用) |
18H | 2 | 每磁道扇區個數 |
1AH | 2 | 磁頭數 |
1CH | 4 | 隱藏扇區 |
20H | 4 | 扇區總數(大于32M時使用) |
24H | 4 | FAT占的扇區數(大于32M時使用) |
28H | 2 | 擴展標記 |
2AH | 2 | 版本,一般為0 |
2CH | 4 | 根目錄的首簇號 |
30H | 2 | 檔案系統整體資訊扇區號 |
32H | 2 | DBR備份所在的扇區號 |
34H | 12 | 保留,固定為0 |
40H | 1 | BIOS驅動器號 |
41H | 1 | 不使用,一般為0 |
42H | 1 | 擴展引導標記 |
43H | 4 | 卷序列號 |
47H | 11 | 卷標 |
52H | 8 | 檔案系統型別名,固定為”FAT32 ” |
FAT32檔案系統在DBR的保留扇區中有一個檔案系統資訊扇區,用以記錄資料區中空閑簇的數量及下一個空閑簇的簇號,該扇區一般在磁區的LAB1扇區,也就是緊跟著DBR后的一個扇區,其內如下:

褐色:擴展引導標簽,為52 52 61 41,ASCII為”RRaA”
青色:檔案系統資訊簽名,為72 72 41 61,ASCII為”rrAa”
藍色:空閑簇的數量,(1FBB0)=129968,每個簇1K,約等于127MB,即D盤的大小
紫色:下一個空閑簇的簇號
黃色:結束標記
其他位元組:不使用,填充0
由于FAT緊跟在DBR的保留扇區之后,所以定位到最后一個保留扇區,那么下一個扇區就是FAT啦!
在上面的DBR圖中可以找到保留扇區的個數為20H=32(20 00是小端表示法),所以DBR往后32個扇區就是首要FAT啦,如圖:

FAT以4位元組(32位)為一個表項,每個表項值的含義:
0x0000 0000 | 空閑簇,可用簇 |
0x0000 0001 | 保留簇 |
0x0000 0002 ~ 0x0FFF FFEF | 該簇已用,其值指向下一個簇號 |
0x0FFF FFF0 ~ 0X0FFF FFF6 | 這些值保留,不使用 |
0x0FFF FFF7 | 壞簇,當一個簇中有一個扇區損壞(如物理損壞、病毒感染)時稱為壞簇,這個簇將不被FAT32使用 |
0x0FFF FFF8 ~ 0x0FFF FFFF | 檔案的最后一個簇 |
每個表項的值對應了相應簇的使用情況,如2號表項對應了2號簇的使用情況,3號表項對應了3號簇的使用情況,注意的是,最開頭的兩個表項是不使用的,它們代表FAT的表頭,其值是固定的0xFFF FFF8和0xFFFF FFFF,所以!FAT32中不存在0號簇和1號簇,第1個簇是2號簇!畫張圖:

如果該簇是檔案的最后一簇,填入的值為0x0FFFFFFF,如果該簇不是檔案的最后一簇,則填入的值為該檔案占用的下一簇號(所以可以看出在FAT32檔案系統中檔案是以簇鏈表的形式保存起來的),
2號表項存盤的是2號簇的使用情況,一般2號簇(也就是檔案系統的第1個簇)存盤的是檔案系統的根目錄,雖然在FAT32中,根目錄的位置不再硬性固定,可以存盤在磁區內可尋址的任意簇內,不過通常根目錄是最早建立的(格式化時)目錄,所以基本上都是根目錄首簇緊鄰FAT2,占簇區順序上的第1個簇(即2號簇),同時,FAT32將根目錄當做普通的資料檔案,所有沒有了目錄個數的限制,在需要的時候可以分配空簇,這一項(2號表項)的值為0x0FFFFFFF ,說明當前根目錄占了1個簇的大小,
現在來分析資料區,資料區是緊接在FAT2之后的,所以在DBR往后(保留扇區+FAT1占用的扇區+FAT2占用的扇區)個扇區就是資料區啦,如圖(這是資料區的第一個扇區,也是第一個簇的前半部分):

發現前11位元組是我們的卷標!

而在BPB中卷標那項的值永遠是”NO NAME ”,也就是說卷標被移動到了資料區的前11位元組,而且FAT32卷標最長11位元組(因為BPB中已經規定了),而NTFS已經突破了這個限制,
其實,卷標是根目錄下的第一個檔案!
現在來分析一下FAT32下檔案和目錄之間是如何組織的,如何存盤的,如何保存屬性的:
先低級格式化D盤,以確保磁區干凈(指的是資料區全填充為0),

低級格式化完成(如果磁區較大,低格的速度會變慢,耐心等待)之后,查看一個首要FAT表,

有一個表項,它的值為FFF FFFFH,意思就是結束簇,這就是我們的根目錄啦,再查看一個根目錄所在的起始簇,

發現前兩行(32位元組)有資料,后面全是0,然后我們在D盤(根目錄)下粘貼一個空檔案(在其他盤(如C盤)新建一個文本檔案,然后復制到D盤,下面會講為什么不能直接在D盤新建檔案,而非要從其他盤復制),

再去首要FAT中查看變化,發現沒有變化,看起來新建的檔案不占表項,再去根目錄所在簇查看一下,

發現!多了2行(32位元組),這就是我們剛剛新建(其實是粘貼)的空檔案A.TXT啦,現在我們要引入一個FAT32下短檔案目錄項概念了,來個表格,
位元組偏移 | 位元組數 | 說明 | |
0H | 8 | 檔案名 | |
8H | 3 | 后綴名,擴展名,型別名 | |
BH | 1 | 檔案屬性 | 0000 0000B, 0H 讀寫 |
0000 0001B, 1H 只讀 | |||
0000 0010B, 2H 隱藏 | |||
0000 0100B, 4H 系統 | |||
0000 1000B, 8H 卷標 | |||
0001 0000B, 10H 子目錄 | |||
0010 0000B, 20H 歸檔 | |||
CH | 1 | 保留 | |
DH | 1 | 創建時間的10毫秒位 | |
EH | 2 | 創建時間 | |
10H | 2 | 創建日期 | |
12H | 2 | 最后一次訪問的日期 | |
14H | 2 | 起始簇號的高16位 | |
16H | 2 | 最近一次修改的時間 | |
18H | 2 | 最近一次修改的日期 | |
1AH | 2 | 起始簇號的低16位 | |
1CH | 4 | 檔案長度 | |
可以看出檔案長度為0,起始簇號高16位為0H,低16位也為0H,也就是指向0號簇,但是0號簇不存在,所以此檔案不存在起始簇,也就驗證了檔案長度為0,現在我們用記事本打開此檔案,向其中寫幾個單詞,
再來看看此檔案的屬性,

現在先去看一下首要FAT的變化,

哈哈,多了一個表項哦,這個多的表項的值也是FFF FFFFH,也就是結束簇,我們再去根目錄所在簇看看,

發現了沒,起始簇號和檔案長度都發現了相應的變化,圖中給出了計算值,這符合前面用右鍵查看的A.TXT屬性,且起始簇號為3也是正確的,因為簇號2被根目錄所占用,那么下一個簇號就是3啦,現在我們去簇號3看看,

現在我們將A.TXT增加到幾KB(我從網上找了微軟的百度百科復制了其中一段),這里需要注意,因為我這個D盤的簇大小僅僅為1KB,所以大于1KB就可以完成本步驟的實驗了,如果你們的簇大小為NKB,那么A.TXT需要大于NKB才行,

然后我們先去根目錄查看一下,

數值又發生了變化,但是一定和上圖的屬性中一樣,這里不再計算,然后我們再去首要FAT看一下,

發現,多了6項,且原來的3號表項已經不是FFF FFFFH了,取而代之的是9號表項變成了FFF FFFFH,這樣就形成了簇鏈,檔案系統讀取時就通過這個單鏈表讀取,我們簡單計算一下,A.TXT最多占7個簇(第7個簇恰好全部用完,即占用空間的大小),最少占6個簇(第7個簇只用了1個位元組),那么推測出A.TXT大小在[6144+1,7168]位元組,而A.TXT在其的屬性截圖中大小為6546位元組,占用空間為7168位元組,完全符合,
現在我們來看一下FAT32的長檔案目錄項格式(現在基本用的都是長檔案名啦),
位元組偏移 | 位元組數 | 說明 |
0H | 1 | 第7位:保留 |
第6位:1表示長檔案最后一個目錄項 | ||
第5位:保留 | ||
第0~4位:順序號 | ||
1H | 10 | Unicode檔案名第1部分 |
BH | 1 | 長檔案名目錄項標志,值默認FH |
CH | 1 | 保留 |
DH | 1 | 校驗值(根據短檔案名計算) |
EH | 12 | Unicode檔案名第2部分 |
1AH | 2 | 起始簇號 |
1CH | 4 | Unicode檔案名第3部分 |
我們再從其他盤復制過來一個長檔案名的空文本檔案,

查看一下根目錄,

長檔案名是以鏈表方式存盤的,所以能存很長很長的檔案名,檔案名結束符為’\0’,即0H,如果結束符之后還有剩余的Unicode字符則以FFH填充,在長檔案目錄項的最后兩行是它的短目錄項存盤格式哦,簡單說一下為什么長檔案目錄項第1行第1位元組為43H,下圖,

至此,簡單的FAT32組織結構已經介紹完了,歡迎讀者深入探究,
附上,一篇寫FAT32不錯的博文:https://blog.csdn.net/yangyang031213/article/details/79030247
來說一下為什么上面要復制其他盤的檔案到D盤,因為直接在D盤新建一個文本檔案是“新建 文本檔案.txt”,然后我們將它重名名為“NEW.TXT”,然后在winhex查看,發現還是存在一個“新建 文本檔案.txt”的,只不過是洗掉狀態的,所以為了避免這項因素的干擾,我就選擇了從其他盤復制檔案過來,
附上簇的取值范圍表:
磁區大小 | FAT32默認簇大小 |
32~256M | 中間還分多個擋位:512B,1K,2K |
257M~8G | 4K |
8G~16G | 8K |
32G~2T | 32K |
題外話,也算是一個練習,驗證網上說的“FAT32最大只能存放4G的檔案”:
因為FAT32中目錄項中每個檔案的檔案長度是4位元組,4位元組最大能尋址的位元組數為2的32次,換算為G就是4G啦,即2^32B/1024^3=4G,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/30611.html
標籤:Windows
