FAT32格式理解

1 硬盤結構

這裏寫圖片描述
由上面可知,主引導記錄MBR中的分區表有4個分區項目,每個分區項可以放一個主分區,也就是表中的基本分區,或者放一個基本分區。所以系統最多有四個主分區,但是如果我們想要更多的分區的話,我們可以放擴展分區,一個擴展分區可以擴展無限個邏輯分區。上圖有三個主分區,一個擴展分區,擴展分區擴展爲2個邏輯分區。
擴展分區是如何擴展的呢,其實,每個邏輯分區的頭部都有一個字段指向下一個邏輯分區,但最後一個時,就不指向了。
這裏寫圖片描述

2 MBR

主引導記錄共有512字節,佔用一個扇區,前面446字節爲啓動代碼,後面64字節,每個16字節指向一個分區。MBR最後兩個字節固定爲“55aa”。這是是否爲有效MBR的判斷。

3 FAT32文件系統

FAT32文件系統主要包括三個部分:DBR(dos boot record),FAT表區,數據區。
這裏寫圖片描述

3.1 DBR區

即DOS引導記錄,大小爲512個字節。它一定是位於文件系統的最開始,存放啓動代碼。

3.2 FAT表區

FAT區內存放的是FAT表,對於FAT文件系統來說FAT表至關重要,因此在FAT表1後面還有一份FAT表2,二者的內容完全一樣,FAT2作爲備份,當FAT1出現錯誤或損壞時對其進行恢復。
FAT表其實就是一張表,它的每一項大小爲4個字節,按照順序,從第二項開始分別對應着數據區裏的每一個簇(第0項和第1項保留給系統使用)。FAT表內項裏的內容表示下一個數據存放的簇號,如果已經是最後一簇了則項裏的內容爲0XFFFFFFFF
FAT表裏的每一項的作用:表明相應的簇被佔領;指向下一個簇。
項裏面的數據表示意義如圖:
這裏寫圖片描述

3.3 數據區

數據區分爲兩個部分:根目錄區和實際數據區。

3.3.1 根目錄區:

根目錄區,一般位於數據區的最開始位置,裏面存放着根目錄下的文件或者文件夾的信息。
根目錄區裏每一項爲32byte,如下:

//fat32短目錄項結構
struct
{
    uchar        file_name[8];    //文件名,不足用空格(0x20)填充
    uchar        ext_name[3];    //擴展名(後綴名),不足用空格(0x20)填充
    uchar        attribute;    //屬性:0:讀寫;1只讀;10隱藏;100系統;1000卷標;10000子目錄;100000歸檔,0x0f表示是長目錄結構;(除0xf外其他爲二進制值)
    uchar        reserved;    //系統保留
    uchar        milli_time;    //創建時間的10毫秒位
    FDT_TIME    create_time;    //文件創建時間
    FDT_DATE    create_date;    //文件創建日期
    FDT_DATE    last_visit_date;    //文件最後訪問日期
    ushort        high_clus;    //文件起始簇號的高16位
    FDT_TIME    change_time;    //文件的最近修改時間
    FDT_DATE    change_date;    //文件的最近修改日期
    ushort        low_clus;    //文件起始簇號的低16位
    uint        file_length;    //文件的長度
}SHORT_FDT32;

3.3.2 實際數據區

實際數據區與FAT表區的一一對應,FAT表區的0,1項用作它用,所以FAT表區從2開始。也就是FAT表區的第2項,對應着實際數據區的第一個簇,即0-4k位置,FAT表區的第3項,對應着實際數據區從4k-8k位置,依次類推。

4 FAT32文件系統大致實現

例如,現在根目錄下存放着兩個文件1.txt和2.txt。根目錄分區就會有兩個記錄,每個爲32byte。假設1.txt文件有20k大小,系統一個簇爲4k,所以1.txt要佔5個簇,即再FAT1表中佔5個項。
這裏寫圖片描述
假設現在應用程序要打開讀取1.txt文件,我們現在根目錄區中找到1.txt那一項,找到1.txt的對應項之後,我們可以看到兩個字段字段high_clus,low_clus,將這兩個簇組合起來後,我們就可以得到1.txt的起始簇,假設得到1.txt的起始簇是4,那麼接下來,我們就到FAT1表區中找到第4個項,然後我們查看該項,發現它是指向第8項的,第8又指向7,依次類推,所以1.txt所在的地址爲
4->8 ->7 ->6->10
總共5個簇,共20k,假如第一簇的地址在磁盤10000處,那麼,文件1.txt在
10000+4*4k –> 10000+8*4k –> 10000+7*4k 。。。。。
假如根目錄區中除了放1.txt,2.txt兩個文件外,還放了home這個文件夾時,找法還是和1.txt文件一樣,不過根目錄區中相應的32byte項的attribute 字段應當填子目錄,表明這個是文件夾。然後所找到的簇所對應的實際數據區中的數據不是和1.txt一樣放文件內容,而是放着和根目錄區一樣的目錄項(每項32字節大小)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章