1. 程式人生 > 其它 >檔案系統1:FAT

檔案系統1:FAT

磁碟及分割槽介紹瞭如何分割槽,現在到達第三階段,如何格式化這些分割槽,本節介紹FAT格式
FAT格式主要有三種:FAT2,FAT16,FAT32
FAT 檔案系統之所以有 12,16,32 不同的版本之分,其根本在於FAT表用來記錄任意一簇連結的二進位制位數,這裡主要介紹FAT16和FAT32

當把一部分磁碟空間格式化為FAT檔案系統時,FAT檔案系統就將這個分割槽當成整塊可分配的區域進行規劃,以便於資料的儲存。FAT將磁碟空間按一定數目的扇區為單位進行劃分,這樣的單位稱為簇。通常情況下,每扇區512位元組的原則是不變的。簇的大小一般是\(2^n\)個扇區的大小,像512B,1K,2K,4K,8K,16K,32K,64K。實際中通常不超過32K。之所以簇為單位而不以扇區為單位進行磁碟的分配,是因為當分割槽容量較大時,採用大小為512b的扇區管理會增加FAT表的項數,對大檔案存取增加消耗,檔案系統效率不高。所以分割槽的大小和簇的取值是有關係的。

注:在檔案系統內說的扇區數,並不是物理磁碟上的扇區數,兩者不一樣,這裡的是邏輯上磁碟的扇區數,物理上是磁軌,盤面,扇區(扇區是從1開始計數),而邏輯上只有扇區(從0開始計數)

FAT16

FAT16檔案系統從根目錄所佔的32個扇區之後的第一個扇區開始以簇為單位進行資料的處理

分為5個部分:DBR區,FAT1表,FAT2表,根目錄區和資料區

DBR區

即作業系統引導記錄區(引導扇區),共512個位元組,也就是相對於分割槽H的第一個扇區

偏移 意義
0x00-0x02 跳轉指令,為了跳過之後不可執行的資料(跳到載入程式程式碼)
0x03-0x0A 廠商名稱和版本號
0x0B-0x0C 一個扇區位元組數
0x0D 每簇的扇區數量
0x0E-0x0F FAT表的起始扇區號(相對於分割槽)
0x10 FAT表的個數
0x11-0x12 根目錄項數
0x13 該分割槽上的扇區數,如果扇區數大於65536,該欄位為零,尋要用大扇區數表示
0x15 介質描述符,F8表示硬碟
0x16 每個FAT表的扇區數
0x18-0x19 每磁軌扇區數
0x1A-0x1B 磁軌數
0x1C-0x1F 隱含扇區,該分割槽之前的扇區數,該分割槽的起始扇區號
0x20-0x23 該分割槽的總扇區數,如果扇區數小於65536,該欄位為零,尋要用小扇區數表示
0x24 物理驅動器號,80表示硬碟
0x26 擴充套件引導標籤,值必須為28或29
0x27 隨機序號,有助於區分磁碟
0x36 檔案系統型別
0x5E-0X3D 載入程式程式碼
0x1FE-0x1FF 有效結束標誌55AA

這裡使用該磁碟2為例,它採用MBR分割槽,格式化為FAT16,只有一個分割槽H

這裡就不直接點選軟體DiskGenius找分割槽H了,通過查詢磁碟MBR中的分割槽表來找(如下圖),在磁碟2的0扇區的MBR分割槽表中的第一個16個位元組中的8-11個位元組為11 00 00 00(小端)表示分割槽起始扇區號,為17,所以轉到17扇區,就為分割槽H的資料

該分割槽的第一個扇區也就是DBR區,該扇區的資料如下圖,其中紅色劃線為跳轉指令,紅色框處為廠商名稱和版本號,黑色框處為結束標誌,紫色為引導程式碼,沒有顏色為一些引數資訊

FAT表

FAT1表與FAT2表同步更新,內容一樣

前兩個位元組(這裡16位元位一個位元組)表示FAT表的標識F8FFFFFF
之後每1個位元組表示一個FAT表項,簇號起始的編號就為2,每個FAT表項記錄下一個簇號
第2簇儲存根目錄檔案
FFFF表示檔案或目錄的結束簇號
FFF7表示壞簇

