FAT ( 檔案配置表 )


在啟動磁區之後,緊接著的是記載著某個檔案佔有那幾個磁叢的一塊區域,稱之為檔案配置表 ( FAT,File Allocation Table ),想當然耳,這個 FAT 是很重要的,如果記載不正確,檔案就無法順利存取,所以 DOS 特別將 FAT 設為兩個,並隨時檢查這兩 FAT 是否相同。


FAT 中分成很多欄位,依磁片容量不同每個欄位大小也不同,1.44MB 磁片的每個欄位是 12 位元,也就是 1.5 個位元組,這每個欄位都代表著一個磁叢編號,像這樣每個磁叢在檔案配置表中所佔的編號是 12 個位元的,這種檔案系統稱為 FAT12。12 個位元只能表示 0~4095 的數值。換句話說,磁叢編號只能從 0 開始到 4095,但實際上扣除幾個特別的編號不用之外,例如損壞的磁區、結束磁區等等,也只能表示 4085 個磁叢編號,要是容量大的硬碟,所含磁叢數多,就無法只用 12 個位元表示。( 註二 )


第零個欄位與第一個欄位共 3 個位元組為系統使用。的第零個欄位是表示這張磁片的種類,如下表:






















FF01.44MB 3.5英吋
FF8硬碟
FF91.2M 5.25英吋或 720K 3.5英吋
FFD360K 5.25英吋
FFE160K 5.25英吋
FFF320K 5.25英吋

FAT 的第一個欄位保留未使用,一般都是 FFFH。從 FAT 的第二個欄位 (也就是第三個位元組) 開始,其 FAT 欄位的內容就表示檔案所佔用的磁叢編號。此處應注意,1.44MB 磁片,有兩個 FAT,而每個 FAT 佔用 9 個磁區,加上 FAT 前還有一個啟動磁區以及目錄所佔用的 14 個磁區 (稍後說明),所以實際上磁片上是從第 33 個磁區才開始存放資料。換句話說,FAT 的第二個欄位是代表第 33 個磁叢,第三個欄位是代表第 34 個磁叢,第四個欄位是代表第 35 個磁叢……。


而 FAT 欄位裏所存放的內容可以分成下面幾種情形:
















000表示此欄所對應的磁叢並未使用
FF7表示此欄所對應的磁叢已損壞,不可使用
FF8-FFF表示此欄所對應的磁叢為檔案的最後一個磁叢
其他值表示下一個磁叢標號所對應的 FAT 欄位

底下以幾個例子來說明 FAT 內容與檔案存放磁區的關係。先看看剛格式化而後只建立一個 T123.TXT 的那一張磁片:


C:\WINDOWS>dir a: [Enter]

Volume in drive A has no label
Directory of A:\

T123 TXT 1 08-24-02 3:05 T123.TXT
1 file(s) 1 bytes
0 dir(s) 1,457,152 bytes free

C:\WINDOWS>debug [Enter]
-l 100 0 1 1 [Enter]
-d 100 L30 [Enter]
1C6C:0100 F0 FF FF FF 0F 00 00 00-00 00 00 00 00 00 00 00 ................
1C6C:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1C6C:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

前幾個位元組是 F0 FF FF FF 0F,當 DOS 解讀這些數字時,要注意兩件事,一是每個欄位的位元組數,以 1.44MB 磁片來說是 1.5 位元組;二是大位數要在高位址。以剛剛那張磁片為例,我們應該把它解讀成像下面這樣:



圖中上方粉紅色的 byte: 後面接的數字是位元組編號 (位址),最下方的粉紅色的 FAT: 後接的數字表示 FAT 欄位,這兩者都從零開始。


第零個 FAT 的欄位是第零個位元組 (FAT 的兩個較低位址,如上圖左邊的白線所指的兩個數) 以及第一個位元組的低位址 (FAT 的較高位址,如上圖左邊的灰線所指的那一個數),FF0。第一個 FAT 欄位的小位數是第一個位元組的高位址 (藍色線所指),大位數是第二個位元組 (天藍色所指),所以第二個欄位是 FFF。第二個 FAT 欄位是 FFF,是右邊的白色線所指。


FAT的第零﹑第一個欄位是系統所使用,第二個欄位是 T123.TXT 這個檔案所佔據,而這個檔案只佔一個磁叢,所以這個欄位就是 FFF。將它載入看看吧,照剛剛的講法,T123.TXT 這個檔案應該存放在第 33 個磁區的地方,換成十六進位是 21H。


-l 200 0 21 1 [Enter]
-d 200 L20 [Enter]
1C6C:0200 41 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 A...............
1C6C:0210 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

-q [Enter]

果然就是 T123.TXT 檔的內容。先離開 DEBUG,我們再拷貝一個較大的檔案看看:


C:\WINDOWS>copy content.gif a: [Enter]
1 file(s) copied

