概述架構
起先全部的FAT文件系統都是爲IBM PC機器而設計的,這說明了一個重要的問題:FAT文件系統在磁盤上的數據是用「小端」(Little Endian)結構存儲的。咱們使用4個8-bit的字節——起始字節爲byte[0],結束字節爲byte[3]——來存儲一個32-bit的FAT項(FAT entry)。而後分別給這32位編號爲00-31,從下面的圖咱們能夠清楚地看到這32位是如何排序的。spa
這對於那些使用「大端」(big-endian)存儲結構的機器就顯得尤其重要,由於在磁盤存取數據以前,必須先完成Big-Endian到Little-Endian之間的轉換。每一個FAT文件系統都由4部分組成,這些基本區域按以下順序排列。操作系統
0——保留區(Reserved Region);
1——FAT區(FAT Region);
2——根目錄區(Root Directory Region,FAT32卷沒有此域);
3——文件和目錄數據區(File and Directory Region)設計
啓動扇區與BPBblog
BPB(BIOS Parameter Block)是FAT文件系統中第一個很重要的數據區,它位於該FAT卷的第一個扇區,同時也屬於FAT文件系統基本區域的保留區。這個扇區又叫作「啓動扇區」、「保留扇區」、「0扇區」,衆多的說法都說明一個相同的問題:該扇區是FAT卷的第一個扇區。排序
這是FAT文件系統中第一個讓人感到迷惑的地方,對於MS-DOS 1.x的版本,啓動扇區中並無BPB這麼一個東西,FAT文件系統的最先期版本只有兩種不一樣的格式:使用於單面或雙面的360K 5寸軟盤。這兩種格式是經過FAT的第一個字節(FAT[0]的低8位)來區分的。ci
在MS-DOS 2.x之後,啓動扇區裏增長了BPB用於區分磁盤介質,同時再也不支持老的磁盤介質區分方式(用FAT的第一個字節來區分),全部的FAT文件系統卷必須在啓動扇區中包含BPB。字符串
這又是一個迷惑人的地方,BPB具體是什麼樣的?在MS-DOS 2.x的定義中,每一個FAT卷的扇區數不能多於65536(每一個扇區512字節的話最多32MB——2^16×2^9=32MB),這一個限定是因爲定義「總扇區數」的變量自己是一個16-bit的數據類型。這一個限制在MS-DOS 3.x中有所改進,它使用一個32bit的變量來存儲「總扇區數」(若每一個扇區512字節,則每一個FAT卷的最大容量爲2^32×2^9=2^41=2048GB)。it
在WIN95操做系統中,確切地說應該是在OSR2(OEM Service Release 2)出現的時候BPB的內容有了新的變化,在這一版本中引入了新的FAT類型——FAT32。在FAT16中,因爲FAT表的大小限制了有效的簇數(Cluster),同時也就限制了磁盤空間的大小,若是每一個扇區爲512字節的話,那麼FAT16格式只能支持到2G。FAT32的引入改變了這一個情況。再也不須要增長分區來管理大於2G的硬盤。io
FAT32的BPB內容和FAT12/FAT16的內容在BPB_ToSet32區域之前徹底一致,而從偏移量36開始,他們的內容有所區別,具體內容要看FAT類型爲FAT12/FAT16仍是FAT32(後面的內容會提到如何區分FAT格式),這點保證了在啓動扇區中包含一個完整的FAT12/FAT16或FAT32的BPB內容,這麼作是爲了達到最好的兼容性,同時也爲了保證全部的FAT文件系統驅動程序能正確地識別和驅動不一樣的FAT格式,並讓他們良好地工做,由於他們包含了現有的所有內容。
NOTE:在如下的描述中,凡是名稱與BPB_開頭的域都是BPB的一部分,凡是名稱與BS_開頭的項都是啓動扇區(boot sector)的一部分,而不是真正屬於BPB內容。下面是FAT 0扇區的內容,BPB也包含其中。
|
|
|
0x00 |
3個字節 |
跳轉指令 |
0x03 |
8個字節 |
廠商標誌和OS版本號 |
0x0B |
53個字節 |
BPB |
0x40 |
26個字節 |
擴展BPB |
0x5A |
420個字節 |
引導程序代碼 |
0x01FE |
2個字節 |
有效結束標誌 |
|
|
|
|
BS_jmpBoot |
0 |
3 |
跳轉指令。指向啓動代碼,容許如下兩種形式: jmpBoot[0]=0xEB,jmpBoot[1]=0x??,jmpBoot[2]=0x90;以及 jmpBoot[0]=0xE9,jmpBoot[1]=0x??,jmpBoot[2]=0x?? 0x??表示該字節能夠爲任意8-bit值,這是Intel x86架構3字節的無條件轉移指令,跳轉到操做系統的啓動代碼,這些啓動代碼每每緊接BPB後面0扇區裏的剩餘字節,固然也可能位於其餘扇區。以上的兩種形式任取。jmpBoot[0]=0xEB是一種經常使用的格式。 |
BS_OEMName |
3 |
8 |
建議值爲MSWIN4.1,此域常常引發人們的誤解,其實這只是一個字符串而已,Microsoft的操做系統彷佛並不關心此域。但其餘廠商的FAT驅動程序可能會檢測到此項,這就是爲何建議將此域設定爲「MSWIN4.1」 的緣由,這樣能夠儘可能避免兼容性的問題。你能夠更改它的內容,但這有可能形成某些FAT驅動程序沒法識別該磁盤。在不少狀況下,該域用於顯示格式化該FAT卷的操做系統的名稱。 (廠商標誌和OS版本號) |
BPB_BytesPersec |
11 |
2 |
每扇區字節數,取值只能是如下的幾種狀況:5十二、102四、2048或者是4096,通常狀況下,設置爲512將會取得更好的兼容性,目前有不少的FAT代碼都是硬性的規定每扇區字節數爲512,而不是實際檢測該區域的值。Microsoft操做系統可以很好地支持102四、2048和4096各類數值。 NOTE:請不要曲解此處「最好的兼容性」的意思,若是某些存儲介質的物體特性決定其值爲N,那麼你就必須使用該數值N,該數值N必定是小於等於4096。那麼取得「最好的兼容性」的辦法就是使用該特定的N值。 |
BPB_SecPerClus |
13 |
1 |
每簇扇區數,其值必須是2的整數次方(該整數必須大於等於0),如一、二、四、八、1六、3二、64或128,同時還必須保證每簇的字節數不超過32K,即——保證(BPB_BytesPersec * BPB_SecPerClus ≤ 32K)(1024×32)該值大於32K是絕對不容許的,雖然有些版本的操做系統支持每簇字節數最大到64K,但不少應用程序的安裝程序都沒法在這樣的FAT文件系統上正常運行。 |
BPB_RsvdSecCnt |
14 |
2 |
保留區中保留扇區的數目,保留扇區從FAT卷的第一個扇區開始,此域不能爲0,對於FAT12和FAT16必須爲1,FAT32的典型取值爲32,目前不少FAT程序都是硬性規定FAT12/FAT16的保留扇區爲1,而不對此域進行實際的檢測,Microsoft的操做系統支持任何非零的值。 |
BPB_NumFATs |
16 |
1 |
此卷中FAT表的份數。任何FAT格式此域都建議爲2。雖然此域取值爲其餘≥1的數值也是合法的,可是對於不少FAT程序和部分操做系統來講,此項不爲2的時候將沒法正常工做。可是當不爲2時,Microsoft的操做系統仍然能良好工做。可依然強烈建議此項值爲2。 選擇此項的標準值爲2的緣由是爲了提供一份FAT表的備份,當其中一個FAT表所在的扇區被損壞時咱們能夠從備份的FAT表中讀出正確的數據。但是對於一些非磁盤介質的存儲器(如FLASH卡),這一特性變得毫無用處,若是想使用1個FAT表來節省空間,那麼帶來的問題將是某些操做系統沒法識別該FAT卷。 |
BPB_RootEntCnt |
17 |
2 |
對於FAT12和FAT16,此域中包含根目錄中的目錄項數(每一個項長度爲32Kbytes),對於FAT32,此項必須爲0。對於FAT12和FAT16,此數值乘以32,必須爲BPB_BytesPersec的偶數倍,爲了達到更好的兼容性,FAT12/FAT16應該取值爲512。 |
BPB_TotSec16 |
19 |
2 |
早期版本中16-bit的總扇區數,這裏的總扇區數包括FAT捲上四個基本區的所有扇區,此域能夠爲0,若此域爲0,那麼BPB_TotSec32必須非0,對於FAT32,此域必須爲0。對於FAT12/FAT16,此域填寫總扇區數,若是該數值小於0x10000的話,BPB_TotSec32必須爲0。 |
BPB_Media |
21 |
1 |
對於「固定」(不可移動)的存儲介質而言,0xF8是標準值,對於能夠移動的存儲介質,常用的數值是0xF0,此域合法的取值能夠是0xF0,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE和0xFF。另外要提醒的一點是,不管此域寫入什麼數值,同時也必須在FAT[0]的低字節寫入相同的值,這是由於早期的MSDOS 1.x使用該字節來斷定是何種存儲介質。 |
BPB_FATSz16 |
22 |
2 |
FAT12/FAT16一個FAT表所佔的扇區數,對於FAT32來講,此域必須爲0,在BPB_FATSz32中有指定其FAT表的大小。 |
BPB_SecPerTrk |
24 |
2 |
每磁道扇區數,用於BIOS中斷0x13,此域只對於有「特殊形狀」(由磁頭和柱面分割爲若干磁道)的存儲介質有效,同時必須能夠調用BIOS的0x13中斷獲得此數值。 |
BPB_NumHeads |
26 |
2 |
磁頭數,用於BIOS的0x13中斷,相似於上面的BPB_SecPerTrk,只有對特殊的介質纔有效,此域包含一個至少爲1的數值,好比1.4M的軟盤,此域爲2。 |
BPB_HiddSec |
28 |
4 |
在此FAT分區以前所隱藏的扇區數,必須使用調用BIOS的0x13中斷能夠獲得這個數值,對於那些沒有分區的存儲介質,此域必須爲0,具體使用什麼由操做系統決定。 |
BPB_TotSec32 |
32 |
4 |
該卷總扇區數(32-bit),這裏的總扇區數包括FAT捲上四個基本區的所有扇區,此域能夠爲0,若此域爲0,則BPB_TotSec16必須爲非0,對於FAT32,此域必定是非0。對於FAT12/FAT16,若是總扇區數大於或等於0x10000(64KB)的話,此域就是總扇區數,同時BPB_ |