還是以磁碟2的分割槽H為例,DBR區中0E-0F偏移處值為8,在加上分割槽從17扇區開始,所以FAT1開始扇區為25,以下為扇區25的資料
可以看到偏移3204-3205處為2號簇,值為FFFF,說明此檔案就佔一個簇,之後的3,4,5,6號簇都如此,在7號簇,值為0008,表示下一個簇為8號簇,在8號簇,值為0009,表示下一個簇為9號簇,然後依次下去。
這裡看起來好像是順序存放的,但其實是鏈式結構,即一個檔案的儲存是靠當前簇連結到下一簇,存放不一定按順序,比如該檔案存在5號簇和7號簇,而5號簇是指向7號簇的。

根目錄區

根目錄區由多個目錄項組成,共512個目錄項,佔32個扇區,分為短檔名目錄項和長檔名目錄項
如果檔名不超過8個字元,用0x20填充,再加副檔名,此時使用短檔名目錄項來儲存
如果檔名超過8個字元則會被截斷,取前六個字元加“~1”,再加副檔名,如果有重名的“~1”中的1加1,此時會使用短檔名目錄項和長檔名目錄項來儲存

開始的時候FAT16不支援長檔名目錄項,後來FAT32支援,所以FAT16的短檔名目錄項與FAT32不同,但長檔名目錄項完全相同

短檔名目錄項

偏移 意義
00-07 檔名的ASCII碼(字母的大寫),如果檔案被刪除,第一個位元組被修改為E5
08-0A 副檔名
0B 檔案屬性,01只讀,00讀寫,02隱藏,04系統,08卷標,10目錄,20存檔,0F長檔名
0C-15 保留
16-17 最後修改時間
18-19 最後修改日期
1A-1B 檔案起始簇
1C-1F 檔案的大小位元組數

長檔名目錄項

偏移 意義
00 狀態,E5表刪除,01,02等表示序號,如果0變為4,表示這是最後一個目錄項(一個長檔名目錄項有多個目錄項)
01-0A 長檔名的第1-5個字元
0B 值為0F,長檔名目錄項標誌
0D 校驗和
0E-19 檔名第6-11個字元
1C-1F 檔名的第12-13個字元

還是以磁碟2的分割槽H為例,FAT1開始扇區為25,DBR區中0x16偏移處值為60(FAT表含有扇區數)所以根目錄區從25+60*2=145(有兩個FAT表)開始

先從第二個目錄項看,起始值為42,看到4就知道這是一個長目錄項的最後一個目錄項,2表示這個長目錄項只有兩個目錄項,它是第2個(綠框),藍框為第一個長目錄項。再看短目錄項。

00-07為53 59 53 54 45 4D 7E 31
20 20 20:這是個目錄,沒有型別
0B為16:隱藏的系統子目錄
16-17為45 A0:最後修改時間
18-19為8D 54:最後修改日期
1A-1B為02 00:也就是起始簇為第2個簇
1C-1F為00 00 00 00:檔案的大小位元組數

資料區

所有檔案,目錄資料都在此處,資料區以簇為單位進行管理,第一個簇稱為“2號簇”,根目錄檔案在“2號簇”。由上知根目錄區從145扇區開始,加上32個扇區,為177扇區,這就是資料區的開始扇區,也就是2號簇的起始。
上面舉例的那個位於第2個簇的檔案其實就是一個位於根目錄的快取檔案,也就是在177扇區,資料如下

但是這個檔案是一個目錄,對於資料夾的資料,其前面也存在兩個目錄項,一個是子目錄本身,一個是父目錄
其00-0A偏移的值分別為2E 20 20 20 20 20 20 20 20 20 20 和2E 2E 20 20 20 20 20 20 20 20 20 ,即分別表示 . 和 ..
根目錄下的資料夾,父目錄簇號是0,別的資料夾下的資料夾,其父目錄就是父目錄所在的簇號。所以上圖中子目錄本身的簇號為00 00 00 02就是2簇,父目錄簇號為00 00 00 00(最下面兩個黑框)就是0,其父目錄就是根目錄

FAT32

分為6個部分:DBR區,保留區,FAT1表,FAT2表,根目錄區和資料區
FAT32相對於FAT16區別不大,DBR有些許不同,增加了保留區,FAT表是32位表示一項

DBR區

