文件分配表FAT(File Allocation Table)
文件分配表是用來表示磁盤文件的空間分配信息的,它不對引導(dǎo)區(qū)、文件目錄表的信息進(jìn)行表示,也不真正存儲文件內(nèi)容.
文件占用磁盤空間時,基本單位不是字節(jié)而是簇。簇的大小與磁盤的規(guī)格有關(guān),一般情況下,軟盤每簇是1個扇區(qū),硬盤每簇的扇區(qū)數(shù)與硬盤的總?cè)萘看笮∮嘘P(guān),為2的n次方,可能是4、8、16、32、64……
由于FAT對于文件管理的重要性,所以FAT有一個備份,即在原FAT的后面再建一個同樣的FAT。初形成的FAT中所有項(xiàng)都標(biāo)明為 "未占用 ",但如果磁盤有局部損壞,那幺格式化程序會檢測出損壞的簇,在相應(yīng)的項(xiàng)中標(biāo)為 "壞簇 ",以后存文件時就不會再使用這個簇了。FAT的項(xiàng)數(shù)與硬盤上的總簇?cái)?shù)相當(dāng),每一項(xiàng)占用的字節(jié)數(shù)也要與總簇?cái)?shù)相適應(yīng),因?yàn)槠渲行枰娣糯靥枴AT的格式有多種,最為常見和為讀者所熟悉的是FAT16和FAT32,其中FAT16是指文件分配表使用16位數(shù)字,由于16位分配表最多能管理65536(即2的16次方)個簇,也就是所規(guī)定的一個硬盤分區(qū)。
由于每個簇的存儲空間最大只有32KB,所以在使用FAT16管理硬盤時,每個分區(qū)的最大存儲容量只有(65536×32 KB)即2048MB,也就是我們常說的2G。現(xiàn)在的硬盤容量是越來越大,由于FAT16對硬盤分區(qū)的容量限制,所以當(dāng)硬盤容量超過2G之后,用戶只能將硬盤劃分成多個2G的分區(qū)后才能正常使用,為此微軟公司從Windows 95 OSR2版本開始使用FAT32標(biāo)準(zhǔn),即使用32位的文件分配表來管理硬盤文件,這樣系統(tǒng)就能為文件分配多達(dá)4294967296(即2的32次方)個簇,所以在簇同樣為32KB時每個分區(qū)容量最大可達(dá)65G以上。此外使用FAT32管理硬盤時,每個邏輯盤中的簇長度也比使用FAT16標(biāo)準(zhǔn)管理的同等容量邏輯盤小很多。由于文件存儲在硬盤上占用的磁盤空間以簇為最小單位,所以某一文件即使只有幾十個字節(jié)也必須占用整個簇,因此邏輯盤的簇單位容量越小越能合理利用存儲空間。所以FAT32更適于大硬盤。
文件占用磁盤空間時,基本單位不是字節(jié)而是簇。簇的大小與磁盤的規(guī)格有關(guān),一般情況下,軟盤每簇是1個扇區(qū).
硬盤每簇的扇區(qū)數(shù)與硬盤的總?cè)萘看笮∮嘘P(guān),其值見下表:
分區(qū)大小 FAT16 (扇區(qū)數(shù)/簇) FAT32 (扇區(qū)數(shù)/簇)
16MB-127MB 4 1
128MB-255MB 8 1
256MB-259MB 16 1
260MB-511MB 16 8
512MB-1023MB 32 8
1024MB-2047MB 64 8
2048MB-8GB 不支持 8
8GB-16GB 不支持 16
16GB-32GB 不支持 32
32GB以上 不支持 64
FAT16及FAT32相關(guān)特定值意義如下:
FAT16
1.DBR 第0扇區(qū)開始,使用一個扇區(qū),沒有保留扇區(qū).
2.FAT表長 在DBR第16H處的2字節(jié)(表示占用扇區(qū)數(shù)),FAT1從第1扇區(qū)開始
3.FAT簇 每簇用16位二進(jìn)制數(shù)表示FAT表中每簇地址占2Bytes
4.可用簇號 0002H - FFEFH ( <= FFEDH[65518]個簇)
5.特定簇號 0000H、0001H兩簇號不使用,其對應(yīng)DWORD位置:F8 FF FF 7F
簇值意義 不要把FAT表項(xiàng)內(nèi)的數(shù)字誤認(rèn)為表示當(dāng)前簇號,而應(yīng)是該文件的下一個簇的簇號
高字節(jié)在后低字節(jié)在前是存儲方式,讀出時應(yīng)進(jìn)行調(diào)整,如兩字節(jié)12H 34H,實(shí)際應(yīng)為3412H
值FFF0H用來表示壞簇 值FFFFH表示文件結(jié)束簇
特定值表示壞簇,其它值表示為文件占用的下一簇的簇號
6.根目錄區(qū)扇區(qū)大小,在DBR第11H的兩字節(jié)(表示32字節(jié)的根目錄個數(shù))如值為00 02,則0200H=512個,即512*32字節(jié)=16384字節(jié),等于32個扇區(qū)
7.扇區(qū)數(shù)量 在DBR第13H處2字節(jié)
FAT32
1.DBR 從第0扇區(qū)開始,使用三個扇區(qū),保存了該邏輯盤每扇區(qū)字節(jié)數(shù),每簇對應(yīng)的扇區(qū)數(shù)等重要參數(shù)和引導(dǎo)記錄.(佔(zhàn)用32扇區(qū))
2.FAT表長 在DBR第24H處的4字節(jié)(表示FAT占用扇區(qū)數(shù)),FAT1從第32扇區(qū)開始.
3.FAT簇 FAT表中每簇地址占4Bytes
4.可用簇號 00000002H - FFFFFEFFH
5.特定簇號 0000000H、00000001H兩簇號不使用,其對應(yīng)的兩個DWORD位置(FAT表開頭的8個字節(jié))用來存放該盤介質(zhì)類型編號:F8 FF FF 0F FF FF FF 0F
值00000000H表示該簇未被分配值FFFFFF0FH表示是該簇是文件占用的最后一族
特定值表示壞簇,其它值表示為文件占用的下一簇的簇號
6.根目錄區(qū)扇區(qū)大小, 不再是固定區(qū)域和固定大小
7.扇區(qū)數(shù)量 在DBR第20H處的4字節(jié)
其它:
1. FAT表按順序依次記錄了該盤各簇的使用情況,是一種位示圖法.
2. 每簇所占用扇區(qū)數(shù)見上.
3. 微軟建議對小于512M的邏輯盤不使用FAT32
4. 對于使用FAT16文件系統(tǒng)的硬盤分區(qū)時,不要將分區(qū)(邏輯盤)容量正好設(shè)為某一區(qū)間的下限.
計(jì)算公式:
每個扇區(qū)長度 = 512字節(jié)
總簇?cái)?shù) = 邏輯盤容量/簇容量
總簇?cái)?shù) = FAT表長度(字節(jié))/每個表項(xiàng)長度(字節(jié))- 2
FAT表長度=邏輯盤容量/簇容量*每個表項(xiàng)長度
每個有效的FAT結(jié)構(gòu)區(qū)包含兩個完全相同的拷貝:FAT1、FAT2
如: 2G FAT 16分區(qū)格式的HD, FAT長度為250Sectors,
則總簇?cái)?shù)= 250 * 512 / 2 - 2 = 63998
簇容量(每簇扇區(qū)數(shù)) = 2 097 000 000 / 63998 = 32776Bytes = 64 Sectors
文件目錄表FDT(File Directory Table),即根目錄(DIR)區(qū),又稱為ROOT區(qū)
緊跟在FAT2的下一個扇區(qū)開始,記錄著根目錄下每個文件(目錄)的起始單元,文件的屬性等。定位文件位置時,操作系統(tǒng)根據(jù)DIR中的起始單元,結(jié)合FAT表就可以知道文件在硬盤中的具體位置和大小了。
如果支持長文件名,則每個表項(xiàng)為64個字節(jié),其中,前32個字節(jié)為長文件鏈接說明;后32個字節(jié)為文件屬性說明,包括文件長度、起始地址、日期、時間等。如不支持長文件名,則每個表項(xiàng)為32個字節(jié)的屬性說明。
根目錄下可包含文件和子目錄,子目錄下又可包含文件和下級子目錄.一個子目錄也占用一個文件目錄項(xiàng),只不過它的屬性字節(jié)為10H,文件長度字節(jié)為0.一個子目錄中的內(nèi)容是若干個文件目錄項(xiàng)或下級子目錄項(xiàng).
Start Pos. Bytes FAT16 FAT32
00-07 8 文件名 文件名
08-0A 3 文件擴(kuò)展名 文件擴(kuò)展名
0B 1 FAT16://表示屬性: 00000000讀寫 00000001只寫 00000010隱含 00000111系統(tǒng),隱含,只讀 00000100系統(tǒng) 00001000卷標(biāo) 00010000子目錄 00100000檔案,只要完成寫操作并已關(guān)閉即置1
FAT32://0至5位分別是只讀位、隱藏位、系統(tǒng)位、卷標(biāo)位、子目錄位、歸檔位
最高兩位保留未用
0C-0D 2 保留未用 存儲短文件名字節(jié)校驗(yàn)和
0E-0F 2 保留未用 文件創(chuàng)建時間
10-11 2 保留未用 文件創(chuàng)建日期
12-13 2 保留未用 最新訪問日期
14-15 2 保留未用 文件存放的起始簇號的高16位
16-17 2 文件創(chuàng)建時間(hhhhhmmmmmmsssss) 文件最新修改時間
18-19 2 文件創(chuàng)建日期(yyyyyyymmmmddddd) 文件最新修改日期
1A-1B 2 文件存放的起始簇號(低字節(jié)在前) 文件存放的起始簇號的低16位
1C-1F 4 文件長度 文件長度
注:目錄項(xiàng)中第0~7字節(jié)為文件名(若有剩余字節(jié)則用空白字符20H填充).
其中,第1字節(jié)又表明了該文件的狀態(tài),它有如下四種取值方式:
a. 00H--目錄項(xiàng)的空目錄。
b. E5H--表示該目錄項(xiàng)曾經(jīng)使用過,但文件已被刪除。
c. 2EH--表示子目錄下的兩個特殊文件 ". "或 ".. "目錄項(xiàng)
d. 其它任何字符--表示一個文件名(或目錄名)的第一個字符的ASCII碼值.
數(shù)據(jù)(DATA)區(qū)
數(shù)據(jù)區(qū)是真正意義上的數(shù)據(jù)存儲的地方,位于DIR區(qū)之后,占據(jù)硬盤上的大部分?jǐn)?shù)據(jù)空間。
文件數(shù)據(jù)起始地址(扇區(qū)號) = 保留扇區(qū)數(shù)(DBR) + 每FAT扇區(qū)數(shù) * 2 + 根目錄項(xiàng)數(shù)/32 (FDT扇區(qū)數(shù)) + 每簇扇區(qū)數(shù) * (起始簇號 - 2)
當(dāng)一個程序?qū)Σ僮飨到y(tǒng)要求提供某一個文件的內(nèi)容時,操作系統(tǒng)會到此文件的目錄記錄表去尋找它的第一個簇號碼, 然后再到FAT記錄表里去找在此一鏈結(jié)(Chain)里的下一個簇。 此動作不斷的重復(fù)直到找到文件的最后一個簇為止,操作系統(tǒng)可以精確的計(jì)算那些簇屬于這個文件及其先后順序。經(jīng)由此方式,操作系統(tǒng)可以提供程序所要求之文件的任何部分。這種組織文件的方式稱 為FAT鏈(FAT Chain).
在FAT文件系統(tǒng)下,文件永遠(yuǎn)被分配到整數(shù)單位的簇。 在一個每一簇大小為32K的1.2GB磁盤中,一個只包含 "Hello,World! "這幾個字符的大小為12個 字節(jié)文件仍要在磁盤中占32K的空間。在簇中沒有用到的部分稱為耗損(Slack),小文件的耗損幾乎與整個簇相當(dāng),平均來說,一個文件會有一半左右的耗損。
文件的讀取: 操作系統(tǒng)從目錄區(qū)中讀取文件信息(包括文件名、后綴名、文件大小、修改日期和文件在數(shù)據(jù)區(qū)保存的第一個簇的簇號),我們這里假設(shè)第一個簇號是0023。操作系統(tǒng)從0023簇讀取相應(yīng)的數(shù)據(jù),然后再找到FAT的0023單元,如果內(nèi)容是文件結(jié)束標(biāo)志(FF),則表示文件結(jié)束,否則內(nèi)容保存數(shù)據(jù)的下一個簇的簇號,這樣重復(fù)下去直到遇到文件結(jié)束標(biāo)志。
文件的寫入:當(dāng)我們要保存文件時,操作系統(tǒng)首先在DIR區(qū)中找到空區(qū)寫入文件名、大小和創(chuàng)建時間等相應(yīng)信息,然后在Data區(qū)找到閑置空間將文件保存,并將Data區(qū)的第一個簇寫入DIR區(qū),其余的動作和上邊的讀取動作差不多。
DOS刪除文件時只是把文件目錄表中的該文件的表項(xiàng)第0個字節(jié)改為E5h,表此表項(xiàng)已被刪除,并在文件分配表中把該文件占用各簇的表項(xiàng)清0,以釋放空間。其實(shí)文件的內(nèi)容仍在盤上,并沒有被真正刪除,這就是undelete.exe、unerase.exe等一類恢復(fù)刪除工具能起作用的原因。