C:\WINDOWS>dir a: [Enter]

Volume in drive A has no label
Directory of A:\

T123 TXT 1 08-24-02 3:05 T123.TXT
CONTENT GIF 1,059 05-05-99 22:22 CONTENT.GIF
2 file(s) 1,060 bytes
0 dir(s) 1,455,616 bytes free

C:\WINDOWS>debug [Enter]
-l 100 0 1 1 [Enter]
-d 100 L30 [Enter]
1C6C:0100 F0 FF FF FF 4F 00 05 F0-FF 00 00 00 00 00 00 00 ....O...........
1C6C:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1C6C:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

CONTENT.GIF 檔有 1059 個位元組,因此應該佔有 3 個磁叢,將這些 FAT 欄位解讀如下:



前兩個黃色的 FAT 欄位值為系統所使用,第二個 FAT 欄位是 T123.TXT 所使用。


CONTENT.GIF 共佔據三個磁叢,應該使用第三﹑四﹑五這三個 FAT 欄位。第一個佔據的磁叢是第 34 個磁叢 (見前面),也就是 FAT 的第三個欄位,而這個欄位內容應該指向下一個磁叢編號所對應的 FAT 欄位,也就是第四個欄位,所以第三個欄位內容為 004H。同樣的 CONTENT.GIF 的所佔據的第二個磁叢是第 35 磁叢,下一個磁叢是 36 磁叢 (對應的 FAT 欄位是 005H),所以第 35 磁叢對應的 FAT 欄位 (也就是第四欄位) 之內容為 005H。而第 36 磁叢已經是最後一個磁叢了,所以其內容就是 FFFH。


假如你耐心看完以上說明,並且能瞭解,那小木偶想,您應該能瞭解 FAT 其實是一個檔案串接表,每一個 FAT 欄位都指向下一個 FAT 欄位,而這『下一個』FAT 欄位其實是對應的磁叢編號。現在只剩下一個問題了,檔案的起始 FAT 編號存於何處?答案在檔案描述區塊。


根目錄與檔案描述區塊 ( FDB )


根目錄是緊接著 FAT 後面的一塊區域,在啟動磁區的第 11~12H 位址裏記載著根目錄容量,這個容量指的是根目錄內最多可以放多少個檔案的資料。以 3.5 英吋 1.44MB 磁片來說,最多可以記載00E0H個檔案的資料,也就是說假如超過這個範圍,即使磁片還有空間,也無法再存入資料,除非是存在子目錄內。


那根目錄佔多少個磁區呢?以 1.44MB 3.5 英吋磁片為例,它的根目錄佔有 0E0H 個 FDB,而每個 FDB 有 32 個位元組,因此根目錄所佔的磁區為 32*0E0H/512=14 個磁區。


根目錄的內容是由許多筆資料組成,每一筆資料都記載著根目錄內的檔案名稱﹑建檔日期﹑檔案大小……還有該檔案由第幾個磁叢開始的組成,這每一筆資料都是由 32 個位元組構成,它描述了檔案基本資料稱之為檔案描述區塊 ( FDB,file description block ),下表說明這 32 個位元組所代表的意義:






























00~0AH:這 11 個位元組存放檔名,前面 8 個位元組存放主檔名,後面三個位元組存放副檔名。而主檔名的第零個位元組具有特殊意義,平常是存放檔名的第零個字,但如果檔案遭刪除,則此位置會變成 E5H,而其他資料不變 (包含 FDB 的其他資料如建檔時間﹑檔案大小……),說明如下:












00H:未使用的 FDB。當使用者建立新檔案時,DOS 會由第零個 FDB 開始尋找,只要是第零個字是 00 或 E5H 的就會為 DOS 所使用,這樣的好處是使得被使用的 FDB 永遠會在根目錄前面。而 DOS 尋找檔案時也是由前面開始搜尋,當 DOS 看到 FDB 的第零個字為 00 時就知道以後都是未使用的 FDB 不需再搜尋,以節省時間。
05H:表示這個檔案的第零個自是真的以 0E5H 為開始。
2EH:表示這個 FDB 是目錄,若只有第零字為『.』,表示為自身目錄,此時 FAT 指位器指向自身磁叢。如前兩字均為『.』表示為父目錄,FAT 指位器指向父目錄的磁叢。
E5H:表示被刪除的檔案。檔案遭刪除後,DOS 只在 FDB 的第零字以 E5H 標示,同時將前述 FAT 的鏈結變為零,其餘都沒有更動,所以使得反刪除軟體得以實現。
0BH:檔案屬性,其數值意義如下:





