位於分割槽的第一個扇區(再次強調:是相對於分割槽,不是相對於磁碟,磁碟的第一個分割槽,就是總體的0分割槽,是MBR,如果相對於磁碟,DBR是128扇區,從MBR引數中可以知道),與FAT16幾乎相同

偏移 意義
0x00-0x02 跳轉指令,為了跳過之後不可執行的資料(跳到載入程式程式碼)
0x03-0x0A 廠商名稱和版本號
0x0B-0x0C 扇區位元組數,這裡為0x0200即512B
0x0D 每簇的扇區數量,這裡為2
0x0E-0x0F FAT表的起始扇區號(相對於分割槽)
0x10 FAT表的個數
0x15 介質描述符
0x18-0x19 每磁軌扇區數
0x1A-0x1B 磁頭數
0x1C-0x1F 隱含扇區,該分割槽之前的扇區數,該分割槽的起始扇區號
0x20-0x23 檔案系統的總扇區數
0x24-0x27 FAT表的大小
0x2C-0x2F 根目錄所在簇號(在相對於資料區)
0x30-0x31 檔案系統資訊扇區號
0x32-0x33 DBR備份引導扇區號
0x40 BIOS裝置80是硬碟,00是軟盤
0x42 擴充套件引導標記
0x43-0x46 卷序列號
0x52-0x59 檔案系統格式
0x5A-0x1FD 載入程式程式碼,作業系統的引導程式碼
0x01FE-0x01FF 有效結束標誌

保留區

在相對於分割槽的第2扇區

偏移 意義
0x00-0x03 引導標誌為“RRaA”
0x1E8-0x1EB 空閒簇數
0x!EE-0x1EF 下個可用簇

以該磁碟3為例,只有一個分割槽I,被格式化為FAT32

其DBR區資料如下

在DBR中0x0E-0x0F表示FAT表的起始扇區號(紅線部分),其實也表明了保留區的扇區數量,值為6702(相對於分割槽),那麼FAT表起始扇區號為6702(相對於分割槽),則保留區的扇區數為6702-2(從相對分割槽的2扇區才為保留區)
保留區中,在2扇區和12扇區(相對分割槽)可能有引導程式碼的擴充套件部分,其餘部分無用,主用為了之後備份等操作

FAT表

前32位表示FAT表的標識F8FFFF0F,之後32位系統保留,再後的沒32位表示一個FAT表項,從2簇表示根目錄檔案
每個FAT表項記錄下一個簇號
FFFFFF0F表示檔案或目錄的結束簇號
FFFFFFF7表示壞簇

其FAT表如下,與FAT16方式幾乎相同

根目錄區

FAT32與FAT16不同之處在於根目錄的檔案化,即將根目錄等同於普通的檔案。這樣根目錄便沒有了FAT16中512個目錄項的限制,不夠用的時候增加簇鏈,分配空簇即可。
所以根目錄區在2簇,也就是資料區起始和根目錄區起始都在2簇
還有與FAT16除了短檔名目錄項不同外,其餘相同。

短檔名目錄項

偏移 意義
00-0A 檔名的ASCII碼(字母的大寫),如果檔案被刪除,第一個位元組被修改為E5
0B 檔案屬性,01只讀,00讀寫,02隱藏,04系統,08卷標,10目錄,20存檔,0F長檔名
0D-11 建立時間
12-13 最後訪問時間
14-15 起始簇的高16位
16-17 最後修改時間
18-19 最後修改日期
1A-1B 起始簇的低16位(高16位與低16位拼在一起就是其實簇號)
1C-1F 檔案的大小位元組數

長檔名目錄項

偏移 意義
00 狀態,E5表刪除,01,02等表示序號,如果0變為4,表示這是最後一個目錄項(一個長檔名目錄項有多個目錄項)
01-0A 長檔名的第1-5個字元
0B 值為0F,長檔名目錄項標誌
0D 校驗和
0E-19 檔名第6-11個字元
1C-1F 檔名的第12-13個字元

著重說明“根目錄等同於普通的檔案”這一特點,在該分割槽的根目錄區,檢視和FAT16例子中相同的位於根目錄的快取檔案,將高低16位拼在一起為 00 00 00 03 ,表示這個檔案在3簇,與FAT16不同

結構對比

資料區

與FAT16相同

參考:
http://www.sjhf.net/pdf/fat.pdf