FAT和EXFAT文件系統


文件系統整體結構

文件系統

文件系統是操作系統用於明確磁盤或分區上的文件的方法和數據結構;即在磁盤上組織文件的方法.在移動存儲設備上比較常用的有FAT文件系統和ExFAT文件系統。

FAT分區依據FAT表中每個簇鏈的所占位數分為fat12、fat16、fat32三種格式;

exFAT是為了解決FAT32等不支持4G及其更大的文件而推出的文件系統。

知識點

bios

bios(basic input output system),他是一組固化在計算機主板上ROM芯片上的程序,保存着計算機最重要的基本輸入輸出程序,開關機自薦程序和系統自啟動程序.他可以從CMOS上讀寫系統設置的具體信息,主要為計算機提供最底層,最直接的硬件設置和控制.

MBR扇區

MBR(master boot record)即主引導扇區(或記錄),位於整個硬盤的0柱面0磁頭1扇區(即硬盤的第一個扇區),bios在執行完自己固有的程序后會jump到MBR的第一條指令,並將系統的控制權交由MBR,總共1個扇區的主引導記錄,MBR引導程序戰前446字節(0h~1bdh),隨后的64字節(1beh~1fdh)為DPT(disk partitiontable),最后為"55 aa"結束符.
MBR具有公共引導的特性,與具體的操作系統無關,具有唯一性.  

名詞解釋

FAT :   File Allocation Table.文件分配表
EXFAT:  Extended File Allocation Table .擴展文件分配表
BPB:   BIOS Parameter block.BIOS參數塊
BS:     Boot Sector.啟動扇區
LSN:   Logical Sector Number.邏輯扇區號
PSN:   Physical Sector Number.物理扇區號
LBA:   Logical Block Address.邏輯塊地址

FAT12

采用12位文件分配表
最大簇總數4085(2的12次方)
最大分區容量8M (4096clusters × 4sectors/clusters × 512bytes/sectors)
只能是8.3格式的文件名(短名)

FAT16

采用16位的文件分配表
最大簇總數65524(2的16次方)
最大分區容量2G
嚴重缺陷:大容量磁盤利用效率低

FAT32

采用32位的文件分配表
最大簇總數(2的32次方)
單個文件不能大於4G
當分區小於512M時,Fat32不會發生作用
不超過8GB的分區中,FAT32分區格式的每個簇都固定為4KB
Fat32不能保持向下兼容

注:可以通過WinHex查看磁盤分區信息

FAT表數據結構

FAT表是一一對應於數據區簇號的列表,文件系統分配磁盤空間是按簇來分配,因此,文件占用磁盤空間時,基本單位是簇。
FAT表是根據簇數來和文件對應的。第一個存放數據的簇是簇2。
FAT表項的大小與FAT類型有關,FAT12的表項為12-bit,FAT16為16-bit,FAT32則為32-bit.
FAT32的FAT表項只有28-bit可以使用,所以他的高4位保留。FAT32在扇區號為6的地方完整地拷貝了一份啟動扇區的備份,包括BPB的內容。

FATType的判定條件

FAT類型(FATType)的檢測(是FAT12,或是FAT16,還是FAT32)只能通過計算FAT卷中數據區所占的簇數(CountofClusters)來判定,沒有其他辦法。

FAT目錄結構

對於FAT12/FAT16,根目錄存儲在磁盤中固定的地方,它緊跟在最后一個FAT表后。根目錄的扇區數也是固定的,可以根據**BPB_RootEntCn**t計算得出。

FAT32的根目錄由簇鏈組成,其扇區數不確定,根目錄的第一個扇區號存儲在BPB_RootClus中,根目錄不同於其他的目錄,沒有日期和時間戳,也沒有目錄名,同時根目錄里沒有“.”和“..”這兩個目錄項。根目錄另一個特殊的地方在於,根目錄中有一個設置 ATTR_VOLUME_ID 位的文件,這個文件在整個FAT卷中是唯一的。
FAT的32-byte 目錄項結構

DIR_NTRes
當文件只有短名時,該短名的大小寫規則如下:

1. 此值為18H時,文件名和擴展名都小寫。
2. 此值為10H時,文件名大寫而擴展名小寫。
3. 此值為08H時,文件名小寫而擴展名大寫。
4. 此值為00H時,文件名和擴展名都大寫。

DIR_Attr
DIR_Attr

長名與短名規則

短文件名(8+3name)是FAT16遺留下來的,為了兼容windows以后的版本文件和目錄都有長名和短名。
長名目錄項和對應的別名(短名)目錄項的存儲有以下6個處理原則:

