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