原鏈接:https://blog.csdn.net/qianjintianguo/article/details/712590?utm_source=blogxgwz6
文件分配表(FAT)是文件管理系統用來給每個文件分配磁盤物理空間的表格,它告訴操作系統,文件存放在磁盤的什么地方。
1.FAT表的大小及位置
FAT在磁盤上是安排在緊接DOS引導扇區(DBR)之后的。在FAT16系統中,它總是從DOS的邏輯1扇區開始。
在磁盤上共有FAT表的兩個拷貝(一個是基本FAT表,另一個是FAT表的備份),兩者在磁盤上前后緊排在一起,其大小根據分區的大小不同而變化,FAT16中的文件分配表情況可參見表6-3中的BPB信息項。
FAT表之后緊接着是根目錄,根目錄之后是數據區。
圖6-1說明了常用磁盤上各數據區中DBR、FAT及根目錄FDT的相對位置和大小。在硬盤中,FAT16的文件分配表(FAT)仍然是存放在邏輯1扇區開始的若干個扇區內,一個文件分配表占用多少個扇區根據硬盤分區和邏輯盤容量大小情況的不同而不同。
2.文件的簇號鏈
磁盤格式化后,用戶文件是以簇為單位存放在數據區中,一個文件至少占用一個簇。當一個文件占用多個簇時,這些簇的簇號不一定是連續,但這些簇號間有由存儲該文件時確定了的順序,即每個文件都有其特定的“簇號鏈”。
設一個磁盤文件長度為4個簇,其首簇號為n1,簇號鏈為“n1->n4->n3->n2”。該文件在FAT中的簇號鏈,以及其邏輯空間和物理存放空間的對應關系如圖6-4所示。
FAT表項:
第00簇 |
|
該磁盤文件所占據的邏輯空間: | ||||||||||
··· |
|
|||||||||||
第n1簇 | 簇號:n1------------>n4------------>n3-------------->n2 | |||||||||||
··· | 文件所占據的物理空間 | |||||||||||
第n2簇 | 不一定連續 | |||||||||||
··· | 該磁盤文件所占據的物理空間: | |||||||||||
第n3簇 |
|
|||||||||||
··· | 簇號: n1 n2 n3 n4 | |||||||||||
第n4簇 | ||||||||||||
··· |
圖6-4FAT表中的文件簇鏈對應關系示意圖
在磁盤上的每一個可用的簇在FAT中就只有一個登記項,通過在對應簇號的登記項內填入“表項值”來表明數據區中的該簇是否占用、空閑或是已損壞的。損壞的簇是在格式化的過程中,通過FORMAT命令發現。在一個簇中,只要有一個扇區有問題,該簇就不能夠使用。
磁盤上的簇在FAT中的表項占12、16或32位。在FAT16文件系統中,每簇在FAT中所取表項值是占12位還是16位與所用磁盤的容量有關,12位表項值可表示4096個簇,若磁盤的簇數大於4096,則用16位表項值。一般來說,軟盤和小於20740個扇區(10MB)的硬盤DOS分區可用12位映射一個簇,如多於20740個扇區的硬盤分區,則采用16位的FAT。FAT12和FAT16表項的組成如圖6-5和6-6所示。
圖6-5 12位FAT表項的組成
圖6-6 16位FAT表項的組成
FAT文件系統是以簇為單位給文件分配磁盤空間的,每個簇在FAT表中占有一個登記項。所以,在FAT表中,簇編號也即為登記項的編號。每一個登記項作為一個簇的標志信息按照FAT12、FAT16和FAT32結構的不同分別為1.5個字節、2個字節和4個字節。該標志信息可取的表項值及其含義如表6-5所示。
表6-5文件分配表中的每個簇號可取的表項值及其含義
表項值(12位) | 表項值(16位) | 表項值(32位) | 簇描述信息含義 |
000H | 0000H | 00000000H | "0"值(未分配使用) |
001H--FEFH | 0001--FFEFH | 00000001--FFFFFFEFH | "一個簇號"(已占用) |
FF0H--FF6H | FFF0--FFF6H | FFFFFFF0--FFFFFFF6H | 保留 |
FF7H | FFF7H | FFFFFFF7H | 壞簇 |
FF8H--FFFH | FFF8H--FFFFH | FFFFFFF8--FFFFFFFFH | "EOF"(文件結束簇) |
從表6-5中可看出,簇在FAT中的占用1.5個字節、2個字節或4個字節的登記項必須是下列值之一:
·一個“0”值,表示這個簇未被分配使用。
·一個“001H~FEFH”、“0001H~FFEFH”或“00000001H~FFFFFFEFH”之間的值,表示該簇已經被占用,且該值即是該簇所在文件中下一個簇號的指針。
·一個“BAD”(FF7H、FFF7H或FFFFFFF7H),表明該簇有壞扇區,不能使用。
一個“EOF”(FF8H~FFFH、FFF8H~FFFFH或FFFFFFF8H~FFFFFFFFH之間的任一值),表明該簇是文件中的最后一簇。
在FAT的簇登記項中,0號登記項和1號登記項是表頭,簇的登記項從2號開始。系統隱含文件IO.SYS所在的首簇號總是0002。
3.FAT表的組成格式及功能
綜上所述,現將FAT表的組成格式及功能總結如下:
·表明磁盤類型。FAT的第0簇和第1簇為保留簇,其中第0字節(首字節)表示磁盤類型,其值與BPB中磁介質說明符對應的磁盤類型相同。
·表明一個文件所占用各簇的簇鏈分配情況。FAT從002簇開始分配給文件。表項值“001H--FEFH”、“0001H--FFEFH”或“00000001H--FFFFFFEFH”中的任一值表明文件的下一簇號。文件的起始簇號由文件目錄表(FDT)中每個目錄登記項的第26、27字節決定,作為FAT的入口,起始簇號在FAT中的表項值即文件的第2簇號,第二簇號的表項值即第3簇號,依此類推,直到表項值為FF8H--FFFH、FFF8H--FFFFH或FFFFFFF8H--FFFFFFFFH,表示該簇為文件的最后一簇。
·標明壞簇和可用簇。若軟盤格式化時發現壞扇區,即在相應簇的表項中寫入FF7H(或FFF7H),表明該扇區所在簇不能使用,DOS就不會將它分配給用戶文件。
磁盤上未用,但可用的“空簇”的表項值為000H(或0000H)。當需要存放新文件時,文件管理系統將它們按一定順序分配給新文件。
雖然FAT表記錄了文件所用的磁盤空間信息,但是DOS引導區、兩個FAT表、文件目錄區等並不由FAT表中的簇表示。
4.FAT表登記項與文件的簇鏈關系
以FAT16文件系統的16位登記項為例,文件尋找簇鏈的計算步驟為:
·假如我們已經從文件目錄表(FDT)中查得該文件的起始簇號。
·將該起始簇號換為10進制數a,a即為查找下一簇號的本簇號。
·a*2(若是12位FAT項,則a*1.5的乘積取整),即得到FAT中的相對位移b該位置存放文件簇鏈的下一簇號。
·從該相對位移b開始取一個字(低位在前,高位在后。如果是12位的FAT項,則按以下原則:若本簇號a為偶數,則保留該字低12位,否則保留高12位)。
·重復以上簇鏈的查找過程,直至找到其值為FF8--FFF的簇號。
5.文件簇鏈的操作實例
下面用一個例子來說明文件簇鏈的查找過程:
·假如已經從FDT中知道一個在1.44MB軟盤上文件11.TXT的起始簇號為02。
·a=02即為查找下一簇號的本簇號。
用DEBUG調出第一個FAT的內容如下:
A:/>DEBUG
-L CS:0 0 1 7 (將A盤第1扇區開始的7個扇區的根目錄FAT讀入內存)
-D CS:0 (顯示FAT的部分內容)
0F74:0000 F0 FF FF 03 40 00 FF 5F-01 07 F0 FF FF FF FF FF ....@.._........
0F74:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ...............o
......
·由文件起始簇號2*1.5=3.0,取整后得3,即0003開始的一個字中存放下一簇號。
·從FAT的第3字節開始,取一個字4003。
·由於本簇號2為偶數,則保留低12位,003(第3簇)。
·重復以上的查找過程:
3*1.5=4.5,4.5取整后為4,即0004開始的一個字中存放下一簇號。
從FAT的第4字節開始,取一個字0040。
由於本簇號3為基數,則保留低12位,004(第4簇)。
·再重復以上的查找過程:
4*1.5=6,即0006開始的餓一個字中存放下一簇號。
從FAT的第6字節開始,取一個字5FFFH。
由於本簇號4為偶數,則保留低12位,FFFH(表明第4簇為結束簇)。
由此得到該文件的簇號鏈為:2=>3=>4。