天天看點

FAT32檔案系統學習(2) —— FAT表1、題外話2、本文目錄3、FAT表的讀取 4、FAT表項5、參考文獻

origin: https://www.cnblogs.com/fantacity/p/3897933.html

1、題外話

       在繼續本文學習FAT32檔案系統之前,先來插入一點别的話題。我們都知道U盤有一個屬性是容量,就拿筆者的U盤為例,筆者手上的U盤是金士頓的DataTraveler G3 4GB的一個U盤。電腦上顯示的容量如圖1所示為3.75GB。那麼這個3.75GB是怎麼計算出來的呢?

FAT32檔案系統學習(2) —— FAT表1、題外話2、本文目錄3、FAT表的讀取 4、FAT表項5、參考文獻

圖 1 系統顯示U盤屬性

       我們先來回顧一下上一篇BPB參數當中的Sectors(扇區總數)這個參數,這一參數代表了這個U盤在出廠時的總扇區數,筆者手上這個是7884672個,可以從圖2中看到。其中每個扇區為512 B,也就是說總共可以容納4036952064 B 約為 3.76GB 的資料。但是這其中一部分是要用來存放FAT32檔案系統的相關資訊參數的,比如FAT表,BPB等。我們這邊來算一下,首先需要減去1016個保留扇區,還有兩個FAT表總共是7684 * 2 = 15368個扇區,所示還剩下的位元組數為4036952064 B - ( 1016 + 15368 ) * 512 B = 4028563456 B 正好是圖中顯示的容量。是以可以得出結論,系統顯示的U盤容量 = ( 總扇區數 - 保留扇區數 - FAT表扇區數 * FAT表個數 ) * 512 B。經計算可得實際的使用率是99.79%。是以相對與整個U盤來說,FAT32檔案系統用于存儲相關資訊部分的損耗是很小的。

FAT32檔案系統學習(2) —— FAT表1、題外話2、本文目錄3、FAT表的讀取 4、FAT表項5、參考文獻

圖 2 筆者用上一篇中寫的工具檢視了U盤的各項參數

       好了,接下來進入正題,繼續學習FAT32檔案系統的FAT表部分。

2、本文目錄

1、題外話

2、FAT表的讀取

3、FAT表項

4、參考文獻

3、FAT表的讀取

      首先FAT表一般來說有兩張,另一張用于備份。兩張表是前後緊挨在一起的,隻要計算出了FAT1表的偏移之後加上FAT表的大小就可以得到FAT2表的偏移。FAT1表的偏移位址計算公式如下[4] :

FAT1表偏移 = 保留扇區數 * 每扇區位元組數

由圖2可知,在本例中,FAT1表的偏移 = 1016 * 512 B = 520192 = 0x7F000。同理:

FAT2表的偏移 = FAT1+FAT表的大小 = (保留扇區數 + FAT表扇區數) * 每扇區位元組數

在本例中,FAT2表的偏移 = (1016 + 7684) * 512 B = 4454400 = 0x43F800。用上一篇中講到的程式可以讀取出兩張FAT表的内容,一般情況下兩張表的内容應該是完全一樣的。筆者讀取了第一張FAT表起始部分的内容,如圖3所示:

FAT32檔案系統學習(2) —— FAT表1、題外話2、本文目錄3、FAT表的讀取 4、FAT表項5、參考文獻

圖 3 FAT表起始部分内容

 4、FAT表項

       在分析FAT表之前先來說明一下FAT的構成。FAT表即檔案配置設定表(File Allocation Table)。FAT32檔案表是由一個個表項組成的一張表,其中每一個表項由一個32位的二進制組成,其值對應了相應簇的使用情況,如2号表項對應了2号簇的使用情況,3号表項對應了3号簇的使用情況,依此類推。(但是第0和第1項例外,下面會有說明)。每個表項對應數值的含義如表1所示[2]:

表項數值 對應含義
0x00000000  空閑簇,即表示可用
0x00000001 保留簇
0x00000002 - 0x0FFFFFEF 被占用的簇,其值指向下一個簇号
0x0FFFFFF0 - 0x0FFFFFF6 保留值
0x0FFFFFF7  壞簇
0x0FFFFFF8 - 0x0FFFFFFF  檔案最後一個簇

表 1 表項數值含義

       具體每一項填寫的内容規則如下表所示:如果該簇是檔案的最後一簇,填入的值為0x0FFFFFFF;如果該簇不是檔案的最後一簇,則填入的值為該檔案占用的下一簇号(是以我們可以看到在FAT32中檔案是以簇鍊的形式儲存起來的)。下面我們根據實際情況,圖3來分析一下FAT表的含義。

       FAT表第0項(0x00000000~0x00000003): 0x0FFFFF8

       FAT表第1項(0x00000004~0x00000007): 0xFFFFFFFF

       這兩項不代表任何簇的使用情況,而是FAT表的表頭,表征了媒體描述,是固定值,是以0x00和0x01這兩個簇号是不用的,簇号的下标從2開始。其中1号表項可能被用于記錄髒标志,以說明檔案系統沒有被正常解除安裝或者磁盤表面存在錯誤。接下來

       FAT表第2項(0x00000008~0x0000000B): 0x0FFFFFFF

       第2項存儲的是第2簇的使用情況,通常第2簇存儲的是檔案系統的根目錄。雖然在FAT32檔案系統中,根目錄的位置不再硬性地固定,可以存儲在分區内可尋址的任意簇内,不過通常根目錄是最早建立的(格式化就生成了)目錄表。是以,我們看到的情況基本上都是根目錄首簇緊鄰FAT2,占簇區順序上的第1個簇(即2号簇)。同時,FAT32檔案系統将根目錄當做普通的資料檔案來看,所有沒有了目錄項數的限制,在需要的時候可以配置設定空簇,存儲更多的目錄項[1]。

       這一項的值為0x0FFFFFFF ,說明根目錄占用且隻占用了1個簇。

       FAT表第3 ……

       這裡再穿插一點題外話,FAT32格式檔案配置設定的最小機關是簇。也就是說你存儲了一個實際大小1kB的檔案,那麼它占用的存儲空間還是1簇(在這裡換算成大小即為8*512B = 4KB)。筆者以一個實際的例子來說明一下:在U盤中放入一個8B大小的temp.txt檔案,然後檢視檔案屬性的時候發現其占用空間是4KB,和我們上面講的理論符合。

FAT32檔案系統學習(2) —— FAT表1、題外話2、本文目錄3、FAT表的讀取 4、FAT表項5、參考文獻

圖 4 temp.txt的大小和占用空間

       看了下篇幅也差不多了,那麼本文關于FAT表的部分到此結束。其實本來也沒多少内容,筆者想到哪就扯到哪,胡扯了些其他的東西。剩下的資料區部分就留到下一篇當中再講好了。同樣的,本文當中有一些内容是筆者自己思考了解甚至推測出來的,如果有錯誤的地方歡迎指正,以免誤人子弟了(笑)。

5、參考文獻

1、FAT32檔案系統的存儲組織結構(一) http://blog.chinaunix.net/uid-26913704-id-3213948.html

2、FAT32  http://baike.baidu.com/view/45233.htm?fr=aladdin

3、基​于​U​盤​F​A​T​3​2​文​件​系​統​的​分​析 http://wenku.baidu.com/link?url=cIKgrwV66y4CoyuOEB1-OhjRY9tnXtIAoZuYEwDCjxbyRomSIiJgBAXGxq6LudfwuopUpYhiVd8TjxrBFoVyPs0NX3OqbnoWjyn4ZAx60Wi

4、FAT 32 檔案格式 http://blog.csdn.net/shrekmu/article/details/5950414