微軟在Dos/Windows系列操做系統中共使用了6種不一樣的文件系統(包括即將在windows的下一個版本中使用的Winfs)。html
它們分別是:FAt十二、FAT1六、FAT3二、NTFS、NTFS5.0和WINFS。windows
其中FAT十二、FAT1六、FAT32均是FAT文件系統。是File Allocation Table的簡稱。數據結構
1. FAT12url
這是伴隨着Dos誕生的「老」文件系統了。它採用12位文件分配表,並所以而得名。而之後的FAT系統都按照這樣的方式在命名。在DOS3.0之前使用。可是在如今,咱們都還能找獲得這個文件系統:用於軟盤驅動器。固然,其餘地方的確基本上不使用這個文件系統了。FAT12能夠管理的磁盤容量是8M。這在當時,沒有硬盤的狀況下,這個磁盤管理能力是很是大的。spa
以3.5英寸的1.44M標準格式化的FAT12文件系統的軟盤爲例,當軟盤被標準格式化後,每磁頭80個柱面(磁道),每一個柱面有18個扇區,每一個扇區有512字節空間。因此標準軟盤的總空間(容量)爲:2*80*18*512=1474560B=1440K=1.44M操作系統
可是1.44M的軟盤格式化能夠不是1.44M,能夠大於也能夠小於;格式化的文件系統也能夠不是FAT12。爲何會出現正常的1.44M軟盤格式化後可大可小的狀況呢?從軟盤及軟盤驅動器原理出發,軟盤的尋址方式(能夠認爲是讀取數據的方式)是:CHS,C = Cylinder(柱面),H = Header(磁頭),S = Sector(扇區)。標準地格式化後,磁盤將被格式化爲 每面80磁道(80個同心圓,柱面),每一個磁道有18個扇區,每一個扇區是 512字節,那麼高密3.5英寸軟盤的容量爲:2×80×18×512 = 1474560 Byte = 1440 KB = 1.44 MB。然而,軟盤能夠不格式爲80磁道,每一個磁道也能夠不是18扇區。3d
FAT12文件系統將按照下表所示的方式劃分所有的容量,即文件系統數據結構:htm
FAT12 2880扇區 (1474560B) | 邏輯扇區 | 佔用扇區 | 內容 | 磁盤CHS參數(磁頭/柱面/扇區) |
---|---|---|---|---|
0 | 1(512B) | 引導程序 | 起:0/0/1 | |
1 | 9(4608B) | FAT文件分配表1 | 起:0/0/2 止:0/0/10 | |
10 | 9(4608B) | FAT文件分配表2 | 起:0/0/11 止:1/0/1 | |
19 | 14(9728B) | 根目錄 | ||
33 | 14(9728B) | 文件數據區 |
操做系統之因此認識FAT12格式的磁盤,其祕密就在於邏輯0扇區這512B上。若是這512字節的最後兩個字節的內容分別是55和AA(0xAA55低字節在前,高字節在後)的話,BIOS在啓動時會將這個扇區讀取到0:7C00h-0:7DFFh處,而後跳轉到0:7C00h處繼續執行指令,操做系統即用此來達到引導系統的目的,而這個磁盤就稱爲可引導磁盤。操做系統標識FAT12文件系統是由於在邏輯0扇區(即引導扇區)處還存儲着一個特定的數據結構,此結構有固定的格式,在操做系統將此磁盤格式化時自動生成,具體數據結構以下表所示:blog
標識 | 偏移量 | 類型 | 大小 | 說明 | 默認值 |
---|---|---|---|---|---|
0ci |
db |
3 |
跳轉指令 | ||
BS_OEMName | 3 |
db |
8 |
OEM字符串,必須爲8個字符,不足以空格填空 | MSWIN4.1 |
BPB_BytsPerSec | 11 |
dw |
2 |
每扇區字節數 | 200h |
BPB_SecPerClus | 13 |
db |
1 |
每簇佔用的扇區數 | 1 |
BPB_RsvdSecCnt | 14 |
dw |
2 |
保留扇區數 | 1 |
BPB_NumFATs | 16 |
db |
1 |
FAT表的記錄數 | 2 |
BPB_RootEntCnt | 17 |
dw |
2 |
最大根目錄文件數 | 0e0h |
BPB_TotSec16 | 19 |
dw |
2 |
邏輯扇區總數 | 0b40h |
BPB_Media | 21 |
db |
1 |
媒體描述符 | 0f0h |
BPB_FATSz16 | 22 |
dw |
2 |
每一個FAT佔用扇區數 | 9 |
BPB_SecPerTrk | 24 |
dw |
2 |
每一個磁道扇區數 | 12h |
BPB_NumHeads | 26 |
dw |
2 |
磁頭數 | 2 |
BPB_HiddSec | 28 |
dd |
4 |
隱藏扇區數 | 0 |
BPB_TotSec32 | 32 |
dd |
4 |
若是BPB_TotSec16是0,則在這裏記錄扇區總數 | 0 |
BS_DrvNum | 36 |
db |
1 |
中斷13的驅動器號 | 0 |
BS_Reserved1 | 37 |
db |
1 |
未使用 | 0 |
BS_BootSig | 38 |
db |
1 |
擴展引導標誌 | 29h |
BS_VolID | 39 |
dd |
4 |
卷序列號 | 0 |
BS_VolLab | 43 |
db |
11 |
卷標,必須是11個字符,不足以空格填充 | |
BS_FileSysType | 54 |
db |
8 |
文件系統類型,必須是8個字符,不足填充空格 | FAT12 |
62 |
|
|
引導代碼,由偏移0字節處的短跳轉而來 | ||
510 |
dw |
2 |
系統引導標識 | 0aa55h |
首先是跳轉指令,偏移0處的跳轉指令必須是合法的可執行的基於x86的CPU指令,如:jmp start,這樣能夠生成3字節長的指令,(加關鍵字short的短跳轉指令的長度是2字節),指向操做系統引導代碼部分。Windows和MS-DOS生成的FAT12啓動扇區中的跳轉指令是短跳轉,如:jmp short start,而後加一個nop的空指令來保持3字節的長度。
接着是位於偏移3處的OEM字符串,它必須是一個8字節長的字符串,標識了格式化此磁盤的操做系統的名稱和版本號,爲了保留與MS-DOS的兼容性,一般Windows 2000系統格式化的磁盤上在此記錄中的字符串是「MSDOS5.0」,在Windows 95系統格式化的磁盤上在此記錄中的字符串是「MSWIN4.0」,在Windows 95 OSR2和Windows 98系統上格式化的磁盤上在此記錄中的字符串是「MSWIN4.1」。
接下來是每扇區的字節數,類型是雙字節長,標準分區上的每扇區字節數通常是512B,但也能夠是其它的數字,如1024,2048和4096,FAT12的格式下設置爲512(200h)。
偏移13處的是每簇所佔用的扇區,類型是字節,簇是數據存儲的最小單位,此字段的值取決於分區的大小,在FAT12格式下通常爲1,即每簇只有1個扇區(512字節),簇越大,那麼分區的容量也就越大,經過增長簇的扇區數,能夠支持更大的磁盤分區,標準的簇大小爲一、二、四、八、1六、3二、64和128,FAT12格式下只能管理2^12個簇(4096),因此在FAT12格式下能管理和分配的最大空間爲:4096*1*512=2097152B=2M,因此FAT12通常只適合3.5寸高密度軟盤(1.44M)。
保留扇區指的是在第一個FAT文件分配表以前的引導扇區,通常狀況下只保留1個扇區(512B)。
接下來是類型爲1字節長的FAT表的總數,默認狀況下此字段的值爲2,也就是有兩個FAT表,FAT1和FAT2的內容相同,當FAT1表出錯的時候可使用FAT2來恢復文件分配表。
位於偏移17處的字段是類型爲雙字節長的可以儲存在根目錄下的最大文件(包含子目錄)數量,默認爲224,每一個目錄或文件名佔用32B的空間,所以根目錄的大小爲:224*32=7168B=7KB,若是使用長文件名的話,根目錄文件數還可能沒法達到224的數量。
接下來是位於偏移19處的邏輯扇區總數,類型是雙字節,若是此磁盤的邏輯扇區總數大於2^16位(65536)的話,就設置此字段爲0,而後使用偏移32處的雙字來表示邏輯總扇區數。
位於偏移21處的是單字節長的磁盤類型標識符,使用0f0h表示3.5寸高密碼軟盤,用0f8h來表示硬盤。此字段主要用於FAT12或FAT16的分區格式中,在Windows 2000中未使用。
偏移22處雙字節長的是每一個FAT文件分配表所佔用的扇區數,操做系統用這個字段和FAT表數量以及隱藏扇區數量來計算根目錄所在的扇區。還能夠根據最大根目錄數來計算用戶數據區從哪裏開始。
根目錄扇區位置=FAT表數量*FAT表所佔用的扇區數量+隱藏扇區數量
用戶數據開始位置=根目錄扇區位置+根目錄所佔用扇區(FAT12格式下爲224*32/512)
此處所說的扇區指的是邏輯(線性)扇區,須要經過轉換才能獲得CHS磁盤參數,而後經過CHS參數來讀寫磁盤扇區。
接下來是位於偏移24處的每磁道扇區總數,類型是雙字節長,軟盤的默認值爲18,即每一個磁道有18個扇區。
而後是雙字節長的磁頭數,磁頭數指的是磁盤面數,每面都有一個磁頭,軟盤都是2面的,因此在FAT12格式下此字段固定爲2。
接下來是的位於偏移28處類型爲雙字(4B)長的隱藏扇區數,指的在引導扇區以前的隱藏扇區,在FAT12格式上此字段默認爲0,即不隱藏任何扇區,此字段參與計算根目錄區和用戶數據區位置。
偏移32處的是類型爲雙字(4B)長的邏輯扇區總數,若是此分區或磁盤的邏輯扇區總數大於65536則用這個字段來表示邏輯扇區總數,不然設置此字段爲0後用位於偏移19處的雙字節字段來表示。
偏移36處的是物理驅動器號,類型是字節長,它與BIOS物理驅動器相關,在磁盤中斷Int13h相關的操做中使用,第一個軟盤驅動器設置爲0,第一個硬盤驅動器設置爲80h,第二個硬盤驅動器設置爲81h,以此類推。此字段的值能夠在系統引導時用dl寄存器獲得。
位於偏移37處的字節沒有使用,保留並設置爲0。
位於偏移38處的是擴展引導標識,類型是字節,操做系統用它來識別引導信息,值能夠是28h或29h。
接下來的是位於偏移39處的卷標號,類型是雙字(4B)長,在格式化磁盤時所產生的一個隨機序號,有助於區分磁盤,能夠爲0。
而後是位於偏移43處的卷標,長度必須是11字節長(不足以空格20h填充),此字段只能使用一次,用來保存磁盤卷的標識符,再次設置的時候被保存到根目錄中做爲一個特殊的文件來儲存。
最後是位於偏移54處的是長度爲8字節的文件系統類型標識符,不足8字節則以空格20h來填充。FAT12格式下此字段爲「FAT12 」,相應的還有「FAT16 」和「FAT32 」。但要注意的是,操做系統並不使用這個字段來識別此磁盤所用的文件系統。
咱們先來看看文件分配表的數據格式,文件分配表所在的扇區應該是(隱藏扇區+保留扇區)=0+1=第1扇區處,從第1扇區開起到第9扇區結束,第一個文件分配表共佔用9個扇區,第二個文件分配表從第10個扇區開始到第18扇區結束,在引導扇區的數據結構中明明確的指出了這些位置。
文件分配表數據結構以下圖所示:
在FAT表開始扇區的第1字節是存儲介質,0f0h表明軟盤,0f8表明硬盤;第二、3這兩個字節都是0ffh,表明了FAT文件分配表標識符,從第四個字節開始與用戶數據區全部的簇一一對應,應該注意的是,用戶數據區的第一個簇的序號是002,而不是000,由於儲存介質和標識符佔用了這兩個序號。
在FAT12格式中用12比特位來表明一個簇的序號,咱們知道,每一個字節有8位比特,因此每一個簇要佔用1.5個字節,也就是說,佔用了第1字節和第2字節的一半才能表示一個簇的序號,半字節的拆分辦法按照下圖的方式進行:
例如:在FAT表中開始位置儲存的字節內容依次是F0 FF FF FF 4F 00 05 F0 FF,前面三個字節是儲存介質和標識符,咱們無論它,前面三個字節佔用了0和1這兩個簇序號,那麼就應該從2簇開始了。通過轉換獲得的簇序號是:0fffh 004h 005h 0fffh,簇號是12位比特,第4字節(1111 1111)的做爲第2簇號的低8位(0-7),第5字節(4F)的低4位(1111)做爲第2簇號的高4位(8-11),這樣就獲得了第2簇號的內容爲0fffh;而後第5字節的高4位(0100)做爲第3簇號的低4位(0-3),第6字節(0000 0000)做爲第3簇號的高8位(4-11),這樣便獲得了第3簇號的內容爲004h;第7字節(0000 0101)做爲第4簇號的低8位(0-7),第8字節的低4位(0000)做爲第4簇號的高4位(8-11),這樣能夠獲得第4簇號的內容爲005h;第8字節的高4位(1111)做爲第5簇號的低4位(0-3),第9字節(1111 1111)做爲第5簇號的高8位(4-11),這樣獲得第5簇號的內容爲0fffh。
Fat12文件系統的限制:
1)文件名:只能是8.3格式的文件名。
2)磁盤容量:最多8M。(4096clusters×4sectors/clusters×512bytes、sectors)
3)文件碎片嚴重。(只在磁盤上不存儲在不連續的簇內。)