FAT16存儲(chǔ)原理: 當(dāng)把一部分磁盤空間格式化為fat文件系統(tǒng)時(shí),fat文件系統(tǒng)就將這個(gè)分區(qū)當(dāng)成整塊可分配的區(qū)域進(jìn)行規(guī)劃,以便于數(shù)據(jù)的存儲(chǔ)。一般來(lái)講,其劃分形式如圖7所示。我們把FAT16部分提取出來(lái),詳細(xì)描述一下:
FAT16是Microsoft較早推出的文件系統(tǒng),具有高度兼容性,目前仍然廣泛應(yīng)用于個(gè)人電腦尤其是移動(dòng)存儲(chǔ)設(shè)備中,F(xiàn)AT16簡(jiǎn)單來(lái)講由圖$2所示的6部分組成(主要是前5部分)。引導(dǎo)扇區(qū)(DBR)我們已經(jīng)說(shuō)過(guò),FAT16在DBR之后沒(méi)有留有任何保留扇區(qū),其后緊隨的便是FAT表。FAT表是FAT16用來(lái)記錄磁盤數(shù)據(jù)區(qū)簇鏈結(jié)構(gòu)的。像前面我們說(shuō)過(guò)的例子一樣,F(xiàn)AT將磁盤空間按一定數(shù)目的扇區(qū)為單位進(jìn)行劃分,這樣的單位稱為簇。通常情況下,每扇區(qū)512字節(jié)的原則是不變的。簇的大小一般是2n (n為整數(shù))個(gè)扇區(qū)的大小,像512B,1K,2K,4K,8K,16K,32K,64K。實(shí)際中通常不超過(guò)32K。 之所以簇為單位而不以扇區(qū)為單位進(jìn)行磁盤的分配,是因?yàn)楫?dāng)分區(qū)容量較大時(shí),采用大小為512b的扇區(qū)管理會(huì)增加fat表的項(xiàng)數(shù),對(duì)大文件存取增加消耗,文件系統(tǒng)效率不高。分區(qū)的大小和簇的取值是有關(guān)系的,見(jiàn)表9 圖4.3.12 Fat16的組織形式 | 引導(dǎo)扇區(qū) | FAT1 | FAT2(重復(fù)的) | 根文件夾 | 其他文件夾及所有文件 | 剩余扇區(qū) | 1扇區(qū)
| 實(shí)際情況取大小
| 同FAT1
| 32個(gè)扇區(qū)
| 開(kāi)始簇編號(hào)(從2開(kāi)始)
| 不足一簇
|
表9 FAT16分區(qū)大小與對(duì)因簇大小
| 分區(qū)空間大小
| 每個(gè)簇的扇區(qū)
| 簇空間大小
| 0MB-32MB
| 1
| 512個(gè)字節(jié)
| 33MB-64MB
| 2
| 1k
| 65MB-128MB
| 4
| 2k
| 129MB-225MB
| 8
| 4k
| 256MB-511MB
| 16
| 8k
| 512MB-1023MB
| 32
| 16k
| 1024MB-2047MB
| 64
| 32k
| 2048MB-4095MB
| 128
| 64k
|
注意:少于32680個(gè)扇區(qū)的分區(qū)中,簇空間大小可最多達(dá)到每個(gè)簇8個(gè)扇區(qū)。不管用戶是使用磁盤管理器來(lái)格式化分區(qū),還是使用命令提示行鍵入format命令格式化,格式化程序都創(chuàng)建一個(gè)12位的FAT。少于16MB的分區(qū),系統(tǒng)通常會(huì)將其格式化成12位的FAT,F(xiàn)AT12是FAT的初始實(shí)現(xiàn)形式,是針對(duì)小型介質(zhì)的。FAT12文件分配表要比FAT16和FAT32的文件分配表小,因?yàn)樗鼘?duì)每個(gè)條目使用的空間較少。這就給數(shù)據(jù)留下較多的空間。所有用FAT12格式化的5.25英寸軟盤以及1.44MB的3.5英寸軟盤都是由FAT12格式化的。除了FAT表中記錄每簇鏈結(jié)的二進(jìn)制位數(shù)與FAT16不同外,其余原理與FAT16均相同,不再單獨(dú)解釋。。。 格式化FAT16分區(qū)時(shí),格式化程序根據(jù)分區(qū)的大小確定簇的大小,然后根據(jù)保留扇區(qū)的數(shù)目、根目錄的扇區(qū)數(shù)目、數(shù)據(jù)區(qū)可分的簇?cái)?shù)與FAT表本身所占空間 來(lái)確定FAT表所需的扇區(qū)數(shù)目,然后將計(jì)算后的結(jié)果寫(xiě)入DBR的相關(guān)位置。
(FAT16 DBR參數(shù)的偏移0x11和0x12,內(nèi)容:00 02。轉(zhuǎn)換一下,就是0200H,表示根目錄項(xiàng)數(shù)(Root Entries) 能夠保存在該分區(qū)的根目錄文件夾中的32個(gè)字節(jié)長(zhǎng)的文件和文件夾名稱項(xiàng)的總數(shù)。在一個(gè)典型的硬盤上,本字段的值為512,一般根目錄的扇區(qū)數(shù)為32個(gè)扇區(qū)))。偏移0x16和0x17記錄了FAT1一個(gè)表所占扇區(qū)的數(shù)據(jù)。偏移0x10記錄了FAT表的副本數(shù)目。系統(tǒng)在得到這幾項(xiàng)參數(shù)以后,就可以確定數(shù)據(jù)區(qū)的開(kāi)始扇區(qū)偏移了。
FAT16文件系統(tǒng)從根目錄所占的32個(gè)扇區(qū)之后的第一個(gè)扇區(qū)開(kāi)始以簇為單位進(jìn)行數(shù)據(jù)的處理,這之前仍以扇區(qū)為單位。對(duì)于根目錄之后的第一個(gè)簇,系統(tǒng)并不編號(hào)為第0簇或第1簇 (可能是留作關(guān)鍵字的原因吧),而是編號(hào)為第2簇,也就是說(shuō)數(shù)據(jù)區(qū)順序上的第1個(gè)簇也是編號(hào)上的第2簇。
FAT文件系統(tǒng)之所以有12,16,32不同的版本之分,其根本在于FAT表用來(lái)記錄任意一簇鏈接的二進(jìn)制位數(shù)。以FAT16為例,每一簇在FAT表中占據(jù)2字節(jié)(二進(jìn)制16位)。所以,F(xiàn)AT16最大可以表示的簇號(hào)為0xFFFF(十進(jìn)制的65535),以32K為簇的大小的話,F(xiàn)AT32可以管理的最大磁盤空間為:32KB×65535=2048MB,這就是為什么FAT16不支持超過(guò)2GB分區(qū)的原因。
FAT表實(shí)際上是一個(gè)數(shù)據(jù)表,以2個(gè)字節(jié)為單位,我們暫將這個(gè)單位稱為FAT記錄項(xiàng),通常情況其第1、2個(gè)記錄項(xiàng)(前4個(gè)字節(jié))用作介質(zhì)描述。從第三個(gè)記錄項(xiàng)開(kāi)始記錄除根目錄外的其他文件及文件夾的簇鏈情況。根據(jù)簇的表現(xiàn)情況FAT用相應(yīng)的取值來(lái)描述,見(jiàn)表10 表10 FAT16記錄項(xiàng)的取值含義(16進(jìn)制)
| FAT16記錄項(xiàng)的取值
| 對(duì)應(yīng)簇的表現(xiàn)情況
| 0000
| 未分配的簇
| 0002~FFEF
| 已分配的簇
| FFF0~FFF6
| 系統(tǒng)保留
| FFF7
| 壞簇
| FFF8~FFFF
| 文件結(jié)束簇 一般為FFFF
|
文件的結(jié)束符為0D0A。
看一幅在winhex所截FAT16的文件分配表,圖10: 
如圖,F(xiàn)AT表以"F8 FF FF FF" 開(kāi)頭,此2字節(jié)為介質(zhì)描述單元,并不參與FAT表簇鏈關(guān)系。小紅字標(biāo)出的是FAT扇區(qū)每2字節(jié)對(duì)應(yīng)的簇號(hào)。
相對(duì)偏移0x4~0x5偏移為第2簇(順序上第1簇),此處為FF,表示存儲(chǔ)在第2簇上的文件(目錄)是個(gè)小文件,只占用1個(gè)簇便結(jié)束了。
第3簇中存放的數(shù)據(jù)是0x0005,這是一個(gè)文件或文件夾的首簇。其內(nèi)容為第5簇,就是說(shuō)接下來(lái)的簇位于第5簇——〉 FAT表指引我們到達(dá)FAT表的第5簇指向,上面寫(xiě)的數(shù)據(jù)是"FF FF",意即此文件已至尾簇。
第4簇中存放的數(shù)據(jù)是0x0006,這又是一個(gè)文件或文件夾的首簇。其內(nèi)容為第6簇,就是說(shuō)接下來(lái)的簇位于第6簇——〉FAT表指引我們到達(dá)FAT表的第6簇指向,上面寫(xiě)的數(shù)據(jù)是0x0007,就是說(shuō)接下來(lái)的簇位于第7簇——〉FAT表指引我們到達(dá)FAT表的第7簇指向……直到根據(jù)FAT鏈讀取到扇區(qū)相對(duì)偏移0x1A~0x1B,也就是第13簇,上面寫(xiě)的數(shù)據(jù)是0x000E,也就是指向第14簇——〉14簇的內(nèi)容為"FF FF",意即此文件已至尾簇。
后面的FAT表數(shù)據(jù)與上面的道理相同。不再分析。
FAT表記錄了磁盤數(shù)據(jù)文件的存儲(chǔ)鏈表,對(duì)于數(shù)據(jù)的讀取而言是極其重要的,以至于Microsoft為其開(kāi)發(fā)的FAT文件系統(tǒng)中的FAT表創(chuàng)建了一份備份,就是我們看到的FAT2。FAT2與FAT1的內(nèi)容通常是即時(shí)同步的,也就是說(shuō)如果通過(guò)正常的系統(tǒng)讀寫(xiě)對(duì)FAT1做了更改,那么FAT2也同樣被更新。如果從這個(gè)角度來(lái)看,系統(tǒng)的這個(gè)功能在數(shù)據(jù)恢復(fù)時(shí)是個(gè)天災(zāi)。 FAT文件系統(tǒng)的目錄結(jié)構(gòu)其實(shí)是一顆有向的從根到葉的樹(shù),這里提到的有向是指對(duì)于FAT分區(qū)內(nèi)的任一文件(包括文件夾),均需從根目錄尋址來(lái)找到?梢赃@樣認(rèn)為:目錄存儲(chǔ)結(jié)構(gòu)的入口就是根目錄。
FAT文件系統(tǒng)根據(jù)根目錄來(lái)尋址其他文件(包括文件夾),故而根目錄的位置必須在磁盤存取數(shù)據(jù)之前得以確定。FAT文件系統(tǒng)就是根據(jù)分區(qū)的相關(guān)DBR參數(shù)與DBR中存放的已經(jīng)計(jì)算好的FAT表(2份)的大小來(lái)確定的。格式化以后,跟目錄的大小和位置其實(shí)都已經(jīng)確定下來(lái)了:位置緊隨FAT2之后,大小通常為32個(gè)扇區(qū)。根目錄之后便是數(shù)據(jù)區(qū)第2簇。
FAT文件系統(tǒng)的一個(gè)重要思想是把目錄(文件夾)當(dāng)作一個(gè)特殊的文件來(lái)處理,F(xiàn)AT32甚至將根目錄當(dāng)作文件處理(旁:NTFS將分區(qū)參數(shù)、安全權(quán)限等好多東西抽象為文件更是這個(gè)思想的升華),在FAT16中,雖然根目錄地位并不等同于普通的文件或者說(shuō)是目錄,但其組織形式和普通的目錄(文件夾)并沒(méi)有不同。FAT分區(qū)中所有的文件夾(目錄)文件,實(shí)際上可以看作是一個(gè)存放其他文件(文件夾)入口參數(shù)的數(shù)據(jù)表。所以目錄的占用空間的大小并不等同于其下所有數(shù)據(jù)的大小,但也不等同于0。通常是占很小的空間的,可以看作目錄文件是一個(gè)簡(jiǎn)單的二維表文件。其具體存儲(chǔ)原理是:
不管目錄文件所占空間為多少簇,一簇為多少字節(jié)。系統(tǒng)都會(huì)以32個(gè)字節(jié)為單位進(jìn)行目錄文件所占簇的分配。這32個(gè)字節(jié)以確定的偏移來(lái)定義本目錄下的一個(gè)文件(或文件夾)的屬性,實(shí)際上是一個(gè)簡(jiǎn)單的二維表。
這32個(gè)字節(jié)的各字節(jié)偏移定義如表11: 表11 FAT16目錄項(xiàng)32個(gè)字節(jié)的表示定義
| 字節(jié)偏移(16進(jìn)制)
| 字節(jié)數(shù)
| 定義
| 0x0~0x7
| 8
| 文件名
| 0x8~0xA
| 3
| 擴(kuò)展名
| 0xB
| 1
| 屬性字節(jié)
| 00000000(讀寫(xiě))
| 00000001(只讀)
| 00000010(隱藏)
| 00000100(系統(tǒng))
| 00001000(卷標(biāo))
| 00010000(子目錄)
| 00100000(歸檔)
| 0xC~0x15
| 10
| 系統(tǒng)保留
| 0x16~0x17
| 2
| 文件的最近修改時(shí)間
| 0x18~0x19
| 2
| 文件的最近修改日期
| 0x1A~0x1B
| 2
| 表示文件的首簇號(hào)
| 0x1C~0x1F
| 4
| 表示文件的長(zhǎng)度(字節(jié)為單位)
|
對(duì)表11中的一些取值進(jìn)行說(shuō)明:
(1)、對(duì)于短文件名,系統(tǒng)將文件名分成兩部分進(jìn)行存儲(chǔ),即主文件名+擴(kuò)展名。0x0~0x7字節(jié)記錄文件的主文件名,0x8~0xA記錄文件的擴(kuò)展名,取文件名中的ASCII碼值。不記錄主文件名與擴(kuò)展名之間的"." 主文件名不足8個(gè)字符以空白符(20H)填充,擴(kuò)展名不足3個(gè)字符同樣以空白符(20H)填充。0x0偏移處的取值若為00H,表明目錄項(xiàng)為空;若為E5H,表明目錄項(xiàng)曾被使用,但對(duì)應(yīng)的文件或文件夾已被刪除。(這也是誤刪除后恢復(fù)的理論依據(jù))。文件名中的第一個(gè)字符若為“.”或“..”表示這個(gè)簇記錄的是一個(gè)子目錄的目錄項(xiàng)!.”代表當(dāng)前目錄;“..”代表上級(jí)目錄(和我們?cè)赿os或windows中的使用意思是一樣的,如果磁盤數(shù)據(jù)被破壞,就可以通過(guò)這兩個(gè)目錄項(xiàng)的具體參數(shù)推算磁盤的數(shù)據(jù)區(qū)的起始位置,猜測(cè)簇的大小等等,故而是比較重要的)
(2)、0xB的屬性字段:可以看作系統(tǒng)將0xB的一個(gè)字節(jié)分成8位,用其中的一位代表某種屬性的有或無(wú)。這樣,一個(gè)字節(jié)中的8位每位取不同的值就能反映各個(gè)屬性的不同取值了。如00000101就表示這是個(gè)文件,屬性是只讀、系統(tǒng)。
(3)、0xC~0x15在原FAT16的定義中是保留未用的。在高版本的WINDOWS系統(tǒng)中有時(shí)也用它來(lái)記錄修改時(shí)間和最近訪問(wèn)時(shí)間。那樣其字段的意義和FAT32的定義是相同的,見(jiàn)后邊FAT32。
(4)、0x16~0x17中的時(shí)間=小時(shí)*2048+分鐘*32+秒/2。得出的結(jié)果換算成16進(jìn)制填入即可。也就是:0x16字節(jié)的0~4位是以2秒為單位的量值;0x16字節(jié)的5~7位和0x17字節(jié)的0~2位是分鐘;0x17字節(jié)的3~7位是小時(shí)。
(5)、0x18~0x19中的日期=(年份-1980)*512+月份*32+日。得出的結(jié)果換算成16進(jìn)制填入即可。也就是:0x18字節(jié)0~4位是日期數(shù);0x18字節(jié)5~7位和0x19字節(jié)0位是月份;0x19字節(jié)的1~7位為年號(hào),原定義中0~119分別代表1980~2099,目前高版本的Windows允許取0~127,即年號(hào)最大可以到2107年。
(6)、0x1A~0x1B存放文件或目錄的表示文件的首簇號(hào),系統(tǒng)根據(jù)掌握的首簇號(hào)在FAT表中找到入口,然后再跟蹤簇鏈直至簇尾,同時(shí)用0x1C~0x1F處字節(jié)判定有效性。就可以完全無(wú)誤的讀取文件(目錄)了。
(7)、普通子目錄的尋址過(guò)程也是通過(guò)其父目錄中的目錄項(xiàng)來(lái)指定的,與數(shù)據(jù)文件(指非目錄文件)不同的是目錄項(xiàng)偏移0xB的第4位置1,而數(shù)據(jù)文件為0。 對(duì)于整個(gè)FAT分區(qū)而言,簇的分配并不完全總是分配干凈的。如一個(gè)數(shù)據(jù)區(qū)為99個(gè)扇區(qū)的FAT系統(tǒng),如果簇的大小設(shè)定為2扇區(qū),就會(huì)有1個(gè)扇區(qū)無(wú)法分配給任何一個(gè)簇。這就是分區(qū)的剩余扇區(qū),位于分區(qū)的末尾。有的系統(tǒng)用最后一個(gè)剩余扇區(qū)備份本分區(qū)的DBR,這也是一種好的備份方法。
早的FAT16系統(tǒng)并沒(méi)有長(zhǎng)文件名一說(shuō),Windows操作系統(tǒng)已經(jīng)完全支持在FAT16上的長(zhǎng)文件名了。FAT16的長(zhǎng)文件名與FAT32長(zhǎng)文件名的定義是相同的,關(guān)于長(zhǎng)文件名,在FAT32部分再詳細(xì)作解釋。
|