01H:唯讀檔,若以寫入模式開啟此檔或刪除此檔都會發生錯誤。
02H:隱藏檔,用 DOS 的 DIR 指令是看不見的,必須加上『/A』參數。
04H:系統檔,是 DOS 系統使用的檔案,如 MSDOS.SYS﹑IO.SYS。
08H:磁碟卷名,就是用 DIR 指令看到的『volume label』或 Win 9x/Me 系統中『我的電腦』看到的磁碟機下面的名字。
10H:目錄名。
20H:保存檔,只要檔案被建立,此位元就會設為一。
事實上這些數值其實是這個位元組的 8 個位元代表開或關的結果,因此檔案可以是系統檔,也可以同時是隱藏檔跟唯讀檔,這樣的話,這個位元組就變成 0000 0111B,也就是 7 了。
0C~11H:保留未使用,均為 00H。
12~13H:DOS 6.x 及其以前的版本保留未使用,均為 00H。但 Win 95 以後,存放上次存取日期,其格式請參考 18~19H。
14~15H:FAT12/FAT16 中,此二位元組保留,未使用。但是在 FAT32 系統中,這個字組是磁叢指位器的較高字組,亦即檔案起始磁叢的較高字組,必須與 1A~1BH 配合使用。
16~17H:檔案建立時間或最後更動時間,這兩個位元組應連起來看,如下圖:
其中時﹑分﹑秒分別佔 5﹑6﹑5 個位元,時的部份最多可以顯示 25=32,可顯示 24 小時;分最多有 26=64,也可顯示 60 分;但是秒只有 25=32,無法顯示 60 秒,故在此採用折衷的方法,這 5 個位元所表示的二進位數必須乘以 2,才是真正建檔『秒』數。
18~19H:檔案建立日期或最後更動日期,這兩個位元組也應該連起來看,如下圖:
其中年份佔 7 個位元,其表示的二進位數還要加上 1980 才是建檔時的公元年份,27=128,所以可以表示公元 1980 到公元 2108 年,相信到 2108 年,不會有人還再用 DOS。其餘的月和日和前述時間的算法相同,都是以二進位數表示。
1A~1BH:磁叢指位器,這一欄存放著檔案的第零個磁叢編號所對應的 FAT 欄位。對 FAT32 而言,這是磁叢編號的低字組,其高字組在 14~15H 處。
1C~1FH:檔案大小,以位元組為單位。若此欄為 FFFFFFFFH 表示檔案大小約為 4G 個位元組,此檔案可說非常大,但在 DOS FAT16 系統下還有其他限制。

以剛剛的磁片為例說明,1.44MB 3.5英吋的磁片最前面是一個啟動磁區,接著是兩個 FAT,而每個 FAT 佔了 9 個磁區,再接下來才是根目錄,所以根目錄應該由第 13H 個磁區開始:


-l 300 0 13 1 [Enter]
-d 300 [Enter]
1C6C:0300 54 31 32 33 20 20 20 20-54 58 54 20 00 AD C5 13 T123 TXT ....
1C6C:0310 1D 2D 1D 2D 00 00 B9 18-18 2D 02 00 01 00 00 00 .-.-.....-......
1C6C:0320 43 4F 4E 54 45 4E 54 20-47 49 46 20 00 63 E3 13 CONTENT GIF .c..
1C6C:0330 1D 2D 1D 2D 00 00 C0 B2-A5 26 03 00 23 04 00 00 .-.-.....&..#...
1C6C:0340 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1C6C:0350 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1C6C:0360 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1C6C:0370 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-

以 T123.TXT 來看,由第零到第 0AH 個位元組是檔名,其中主檔名不滿 8 個字,以空白填滿。第 0BH 個位元組是檔案屬性,20H 查表可得是普通檔案。接下來,白色的時間部份, 18 B9 換成二進位是 0001 1000 1011 1001 ,依時間欄位說明,建檔的『時』是 00011B,換成十進位是 3,即凌晨 3 點,分是 000101B,換成十進位是 5,即 5 分,秒是 11001B,換成十進位是 25,再乘以 2 得 50 秒,所以建檔時間是 3 點 5 分 50 秒。


而紅色部份是 FAT 指位器,其值為 0002 表示這個檔案由 FAT 的第二個欄位開始,於是 DOS 就到 FAT 的第二個欄位去找發現是 FFF 於是 DOS 就知道這個檔案只佔一個磁叢,就是 002 所表示的磁叢,即第 33 個磁叢。再以 CONTENT.GIF 檔為例,它的 FAT 指位器是 003,於是 DOS 到 FAT 的第三欄去找發現該欄的值是 004,所以 DOS 又到第四欄找,第四欄的值是 005,又到第五欄去看,第五欄是 FFF,表示第五欄是最後一個磁叢,而該檔佔有第 003﹑004﹑005 三個磁叢。(參考前圖)


 


http://home.educities.edu.tw/wanker742126/asm/ch18.html#FAT

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 立你斯 的頭像
    立你斯

    立你斯學習記錄

    立你斯 發表在 痞客邦 留言(0) 人氣()