FAT32 檔案系統詳解
#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:要轉載請註明出處,本人版權所有.
有問題請留言,看到後我會第一時間回覆
相關文章
- FAT32 檔案系統 (轉)
- 檔案系統(四):FAT32檔案系統實現原理
- 檔案系統(五):exFAT 檔案系統原理詳解
- WINDOWS系統檔案詳解Windows
- Linux檔案系統詳解Linux
- Linux 檔案系統詳解Linux
- Windows系統檔案詳解(轉)Windows
- NFS網路檔案系統詳解NFS
- 分散式檔案系統FastDFS詳解分散式AST
- Linux 建立檔案系統及掛載檔案系統詳解一薦Linux
- 磁碟檔案系統Fat、Fat32、NTFS、exFAT的優缺點
- 轉換windows xp的fat32為ntfs(檔案系統fs)Windows
- NTFS、exFAT、FAT32、Ext4檔案系統的區別
- ocfs2檔案系統使用詳解
- Linux 系統配置檔案詳細解讀Linux
- Unix檔案系統和pwd命令實現詳解
- 詳解 Linux 中的虛擬檔案系統Linux
- Centos7系統---檔案壓縮與解壓命令詳解。CentOS
- 共享系統檔案(瞭解)
- Cnetos7系統---檔案壓縮與解壓命令詳解。
- Linux系統檢視檔案地址常用的命令詳解!Linux
- Linux系統常見檔案大小常用的命令詳解!Linux
- Linux教程-系統管理-/etc下的檔案詳解(轉)Linux
- Oracle 重要檔案系統解釋Oracle
- 詳解GPFS檔案系統架構、組網和Building Block架構UIBloC
- Windows系統中鮮為人知啟動檔案詳解(轉)Windows
- Dockerfile檔案詳解Docker
- mtl檔案詳解
- cmake檔案詳解
- BMP檔案詳解
- LD檔案詳解
- 檔案和檔案系統
- 詳解Linux 2.6核心新檔案系統變化機制(轉)Linux
- Linux系統篇-檔案系統&虛擬檔案系統Linux
- UNIX根檔案系統和附加檔案系統
- 【PG體系結構】Postgresql 配置檔案詳解SQL
- SD卡中FAT32檔案格式快速入門(圖文詳細介紹)【轉】SD卡
- 檔案系統