FAT32 檔案系統詳解

Iflyinsky2013發表於2017-02-27

#PS:要轉載請註明出處,本人版權所有

#PS:這個只是 《 我自己 》理解,如果和你的

#原則相沖突,請諒解,勿噴

最近有個專案是做STM32裸機開發的,由於需要用到USB向android系統傳輸資料,先考慮USB HID Class,但是考慮到驅動和後續要支援讀取SD問題,進而採用USB MS Class作為傳輸資料的載體。模擬一個帶FAT32檔案系統的儲存裝置。

模擬裝置基本資訊:總容量8MB,除去MBR,DBR,FSINFO,FAT,等,大概還有7.8MB左右的容量。

這篇文章主要用於講解FAT32的詳細結構,同時也詳解儲存介質和檔案系統的關係。

讀這篇文章時,以假設你對FAT32 具備一定的瞭解,至少你知道FAT32由哪些地方組成。現在網上的資料,就我查詢來看,都沒有介紹MBR,大部分都直接從DBR開始講起來,而模擬一個儲存裝置,MBR是一切的起點,只要搞清楚MBR,我們就可以順著線,瞭解所有。

如果對文中的一些詞語不瞭解,請多百度。

此外,此文章是我檢視許多資料而融合而來,向前人致敬!!!

1 儲存介質

    由於我們的儲存介質是由儲存載體(磁面或者儲存晶片)和 讀寫機構組成。如硬碟的磁面和磁頭部分等等。這就解決了怎麼物理級讀取資料的問題,而作業系統的儲存驅動正是做這個事情的。驅動提供介面讓我們可以在儲存介質上讀寫數。
    我們雖然可以通過驅動向儲存介質寫資料,但是都是很低階的寫,同時,我們寫入的大部分是檔案,而很少有人直接往磁碟儲存檔案中的二進位制資料吧,而不儲存檔案的其他資訊吧,並且這樣是很難管理的(如:我要取一個檔案,就是說我要的是人記住這個檔案在儲存介質的那個位置,是那幾個位元組)。為了方便管理,有了檔案系統的概念,檔案系統可以提供方便的儲存檔案各種資訊的方法。
    FAT檔案系統是一個小容量類常用的檔案系統,容量太大了就不太適合使用FAT系檔案系統。FAT由FAT12 FAT16 FAT32,我們今天主要就是介紹FAT32.

2 FAT32

    由於網上這方面的資料很多,我主要是介紹一些網上現有資料讓我迷惑的一些地方。同時通過程式碼的方式,讓我們知道各個組成部分到底是怎麼回事。
    FAT32 由 MBR DBR FSINFO FAT1 FAT2 DATA(DATA = DIR + FILE_DATA) 組成。
    MBR是主開機記錄,主要作用是為了標示一個分割槽的資訊而設立的。
//0 扇區
uint8_t FAT32_MBR[80]={
    0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,/*DPT 開始位*/0x80/**/,0x01/**/,
    0x01/**/,0x00,0x0B,0xFE/**/,0x3F,0x00,  0x3F,0x00,0x00,0x00/*4bytes下個分割槽的扇區地址*/,  0x82,0x3e,0x00,0x00/*4bytes為SD卡總的扇區個數(16002個)*/,0x00,0x00/**/,
    0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,
    0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,
    0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x55,0xAA/**/,

};

MBR決定DBR的起始位置,DBR儲存FAT表資訊。

