檔案分配表 FAT 及其結構

2021-04-07 00:25:06 字數 4191 閱讀 8295

檔案分配表(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簇

···n4

···fff

···n2

···n3

···

該磁碟檔案所佔據的邏輯空間:

······

第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。

FAT32檔案系統定位FAT檔案分配表以及根目錄

一 fat1起始扇區 dbr的扇區號 保留扇區數 1.獲取dbr的扇區號 磁碟的0號扇區的 0x1c6 0x1c9是第乙個分割槽的起始扇區,這個扇區就是dbr 下圖是本人的磁碟的0號扇區,可以看到dbr的扇區號是0x00 00 00 3f 小端格式 2.得到保留扇區數 開啟dbr扇區,偏移0x0e ...

檔案目錄表 FDT 及其結構

用format命令對磁碟 或邏輯盤 進行格式化的時候,就已經為整個硬碟建立了乙個根目錄fdt。在根目錄下,使用者可以用dos命令 md 再建立不同的各個子目錄,以及子目錄下的子目錄。根目錄以及各級子目錄都有自己的fdt。在具體操作中,系統規定用字母c z代表邏輯碟符,所以dos簡單地用 碟符 表示在...

檔案目錄表 FDT 及其結構

用format命令對磁碟 或邏輯盤 進行格式化的時候,就已經為整個硬碟建立了乙個根目錄fdt。在根目錄下,使用者可以用dos命令 md 再建立不同的各個子目錄,以及子目錄下的子目錄。根目錄以及各級子目錄都有自己的fdt。在具體操作中,系統規定用字母c z代表邏輯碟符,所以dos簡單地用 碟符 表示在...