FAT32文件系統
- (一)為什么要有文件系統
- (二)FAT32文件系統組成
- (三)分步介紹各部分
- (1) 首先介紹一下MBR
- (2)DBR介紹
- (3)FAT表介紹
- (4) 數據區
(一)為什么要有文件系統
文件系統是操作系統用于明確存儲設備或分區上的文件的方法和數據結構,即在存儲設備上組織文件的方法。如果沒有文件系統,那我們想找到在硬盤上保存的數據會是一件很麻煩的事情,文件系統的作用是,它負責為用戶建立文件、讀出、修改,控制文件的讀取,我們常說的格式化硬盤就是寫入文件系統。文件系統的種類有很多,而且有各自的特點,本文主要介紹FAT32文件系統。
(二)FAT32文件系統組成
FAT32文件系統由DBR及其保留扇區,FAT1,FAT2和DATA四個部分組成(下圖MBR是主引導記錄,不一定每個磁盤都有)
(三)分步介紹各部分
(1) 首先介紹一下MBR
MBR主要存儲磁盤分區相關的信息,如果存在MBR的話,那么它占用第一個扇區的512個字節,前446個字節為MBR啟動代碼(這里不關心),接下來16*4個字節為磁盤分區表,每個分區的信息要占16個字節,所以,MBR分區表最多只能保存4個分區的分區信息,最后兩個字節是結束標識0x55AA。
如果你的SD卡開頭是EB 58 90那就說明你的SD卡沒有MBR,需要重新創建MBR,創建過程可以參考SD卡移植FAT32文件系統無MBR,下面我們來看下MBR的內容:
標識 | 長度 | 介紹 | 值 |
---|---|---|---|
Active | 1字節 | 0x80表示活動分區,0x00表示非活動分區 | 0x80 |
StartHead | 1字節 | 分區的開始磁頭 | 0x20 |
StartCylSect | 2字節 | 開始柱面與扇區(柱面和扇區分別占用不同位數,有需要查資料) | 0x21 0x00 |
PartType | 1字節 | 分區類型(0x0b和0x0c都是FAT32) | 0x0c |
EndHead | 1字節 | 分區的結束磁頭 | 0xFE |
EndCylSect | 2字節 | 結束柱面與扇區(柱面和扇區分別占用不同位數,有需要查資料) | 0xff 0xE1 |
StartLBA | 4字節 | 分區的第一個扇區 | 0x00 0x08 0x00 0x00 |
Size | 4字節 | 分區總扇區數目 | 0x00 0xc0 0xf3 0x00 |
上面顯示的是小端模式(地址值存放低字節)
這么多信息,對于初學著只需要知道分區的第一個扇區和分區的大小即可,從上面可以看出起始扇區為0x00000800(注意是小端模式!!)=2048扇區,總扇區數目為0x00f3c000,那么總大小為0xf3c000*512/1024/1024/1024=7.6G
注:
(1)MBR分區方案中,有三種類型的分區,主分區、擴展分區和邏輯分區。擴展分區與邏輯分區是為了突破分區表中只能保存4個分區的限制而出現的。擴展分區不能直接使用,需要在擴展分區內劃分一個或多個邏輯分區后才能使用。
(2)一般每個扇區的容量是512字節,4個字節的扇區能表示的最大容量是2TB(2^32 * 512/1024/1024/1024=2048G=2TB),由此可知,在MBR分區表中,分區的起始位置不能大于2TB,分區的最大容量,也不能大于2TB。所以,對2TB以上容量的物理硬盤,不適合使用MBR分區方案。
有一些硬盤廠商,嘗試擴大扇區的大小,來突破MBR不適合2TB容量以上的硬盤這一限制。所以有時你會發現市場上存在的硬盤,不完全是每個扇區512字節的,有1024字節甚至2048字節每扇區的。但擴大扇區的大小,又會帶來很多其他的問題,特別是會嚴重影響硬盤的速度,所以這種方法,沒有被廣泛接受。
(2)DBR介紹
DBR是我們格式化分區時創建的,每個分區都會有DBR信息,1個DBR只能定義1個分區的系統文件,占用512個字節
從上面的MBR可知第一個分區在2048扇區(2048*512字節=0x100000)我們直接跳過去看看:
跳轉指令:EB 58 90:本身占2字節它將程序執行流程跳轉到引導程序處
OEM代號:這部分占8字節,其內容由創建該文件系統的OEM廠商具體安排。
跳轉指令之后是8字節長的OEM ID,它是一個字符串, OEM ID標識了格式化該分區的操作系統的名稱和版本號。為了保留與MS-DOS的兼容性,通常Windows 2000格式化該盤是在FAT16和FAT32磁盤上的該字段中記錄了“MSDOS 5.0”,在NTFS磁盤上(關于ntfs,另述),Windows 2000記錄的是“NTFS”。通常在被Windows 95格式化的磁盤上OEM ID字段出現“MSWIN4.0”,在被Windows 95 OSR2和Windows 98格式化的磁盤上OEM ID字段出現“MSWIN4.1”。
BPB:下面是從上圖截下的BPB內容
我們主要關注紅色字體標出的內容:
標識 | 長度 | 介紹 | 值 |
---|---|---|---|
BytesPerSec | 2字節 | 每扇區字節數,通常為512、1024、2048、4096 | 0x00 0x02 |
SecPerClus | 1字節 | 每簇扇區數,這個值不能為0,而且必須是2的整數次方,比如1、2、4、8、16、32、64、128 | 0x08 |
ResdSecCnt | 2字節 | 保留扇區數 | 0x5E 0x06 |
NumFATs | 1字節 | FAT表數目 | 0x02 |
RootEntCnt | 2字節 | FAT32固定為0 | 0x00 0x00 |
TotSec16 | 2字節 | FAT32固定為0 | 0x00 0x00 |
Media | 1字節 | 存儲介質,0xF8標準值,可移動存儲介質 | 0xf8 |
FATSz16 | 2字節 | FAT32固定為0 | 0x00 0x00 |
SecPerTrk | 2字節 | 磁道扇區數 | 0x3f 0x00 |
NumHeads | 2字節 | 磁頭數 | 0xff 0x00 |
HiddSec | 4字節 | FAT區前隱藏扇區數 | 0x00 0x08 0x00 0x00 |
TotSec32 | 4字節 | 總扇區數 | 0x00 0xC0 0xF3 0x00 |
FATSz32 | 4字節 | 一個FAT表扇區數 | 0xd1 0x3c 0x00 0x00 |
ExtFlags | 2字節 | FAT32持有 | 0x00 0x00 |
FSVer | 2字節 | FAT32持有 | 0x00 0x00 |
RootClus | 4字節 | 第一個目錄的簇號 | 0x02 0x00 0x00 0x00 |
FSInfo | 2字節 | 保留扇區數,FSINFO(文件系統信息扇區)扇區號是1,該扇區為操作系統提供關于空簇總數及下一可用簇的信息 | 0x01 0x00 |
BkBootSec | 2字節 | 通常為6 | 0x06 0x00 |
Reserved | 12字節 | 用以擴展 | 0x00 0x00 … 0x00 |
DrvNum | 1字節 | 驅動器號 | 0x80 |
Reserved1 | 1字節 | 保留 | 0x00 |
BootSig | 1字節 | 擴展引導標簽 | 0x29 |
VolID | 4字節 | 分區序列 | 0x24 0x09 0x88 0x8a |
FileSysType | 11字節 | 卷標 | 略 |
FilSysType1 | 8字節 | 系統ID | 略 |
解讀:
(1)從上面我們可以看出每扇區字節數為0x0200,即512字節
(2)每簇扇區數為0x08
(3)保留扇區數為:0x065e=1630
(4)FAT表數目為2
(5)總扇區為:0x00f3c000即15974400個扇區
(6)一個fat表扇區數:0x000003cd1即15569
(7)第一個目錄簇號0x00000002
(8)第一個fat表的扇區號=DBR所在扇區+保留扇區=2048+1630=3678
(9)第一個目錄的扇區號=第一個fat表的扇區號+2*(一個fat表扇區數)=3678+2*15569=34816
FAT32文件系統在DBR的保留扇區中安排了一個文件系統信息扇區,用以記錄數據區中空閑簇的數量及下一個空閑簇的簇號,該扇區一般在分區的1號扇區,也就是緊跟著DBR后的一個扇區,其內容如下
引導程序代碼:FAT32的DBR引導程序占用420字節,對于沒有安裝操作系統的分區來說這段程序是沒有用處的.
結束標識:DBR的結束標志與MBR,EBR的結束標志相同,為“55 AA”。
(3)FAT表介紹
文件系統分配磁盤空間按簇來分配。因此,文件占有磁盤空間時,基本單位不是字節而是簇,即使某個文件只有一個字節,操作系統也會給它分配一個最小單元:即一個簇。對于大文件,需要分配多個簇。同一個文件的數據并不一定完整地存放在磁盤中一個連續地區域內,而往往會分若干段,像鏈子一樣存放。這種存儲方式稱為文件的鏈式存儲。為了實現文件的鏈式存儲,文件系統必須準確地記錄哪些簇已經被文件占用,還必須為每個已經占用的簇指明存儲后繼的下一個簇的簇號,對于文件的最后一簇,則要指明本簇無后繼簇。這些都是由FAT表來保存的,FAT 表對應表項中記錄著它所代表的簇的有關信息:諸如是空,是不是壞簇,是否是已經是某個文件的尾簇等。
定位FAT絕對位置的方法如下:
1、首先從MBR的分區表中得知分區的起始扇區,偏移到此扇區。
2、從DBR的BPB中得知DBR的保留扇區數,FAT表的個數,FAT表的大小。
3、因此FAT1=分區起始扇區+DBR保留扇區,FAT2=分區起始扇區+DBR保留扇區+FAT1。
從上面我們計算出第一個fat表的扇區號在3678扇區,第一個目錄的扇區號34816,我們使用winhex查看一下:
第0號表項:0x0FFFFFF8,表示FAT表固定標識
第1號表項:0xFFFFFFFF,不用,默認值
第2號表項:0x0FFFFFFF,根目錄所在簇,由于此時只占用1簇,所以是結束標識
下面我們在SD卡里創建一個大于4k(每簇占8個扇區即4k,只有大于4k才占用多簇)文件,重新查看該位置的內容
此時已經看到新增加了三簇內容:該test文件簇鏈為0x05—>0x06–>0x07(結束),注意簇鏈結束標識為0x0FFFFFFF,文件大小小于一簇大小的直接占用1簇,以0X0FFFFFFF結束
(4) 數據區
數據區時真正用于存放用戶數據的區域,數據區的位置在FAT2的后面,具體定位方式如下;
1、通過MBR中的分區表信息得知分區的起始位置。
2、通過分區中DBR得知DBR的保留扇區數以及FAT表的大小,FAT表的個數。
3、通過上面的信息就可以找到數據區的起始位置,數據區 = 隱藏扇區數+DBR保留扇區+(每個FAT表扇區數*2)。
數據區的類容主要由三部分組成:根目錄,子目錄和文件內容。在數據區中是以“簇”為單位進行存儲的,2號簇被分配給根目錄使用。
數據起始扇區=根目錄起始扇區號+(簇號-2)x每簇的扇區數
注:FAT表對所有劃分后的位置由0進行地址編號。0號地址與1號地址被系統保留并存儲特殊標志內容。從2號地址開始,每個地址對應于數據區的簇號,也就是數據區起始位第2簇!FAT表中0和1號表項沒有對應物理地址。
前面我們算出第一個目錄(根目錄)的扇區號34816,我們使用winhex直接跳轉34816過去看下:
FAT32文件系統中,分區根目錄下的文件和目錄都放在根目錄區中,子目錄中的文件和目錄都放在子目錄區中,并且每32個字節為一個目錄項(FDT),每個目錄項紀錄著一個目錄或文件(也可能是多個目錄項記錄一個文件或目錄),上圖所示就是一個目錄項。
在FAT32文件系統中,目錄項可以分為四類:卷標目錄項、“.”和“…”目錄項、短文件名目錄項、長文件名目錄項。
我們分別創建SHUIYUE目錄和SHUIYUE.txt文件來看下
FDT第1字節又表明了該文件的狀態,它有如下四種取值方式:
a. 00H–目錄項的空目錄。
b. E5H–表示該目錄項曾經使用過,但文件已被刪除。
c. 2EH–表示子目錄下的兩個特殊文件 “. “或 “… “目錄項
d. 其它任何字符–表示一個文件名(或目錄名)的第一個字符的ASCII碼值.
我們來看下SHUIYUE.txt目錄項代表的東西
標識 | 長度 | 介紹 | 值 |
---|---|---|---|
deName | 8字節 | 文件名,不足部分補空格(0x20) | 0x53 0x48 0x55 0x49 0x59 0x55 0x45 0x20(SHUIYUE) |
deExtension | 3字節 | 擴展名,不足部分補空格(0x20) | 0x54 0x58 0x54(TXT) |
deAttributes | 1字節 | 文件屬性 | 0x20(存檔) |
deLowerCase | 1字節 | 系統保留 | 0x10 |
deCTime | 3字節 | 創建時間 | 0x8c 0x00 0xab |
deCDate | 2字節 | 創建日期 | 0x8d 0x51 |
deADate | 2字節 | 最后訪問的日期 | 0x8d 0x51 |
deHighClust | 2字節 | 開始簇的高兩個字節 | 0x00 0x00 |
deMTime | 2字節 | 最后修改的時間 | 0x09 0xab |
deMDate | 2字節 | 最后修改的日期 | 0x8d 0x51 |
deLowCluster | 2字節 | 開始簇的低兩個字節 | 0x06 0x00 |
deFileSize | 4字節 | 文件的大小 | 0xd8 0x21 0x00 0x00 |
從上面我們可以看出SHUIYUE.txt開始簇為0x06我們查找FAT表:
從第6簇開始,占據了3簇,我們跳到第6簇看下內容,第6簇在數據區起始扇區34816+(6-2)*8=34848
從上可以看出剛好是我們寫入的數據,其他可以自己嘗試,例如新創建一個不同大小的文件、創建子目錄觀察數據的變化。
注:
(1)目錄所在的扇區,都是以32 Bytes劃分為一個單位,每個單位稱為一個目錄項。
(2)根據文件名及后綴,我們可以分為短目錄文件,長目錄文件,簡單點理解,如果文件名>8 byte 或者后綴名>3, 則為長文件目錄,否則為短文件目錄
參考文章:
(1)FAT32長文件名短文件名目錄項
(2)詳解FAT32文件系統
(3)FAT32文件系統格式詳解
(4)FAT32文件系統詳解
(5)SD卡中FAT32文件格式快速入門(詳細圖文介紹)
(6)FAT32文件系統SD卡建立MBR引導扇區
(7)FAT32文件系統格式詳解(圖文針對具體文件存儲,分析fat32 SD卡)
(8)MBR、EBR與DBR詳解
本文章僅供學習交流用禁止用作商業用途,文中內容來水枂編輯,如需轉載請告知,謝謝合作
微信公眾號:zhjj0729