//DOS BOOT RECORD
//DBR=引導程式碼+BPB+擴充套件BPB+校驗
//FAT1 = 63+34
//FAT2 = 63+34+123 = 220
//DATA = 63+34+123+123 = 343
//ROOT-DIR = 343
uint8_t FAT32_DBR[96]={

    0xEB,0x58,0x90/*(0x0-0x2)跳轉指令*/,0x4D,0x53,0x44,0x4F,0x53,0x35,0x2E,0x30/*(0x3-0xA)OEM區域:MSDOS5.0*/,0x00,0x02/*(0xB-0xC)每扇區位元組數*/,0x01/*(0xD)每簇扇區數*/,0x22,0x00/*(0xE-0xF)保留扇區數*/,
    0x02/*(0x10)FAT數(Number of FAT) 該分割槽上FAT的副本數*/,0x00,0x00/*(0x11-0x12)FAT32必須等於0,FAT12/FAT16為根目錄中目錄的個數;*/,0x00,0x00/*(0x13-0x14)FAT32必須等於0,FAT12/FAT16為扇區總數*/,0xF8/*(0x15),哪種儲存介質,0xF8標準值,可移動儲存介質,常用的 0xF0*/,0x00,0x00/*(0x16-0x17)FAT32必須為0,FAT12/FAT16為一個FAT 表所佔的扇區數*/,0x3F,0x00/*(0x18-0x19)每磁軌扇區數,只對於有“特殊形狀”(由磁頭和柱面每 分割為若干磁軌)的儲存介質有效,63(0x00 3F)*/,0xFF,0x00/*(0x1A-0x1B)磁頭數,只對特殊的介質才有效,255(0x00 FF)。*/,0x3F,0x00,0x00,0x00/*(0x1C-0x1F)DBR分割槽之前所隱藏的扇區數,63,與MBR中地址0x1C6開始的4個位元組數值相等*/,
    0x82,0x3E,0x00,0x00/*(0x20-0x23)檔案系統總扇區數,16002*/,0x7B,0x00,0x00,0x00/*(0x24-0x27)每個FAT表佔用扇區數,123*/,0x00,0x00/*(0x28-0x29),標記,此域FAT32 特有*/,0x00,0x00/*(0x2A-0x2B)FAT32版本號0.0,FAT32特有*/,0x02,0x00,0x00,0x00/*(0x2C-0x2F),根目錄所在第一個簇的簇號,2。(雖然在FAT32檔案系統 下,根目錄可以存放在資料區的任何位置,但是通常情況下還是起始於2號簇) */,
    0x01,0x00/*(0x30-0x31),FSINFO(檔案系統資訊扇區)扇區號1,該扇區為操作 系統提供關於空簇總數及下一可用簇的資訊*/,0x06,0x00/*(0x32-0x33),備份引導扇區的位置。備份引導扇區總是位於檔案系統 的6號扇區*/,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00/*(0x34-0x3F),用於以後FAT 擴充套件使用*/,
    0x80,0x00/*(0x40-0x41),與FAT12/16 的定義相同,只不過兩者位於啟動扇區不同的位置而已*/,0x29/*(0x42),擴充套件引導標誌,0x29。與FAT12/16 的定義相同*/,0xAF,0xE3,0xB5,0x10/*(0x43-0x46),卷序列號。通常為一個隨機值*/,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
    0x20,0x20/*(0x47-0x51)卷標(ASCII碼),如果建立檔案系統的時候指定了卷 標,會儲存在此*/,0x46,0x41,0x54,0x33,0x32,0x20,0x20,0x20/*(0x52-0x59)檔案系統格式的ASCII碼,FAT32*/,0x00,0x00,0x00,0x00,0x00,0x00,};


FSINFO

//檔案系統資訊扇區,位於DBR 後一個扇區
//64扇區
uint8_t FAT32_FSINFO[48]={
    0x52,0x52,0x61,0x41/*擴充套件引導標籤*/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,
    0x00,0x00,0x00,0x00/**/,0x72,0x72,0x41,0x61/*FSINFO簽名“0x72724161”*/,0x66,0x3D,0x00,0x00/*檔案系統的空簇數,15788*/,0x15,0x00,0x00,0x00/*下一可用簇號(0x 00 00 00 15)*/,
    0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x55,0xAA/**/,
};

FAT表儲存哪些簇已經被分配

//97扇區,FAT1
//220,FAT2
uint8_t FAT32_FAT[28]={
    0xF8,0xFF,0xFF,0x0F, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0x0F, 0x04,0x00,0x00,0x00 , 
    0x05,0x00,0x00,0x00, 0x06,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0x0F

};

同理通過DBR和FAT表我們可以推算出DIR所在的扇區,同時,也可以推算出DATA所在的扇區,然後我們就可以模擬一個帶FAT32檔案系統的儲存裝置。

注意:文中的一些地方要結合其他的FAT32文章基礎來看,我只是很直白的表達了,到底介質上存了什麼才會讓OS認出這就是FAT32,容量多大。

#PS:請尊重原創,不喜勿噴

#PS:要轉載請註明出處,本人版權所有.

有問題請留言,看到後我會第一時間回覆

相關文章