1.取長文件名的前6個字符加上“~1”形成長文件名的別名(即短文件名),並將長文件名中最后一部分(最后一個間隔符“.”后面字符)的前3個字符作為其擴展名。  
2.如果已存在這個名字的文件,則符號“~”后的數字會自動增加  
3.任何包括小寫字母的文件名都被看作是長文件名,而不管其長度是多少。  
4.長文件名存儲在屬性標志為OFH的32字節目錄登記項中(這是與短文件名目錄項的區別)。用Unicode格式編碼,每個字符(無論是英文或是漢字)均占2字節。  
6.每個目錄登記項用26個字節存儲13個字符(序號由第1字節指定)。位置多余時,先用00h表示結束,再用FFH填充。  
7.長文件名用若干個長名目錄項保存,長文件名目錄項倒序排在文件短目錄項前面。  

Windows9x會根據應用程序的性質分別給予不同的文件名,16位應用程序得到8.3格式的文件名,而32位應用程序得到長文件名。

注:盡量不要在根目錄下創建長文件名!

FAT計算公式

根目錄所占的扇區數(RootDirSectors):

RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytePerSec - 1)) / BPB_BytePerSec;

數據區的起始地址(FirstDataSector) :

FirstDataSector = BPB_RsvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;

其中,FATSz可以由下面條件獲取:  
If(BPB_FATSz16 != 0)  
    FATSz = BPB_FATSz16;  
Else  
    FATSz = BPB_FATSz32;  

由於每一個存放數據的簇是簇2,所以數據區的起始地址也相當於簇2 的起始地址,由此可以得到下面的一個計算公式。
給一個合法的簇號N(N>=2),可以由該簇號計算得出該簇的每一個扇區號:

FirstSectorofCluster =((N - 2)* BPB_SecPerClus + FirstDataSector)

數據區中的扇區數(DataSec):

DataSec=TotSec - FirstDataSector;

其中,TotSec可以由下面條件獲取:
If(BPB_TotSec16 != 0)
    TotSec = BPB_TotSec16;
Else
    TotSec = BPB_TotSec32;

數據區中的總簇數(CountofClusters):

CountofClusters = DataSec / BPB_SecPeClus;

某個簇號在FAT表中的位置:
A)簇N在第一個FAT表中的扇區數(ThisFATSecNum):

ThisFATSecNum = BPB_RsvdSecCnt + (FATOffset / BPB_BytePerSec);

其中FATOffset可以由下面條件獲取:
If(FATType == FAT16)
{
    FATOffset = N*2;
}
Else If(FATType == FAT32)
{
    FATOffset = N*4;
}

B)簇N在第一個FAT表中所在扇區的偏移(ThisFATEntOffset):

ThisFATEntOffset = FATOffset % BPB_BytePerSec;

*注:以上的計算結果都是四舍五入的。

EXFAT

單個文件大小突破4GB的限制,最大可達到32GB、
分區大小突破之前32GB的限制,最大可達到2TB。
內部結構調整,實現同樣功能的操作,相比較之前的FAT系統,減少讀寫設備的次數。
對DBR表,文件名,文件目錄項等,增加校驗字段,提高數據安全性。
簇大小可高達32MB。
采用了剩余空間分配表,剩余空間分配性能改進。
同一目錄下最大文件數可達65535個。

exfat文件系統內部結構分配如下:
exfat文件系統內部結構

Exfat的Boot區最少為24個扇區,分成BOOT區和備份BOOT區,兩個區各12個扇區。
跳轉指令 EB 76 90 也是EXFAT的type識別碼

EXFAT目錄

根目錄比較特殊,下面有三個特殊的目錄項。具體如下:

其中第一個目錄項不知道有何具體用意。
第二個目錄項0x81,表示簇堆分配表文件。
第三個目錄項0x82,表示大寫表文件。
EXFAT普通目錄下沒有“.”和“..”目錄項。
特殊目錄項只存在根目錄下,有卷標目錄項、位映射目錄項和大寫表目錄項,分別記錄分區卷標,簇堆分配表文件和大寫表文件。

EXFAT簇堆分配表

簇堆分配表,記錄分區上所有簇的使用情況。每一個bit代表一個簇,0表示空簇,1表示該簇已被占用。起始簇號從2開始,也就是BIT0對應簇號2,BIT1對應簇號3。簇堆分配表以文件存儲的方式存在,一般對應根目錄下第一個文件,也就是第二個目錄項。他的大小由總簇數決定,占用N個簇的空間。

EXFAT大寫轉換表

大寫表是一張Unicode字符映射圖,每一個字符占用2個字節。文件名比較時,先把文件名格式轉換成Unicode,再通過該表把文件名轉成大寫Unicode,轉換完成后才進行文件名比較。大寫表中的數據進行了部分壓縮,壓縮起始標志碼FFFFh,隨后跟一個壓縮長度。

注:硬盤的物理結構

磁盤結構圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM