




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、硬盤 FAT 文件系統(tǒng)原理的詳細(xì)分析一、硬盤的物理結(jié)構(gòu): 硬盤存儲(chǔ)數(shù)據(jù)是根據(jù)電、磁轉(zhuǎn)換原理實(shí)現(xiàn)的。硬盤由一個(gè)或幾個(gè)表面鍍有磁性物質(zhì)的金屬或玻璃等物質(zhì)盤片以及盤片兩面所安裝的磁頭和相應(yīng)的控制電路組成 ( 圖 1) ,其中盤片和磁頭密封在無塵的金屬殼中。 硬盤工作時(shí),盤片以設(shè)計(jì)轉(zhuǎn)速高速旋轉(zhuǎn),設(shè)置在盤片表面的磁頭則在電路控制下徑向移動(dòng)到指定位置然后將數(shù)據(jù)存儲(chǔ)或讀取出來。當(dāng)系統(tǒng)向硬盤寫入數(shù)據(jù)時(shí),磁頭中 “ 寫數(shù)據(jù) ” 電流產(chǎn)生磁場使盤片表面磁性物質(zhì)狀態(tài)發(fā)生改變,并在寫電流磁場消失后仍能保持,這樣數(shù)據(jù)就存儲(chǔ)下來了;當(dāng)系統(tǒng)從硬盤中讀數(shù)據(jù)時(shí),磁頭經(jīng)過盤片指定區(qū)域,盤片表面磁場使磁頭產(chǎn)生感應(yīng)電流或線圈阻抗產(chǎn)生
2、變化,經(jīng)相關(guān)電路處理后還原成數(shù)據(jù)。因此只要能將盤片表面處理得更平滑、磁頭設(shè)計(jì)得更精密以及盡量提高盤片旋轉(zhuǎn)速度,就能造出容量更大、讀寫數(shù)據(jù)速度更快的硬盤。這是因?yàn)楸P片表面處理越平、轉(zhuǎn)速越快就能越使磁頭離盤片表面越近,提高讀、寫靈敏度和速度;磁頭設(shè)計(jì)越小越精密就能使磁頭在盤片上占用空間越小,使磁頭在一張盤片上建立更多的磁道以存儲(chǔ)更多的數(shù)據(jù)。 二、硬盤的邏輯結(jié)構(gòu): 硬盤由很多盤片 (platter) 組成,每個(gè)盤片的每個(gè)面都有一個(gè)讀寫磁頭。如果有 N 個(gè)盤片。就有 2N 個(gè)面,對(duì)應(yīng) 2N 個(gè)磁頭 (Heads) ,從 0 、 1 、 2 開始編號(hào)。每個(gè)盤片被劃分成若干個(gè)同心圓磁道 ( 邏輯上的,是不
3、可見的。 ) 每個(gè)盤片的劃分規(guī)則通常是一樣的。這樣每個(gè)盤片的半徑均為固定值 R 的同心圓再邏輯上形成了一個(gè)以電機(jī)主軸為軸的柱面 (Cylinders) ,從外至里編號(hào)為 0 、 1 、 2 每個(gè)盤片上的每個(gè)磁道又被劃分為幾十個(gè)扇區(qū) (Sector) ,通常的容量是 512byte ,并按照一定規(guī)則編號(hào)為 1 、 2 、 3 形成 Cylinders×Heads×Sector 個(gè)扇區(qū)。這三個(gè)參數(shù)即是硬盤的物理參數(shù)。我們下面的很多實(shí)踐需要深刻理解這三個(gè)參數(shù)的意義。 三、磁盤引導(dǎo)原理: 3.1 MBR(master boot record) 扇區(qū): 計(jì)算機(jī)在按下 power 鍵以
4、后,開始執(zhí)行主板 bios 程序。進(jìn)行完一系列檢測(cè)和配置以后。開始按 bios 中設(shè)定的系統(tǒng)引導(dǎo)順序引導(dǎo)系統(tǒng)。假定現(xiàn)在是硬盤。 Bios 執(zhí)行完自己的程序后如何把執(zhí)行權(quán)交給硬盤呢。交給硬盤后又執(zhí)行存儲(chǔ)在哪里的程序呢。其實(shí),稱為 mbr 的一段代碼起著舉足輕重的作用。 MBR(master boot record), 即主引導(dǎo)記錄,有時(shí)也稱主引導(dǎo)扇區(qū)。位于整個(gè)硬盤的 0 柱面 0 磁頭 1 扇區(qū) ( 可以看作是硬盤的第一個(gè)扇區(qū) ) , bios 在執(zhí)行自己固有的程序以后就會(huì) jump 到 mbr 中的第一條指令。將系統(tǒng)的控制權(quán)交由 mbr 來執(zhí)行。在總共 512byte 的主引導(dǎo)記錄中, MBR
5、 的引導(dǎo)程序占了其中的前 446 個(gè)字節(jié) ( 偏移 0H 偏移 1BDH) ,隨后的 64 個(gè)字節(jié) ( 偏移 1BEH 偏移 1FDH) 為 DPT(Disk PartitionTable ,硬盤分區(qū)表 ) ,最后的兩個(gè)字節(jié) “55 AA”( 偏移 1FEH 偏移 1FFH) 是分區(qū)有效結(jié)束標(biāo)志。 MBR 不隨操作系統(tǒng)的不同而不同,意即不同的操作系統(tǒng)可能會(huì)存在相同的 MBR ,即使不同, MBR 也不會(huì)夾帶操作系統(tǒng)的性質(zhì)。具有公共引導(dǎo)的特性。 我們來分析一段 mbr 。下面是用 winhex 查看的一塊希捷 120GB 硬盤的 mbr 。 你的硬盤的 MBR 引導(dǎo)代碼可能并非這樣。不過即使不同
6、,所執(zhí)行的功能大體是一樣的。 這里找 wowocock 關(guān)于磁盤 mbr 的反編譯,已加了詳細(xì)的注釋,感興趣可以細(xì)細(xì)研究一下。 我們看 DPT 部分。操作系統(tǒng)為了便于用戶對(duì)磁盤的管理。加入了磁盤分區(qū)的概念。即將一塊磁盤邏輯劃分為幾塊。磁盤分區(qū)數(shù)目的多少只受限于 C Z 的英文字母的數(shù)目,在上圖 DPT 共 64 個(gè)字節(jié)中如何表示多個(gè)分區(qū)的屬性呢 ?microsoft 通過鏈接的方法解決了這個(gè)問題。在 DPT 共 64 個(gè)字節(jié)中,以 16 個(gè)字節(jié)為分區(qū)表項(xiàng)單位描述一個(gè)分區(qū)的屬性。也就是說,第一個(gè)分區(qū)表項(xiàng)描述一個(gè)分區(qū)的屬性,一般為基本分區(qū)。第二個(gè)分區(qū)表項(xiàng)描述除基本分區(qū)外的其余空間,一般而言,就是我
7、們所說的擴(kuò)展分區(qū)。這部分的大體說明見表 1 。 注:上表中的超過 1 字節(jié)的數(shù)據(jù)都以實(shí)際數(shù)據(jù)顯示,就是按高位到地位的方式顯示。存儲(chǔ)時(shí)是按低位到高位存儲(chǔ)的。兩者表現(xiàn)不同,請(qǐng)仔細(xì)看清楚。以后出現(xiàn)的表,圖均同。 也可以在 winhex 中看到這些參數(shù)的意義: 說明: 每個(gè)分區(qū)表項(xiàng)占用 16 個(gè)字節(jié),假定偏移地址從 0 開始。如圖 3 的分區(qū)表項(xiàng) 3 。分區(qū)表項(xiàng) 4 同分區(qū)表項(xiàng) 3 。 1 、 0H 偏移為活動(dòng)分區(qū)是否標(biāo)志,只能選 00H 和 80H 。 80H 為活動(dòng), 00H 為非活動(dòng)。其余值對(duì) microsoft 而言為非法值。 2 、重新說明一下 ( 這個(gè)非常重要 ) :大于 1 個(gè)字節(jié)的數(shù)被
8、以低字節(jié)在前的存儲(chǔ)格式格式 (little endian format) 或稱反字節(jié)順序保存下來。低字節(jié)在前的格式是一種保存數(shù)的方法,這樣,最低位的字節(jié)最先出現(xiàn)在十六進(jìn)制數(shù)符號(hào)中。例如,相對(duì)扇區(qū)數(shù)字段的值 0x3F000000 的低字節(jié)在前表示為 0x0000003F 。這個(gè)低字節(jié)在前的格式數(shù)的十進(jìn)制數(shù)為 63 。3 、系統(tǒng)在分區(qū)時(shí),各分區(qū)都不允許跨柱面,即均以柱面為單位,這就是通常所說的分區(qū)粒度。有時(shí)候我們分區(qū)是輸入分區(qū)的大小為 7000M ,分出來卻是 6997M ,就是這個(gè)原因。 偏移 2H 和偏移 6H 的扇區(qū)和柱面參數(shù)中 , 扇區(qū)占 6 位 (bit) ,柱面占 10 位 (bit)
9、 ,以偏移 6H 為例,其低 6 位用作扇區(qū)數(shù)的二進(jìn)制表示。其高兩位做柱面數(shù) 10 位中的高兩位,偏移 7H 組成的 8 位做柱面數(shù) 10 位中的低 8 位。由此可知,實(shí)際上用這種方式表示的分區(qū)容量是有限的,柱面和磁頭從 0 開始編號(hào) , 扇區(qū)從 1 開始編號(hào) , 所以最多只能表示 1024 個(gè)柱面 ×63 個(gè)扇區(qū) ×256 個(gè)磁頭 ×512byte=8455716864byte 。即通常的 8.4GB( 實(shí)際上應(yīng)該是 7.8GB 左右 ) 限制。實(shí)際上磁頭數(shù)通常只用到 255 個(gè) ( 由匯編語言的尋址寄存器決定 ), 即使把這 3 個(gè)字節(jié)按線性尋址,依然力不從心
10、。 在后來的操作系統(tǒng)中,超過 8.4GB 的分區(qū)其實(shí)已經(jīng)不通過 C/H/S 的方式尋址了。而是通過偏移 CH 偏移 FH 共 4 個(gè)字節(jié) 32 位線性扇區(qū)地址來表示分區(qū)所占用的扇區(qū)總數(shù)??芍ㄟ^ 4 個(gè)字節(jié)可以表示 232 個(gè)扇區(qū),即 2TB=2048GB ,目前對(duì)于大多數(shù)計(jì)算機(jī)而言,這已經(jīng)是個(gè)天文數(shù)字了。在未超過 8.4GB 的分區(qū)上, C/H/S 的表示方法和線性扇區(qū)的表示方法所表示的分區(qū)大小是一致的。也就是說,兩種表示方法是協(xié)調(diào)的。即使不協(xié)調(diào),也以線性尋址為準(zhǔn)。 ( 可能在某些系統(tǒng)中會(huì)提示出錯(cuò) ) 。超過 8.4GB 的分區(qū)結(jié)束 C/H/S 一般填充為 FEH FFH FFH 。即 C/
11、H/S 所能表示的最大值。有時(shí)候也會(huì)用柱面對(duì) 1024 的模來填充。不過這幾個(gè)字節(jié)是什么其實(shí)都無關(guān)緊要了。 雖然現(xiàn)在的系統(tǒng)均采用線性尋址的方式來處理分區(qū)的大小。但不可跨柱面的原則依然沒變。本分區(qū)的扇區(qū)總數(shù)加上與前一分區(qū)之間的保留扇區(qū)數(shù)目依然必須是柱面容量的整數(shù)倍。 ( 保留扇區(qū)中的第一個(gè)扇區(qū)就是存放分區(qū)表的 MBR 或虛擬 MBR 的扇區(qū),分區(qū)的扇區(qū)總數(shù)在線性表示方式上是不計(jì)入保留扇區(qū)的。如果是第一個(gè)分區(qū),保留扇區(qū)是本分區(qū)前的所有扇區(qū)。 附:分區(qū)表類型標(biāo)志如圖 4 3.2 擴(kuò)展分區(qū) 擴(kuò)展分區(qū)中的每個(gè)邏輯驅(qū)動(dòng)器都存在一個(gè)類似于 MBR 的擴(kuò)展引導(dǎo)記錄 ( Extended Boot Record
12、, EBR) ,也有人稱之為虛擬 mbr 或擴(kuò)展 mbr ,意思是一樣的。擴(kuò)展引導(dǎo)記錄包括一個(gè)擴(kuò)展分區(qū)表和該扇區(qū)的標(biāo)簽。擴(kuò)展引導(dǎo)記錄將記錄只包含擴(kuò)展分區(qū)中每個(gè)邏輯驅(qū)動(dòng)器的第一個(gè)柱面的第一面的信息。一個(gè)邏輯驅(qū)動(dòng)器中的引導(dǎo)扇區(qū)一般位于相對(duì)扇區(qū) 32 或 63 。但是,如果磁盤上沒有擴(kuò)展分區(qū),那么就不會(huì)有擴(kuò)展引導(dǎo)記錄和邏輯驅(qū)動(dòng)器。第一個(gè)邏輯驅(qū)動(dòng)器的擴(kuò)展分區(qū)表中的第一項(xiàng)指向它自身的引導(dǎo)扇區(qū)。第二項(xiàng)指向下一個(gè)邏輯驅(qū)動(dòng)器的 EBR 。如果不存在進(jìn)一步的邏輯驅(qū)動(dòng)器,第二項(xiàng)就不會(huì)使用,而且被記錄成一系列零。如果有附加的邏輯驅(qū)動(dòng)器,那么第二個(gè)邏輯驅(qū)動(dòng)器的擴(kuò)展分區(qū)表的第一項(xiàng)會(huì)指向它本身的引導(dǎo)扇區(qū)。第二個(gè)邏輯驅(qū)動(dòng)器
13、的擴(kuò)展分區(qū)表的第二項(xiàng)指向下一個(gè)邏輯驅(qū)動(dòng)器的 EBR 。擴(kuò)展分區(qū)表的第三項(xiàng)和第四項(xiàng)永遠(yuǎn)都不會(huì)被使用。 通過一幅 4 分區(qū)的磁盤結(jié)構(gòu)圖可以看到磁盤的大致組織形式。如圖 5 : 關(guān)于擴(kuò)展分區(qū),如圖 6 所示,擴(kuò)展分區(qū)中邏輯驅(qū)動(dòng)器的擴(kuò)展引導(dǎo)記錄是一個(gè)連接表。該圖顯示了一個(gè)擴(kuò)展分區(qū)上的三個(gè)邏輯驅(qū)動(dòng)器,說明了前面的邏輯驅(qū)動(dòng)器和最后一個(gè)邏輯驅(qū)動(dòng)器之間在擴(kuò)展分區(qū)表中的差異。 除了擴(kuò)展分區(qū)上最后一個(gè)邏輯驅(qū)動(dòng)器外,表 2 中所描述的擴(kuò)展分區(qū)表的格式在每個(gè)邏輯驅(qū)動(dòng)器中都是重復(fù)的:第一個(gè)項(xiàng)標(biāo)識(shí)了邏輯驅(qū)動(dòng)器本身的引導(dǎo)扇區(qū),第二個(gè)項(xiàng)標(biāo)識(shí)了下一個(gè)邏輯驅(qū)動(dòng)器的 EBR 。最后一個(gè)邏輯驅(qū)動(dòng)器的擴(kuò)展分區(qū)表只會(huì)列出它本身的分區(qū)項(xiàng)。
14、最后一個(gè)擴(kuò)展分區(qū)表的第二個(gè)項(xiàng)到第四個(gè)項(xiàng)被使用。 擴(kuò)展分區(qū)表項(xiàng)中的相對(duì)扇區(qū)數(shù)字段所顯示的是從擴(kuò)展分區(qū)開始到邏輯驅(qū)動(dòng)器中第一個(gè)扇區(qū)的位移的字節(jié)數(shù)??偵葏^(qū)數(shù)字段中的數(shù)是指組成該邏輯驅(qū)動(dòng)器的扇區(qū)數(shù)目。總扇區(qū)數(shù)字段的值等于從擴(kuò)展分區(qū)表項(xiàng)所定義的引導(dǎo)扇區(qū)到邏輯驅(qū)動(dòng)器末尾的扇區(qū)數(shù)。 有時(shí)候在磁盤的末尾會(huì)有剩余空間,剩余空間是什么呢?我們前面說到,分區(qū)是以 1 柱面的容量為分區(qū)粒度的,那么如果磁盤總空間不是整數(shù)個(gè)柱面的話,不夠一個(gè)柱面的剩下的空間就是剩余空間了,這部分空間并不參與分區(qū),所以一般無法利用。照道理說,磁盤的物理模式?jīng)Q定了磁盤的總?cè)萘烤蛻?yīng)該是整數(shù)個(gè)柱面的容量,為什么會(huì)有不夠一個(gè)柱面的空間呢。在我的理
15、解看來,本來現(xiàn)在的磁盤為了更大的利用空間,一般在物理上并不是按照外圍的扇區(qū)大于里圈的扇區(qū)這種管理方式,只是為了與操作系統(tǒng)兼容而抽象出來 CHS ??赡芷鋵?shí)際空間 zymail 四、 FAT 分區(qū)原理 先來一幅結(jié)構(gòu)圖: 現(xiàn)在我們著重研究 FAT 格式分區(qū)內(nèi)數(shù)據(jù)是如何存儲(chǔ)的。 FAT 分區(qū)格式是 MICROSOFT 最早支持的分區(qū)格式,依據(jù) FAT 表中每個(gè)簇鏈的所占位數(shù) ( 有關(guān)概念,后面會(huì)講到 ) 分為 fat12 、 fat16 、 fat32 三種格式 " 變種 " ,但其基本存儲(chǔ)方式是相似的。 仔細(xì)研究圖 7 中的 fat16 和 fat32 分區(qū)的組成結(jié)構(gòu)。下面依次
16、解釋 DBR 、 FAT1 、 FAT2 、根目錄、數(shù)據(jù)區(qū)、剩余扇區(qū)的概念。提到的地址如無特別提示均為分區(qū)內(nèi)部偏移。 4.1 關(guān)于 DBR. DBR 區(qū) (DOS BOOT RECORD) 即操作系統(tǒng)引導(dǎo)記錄區(qū)的意思,通常占用分區(qū)的第 0 扇區(qū)共 512 個(gè)字節(jié) ( 特殊情況也要占用其它保留扇區(qū),我們先說第 0 扇 ) 。在這 512 個(gè)字節(jié)中,其實(shí)又是由跳轉(zhuǎn)指令,廠商標(biāo)志和操作系統(tǒng)版本號(hào), BPB(BIOS Parameter Block) ,擴(kuò)展 BPB , os 引導(dǎo)程序,結(jié)束標(biāo)志幾部分組成。 以用的最多的 FAT32 為例說明分區(qū) DBR 各字節(jié)的含義。見圖 8 。 圖 8 的對(duì)應(yīng)解釋
17、見表 3 圖 9 給出了 winhex 對(duì)圖 8 DBR 的相關(guān)參數(shù)解釋: 根據(jù)上邊圖例,我們來討論 DBR 各字節(jié)的參數(shù)意義。 MBR 將 CPU 執(zhí)行轉(zhuǎn)移給引導(dǎo)扇區(qū),因此,引導(dǎo)扇區(qū)的前三個(gè)字節(jié)必須是合法的可執(zhí)行的基于 x86 的 CPU 指令。這通常是一條跳轉(zhuǎn)指令,該指令負(fù)責(zé)跳過接下來的幾個(gè)不可執(zhí)行的字節(jié) (BPB 和擴(kuò)展 BPB) ,跳到操作系統(tǒng)引導(dǎo)代碼部分。 跳轉(zhuǎn)指令之后是 8 字節(jié)長的 OEM ID ,它是一個(gè)字符串, OEM ID 標(biāo)識(shí)了格式化該分區(qū)的操作系統(tǒng)的名稱和版本號(hào)。為了保留與 MS-DOS 的兼容性,通常 Windows 2000 格式化該盤是在 FAT16 和 FAT3
18、2 磁盤上的該字段中記錄了 “MSDOS 5.0” ,在 NTFS 磁盤上 ( 關(guān)于 ntfs ,另述 ) , Windows 2000 記錄的是 “NTFS” 。通常在被 Windows 95 格式化的磁盤上 OEM ID 字段出現(xiàn) “MSWIN4.0” ,在被 Windows 95 OSR2 和 Windows 98 格式化的磁盤上 OEM ID 字段出現(xiàn) “MSWIN4.1” 。 接下來的從偏移 0x0B 開始的是一段描述能夠使可執(zhí)行引導(dǎo)代碼找到相關(guān)參數(shù)的信息。通常稱之為 BPB(BIOS Parameter Block) , BPB 一般開始于相同的位移量,因此,標(biāo)準(zhǔn)的參數(shù)都處于一個(gè)已
19、知的位置。磁盤容量和幾何結(jié)構(gòu)變量都被封在 BPB 之中。由于引導(dǎo)扇區(qū)的第一部分是一個(gè) x86 跳轉(zhuǎn)指令。因此,將來通過在 BPB 末端附加新的信息,可以對(duì) BPB 進(jìn)行擴(kuò)展。只需要對(duì)該跳轉(zhuǎn)指令作一個(gè)小的調(diào)整就可以適應(yīng) BPB 的變化。圖 9 已經(jīng)列出了項(xiàng)目的名稱和取值,為了系統(tǒng)的研究,針對(duì)圖 8 ,將 FAT32 分區(qū)格式的 BPB 含義和擴(kuò)展 BPB 含義釋義為表格,見表 4 和表 5 。 DBR 的偏移 0x5A 開始的數(shù)據(jù)為操作系統(tǒng)引導(dǎo)代碼。這是由偏移 0x00 開始的跳轉(zhuǎn)指令所指向的。在圖 8 所列出的偏移 0x000x02 的跳轉(zhuǎn)指令 "EB 58 90" 清楚地
20、指明了 OS 引導(dǎo)代碼的偏移位置。 jump 58H 加上跳轉(zhuǎn)指令所需的位移量,即開始于 0x5A 。此段指令在不同的操作系統(tǒng)上和不同的引導(dǎo)方式上,其內(nèi)容也是不同的。大多數(shù)的資料上都說 win98, 構(gòu)建于 fat 基本分區(qū)上的 win2000,winxp 所使用的 DBR 只占用基本分區(qū)的第 0 扇區(qū)。他們提到,對(duì)于 fat32 ,一般的 32 個(gè)基本分區(qū)保留扇區(qū)只有第 0 扇區(qū)是有用的。實(shí)際上,以 FAT32 構(gòu)建的操作系統(tǒng)如果是 win98, 系統(tǒng)會(huì)使用基本分區(qū)的第 0 扇區(qū)和第 2 扇區(qū)存儲(chǔ) os 引導(dǎo)代碼;以 FAT32 構(gòu)建的操作系統(tǒng)如果是 win2000 或 winxp, 系統(tǒng)會(huì)
21、使用基本分區(qū)的第 0 扇區(qū)和第 0xC 扇區(qū) (win2000 或 winxp, 其第 0xC 的位置由第 0 扇區(qū)的 0xAB 偏移指出 ) 存儲(chǔ) os 引導(dǎo)代碼。所以,在 fat32 分區(qū)格式上,如果 DBR 一扇區(qū)的內(nèi)容正確而缺少第 2 扇區(qū) (win98 系統(tǒng) ) 或第 0xC 扇區(qū) (win2000 或 winxp 系統(tǒng) ) ,系統(tǒng)也是無法啟動(dòng)的。如果自己手動(dòng)設(shè)置 NTLDR 雙系統(tǒng),必須知道這一點(diǎn)。 DBR 扇區(qū)的最后兩個(gè)字節(jié)一般存儲(chǔ)值為 0x55AA 的 DBR 有效標(biāo)志,對(duì)于其他的取值,系統(tǒng)將不會(huì)執(zhí)行 DBR 相關(guān)指令。上面提到的其他幾個(gè)參與 os 引導(dǎo)的扇區(qū)也需以 0x55A
22、A 為合法結(jié)束標(biāo)志。 FAT16 DBR : FAT32 中 DBR 的含義大致如此,對(duì)于 FAT12 和 FAT16 其基本意義類似,只是相關(guān)偏移量和參數(shù)意義有小的差異, FAT 格式的區(qū)別和來因,以后會(huì)說到,此處不在多說 FAT12 與 FAT16 。我將 FAT16 的扇區(qū)參數(shù)意義列表。感興趣的朋友自己研究一下,和 FAT32 大同小異的。 4.2 關(guān)于保留扇區(qū) 在上述 FAT 文件系統(tǒng) DBR 的偏移 0x0E 處,用 2 個(gè)字節(jié)存儲(chǔ)保留扇區(qū)的數(shù)目。所謂保留扇區(qū) ( 有時(shí)候會(huì)叫系統(tǒng)扇區(qū),隱藏扇區(qū) ) ,是指從分區(qū) DBR 扇區(qū)開始的僅為系統(tǒng)所有的扇區(qū),包括 DBR 扇區(qū)。在 FAT16
23、 文件系統(tǒng)中,保留扇區(qū)的數(shù)據(jù)通常設(shè)置為 1 ,即僅僅 DBR 扇區(qū)。而在 FAT32 中,保留扇區(qū)的數(shù)據(jù)通常取為 32 ,有時(shí)候用 Partition Magic 分過的 FAT32 分區(qū)會(huì)設(shè)置 36 個(gè)保留扇區(qū),有的工具可能會(huì)設(shè)置 63 個(gè)保留扇區(qū)。 FAT32 中的保留扇區(qū)除了磁盤總第 0 扇區(qū)用作 DBR ,總第 2 扇區(qū) (win98 系統(tǒng) ) 或總第 0xC 扇區(qū) (win2000,winxp) 用作 OS 引導(dǎo)代碼擴(kuò)展部分外,其余扇區(qū)都不參與操作系統(tǒng)管理與磁盤數(shù)據(jù)管理,通常情況下是沒作用的。操作系統(tǒng)之所以在 FAT32 中設(shè)置保留扇區(qū),是為了對(duì) DBR 作備份或留待以后升級(jí)時(shí)用。
24、FAT32 中, DBR 偏移 0x34 占 2 字節(jié)的數(shù)據(jù)指明了 DBR 備份扇區(qū)所在,一般為 0x06 ,即第 6 扇區(qū)。當(dāng) FAT32 分區(qū) DBR 扇區(qū)被破壞導(dǎo)致分區(qū)無法訪問時(shí)??梢杂玫?6 扇區(qū)的原備份替換第 0 扇區(qū)來找回?cái)?shù)據(jù)。 4.3 FAT 表和數(shù)據(jù)的存儲(chǔ)原則 FAT 表 (File Allocation Table 文件分配表 ) ,是 Microsoft 在 FAT 文件系統(tǒng)中用于磁盤數(shù)據(jù) ( 文件 ) 索引和定位引進(jìn)的一種鏈?zhǔn)浇Y(jié)構(gòu)。假如把磁盤比作一本書, FAT 表可以認(rèn)為相當(dāng)于書中的目錄,而文件就是各個(gè)章節(jié)的內(nèi)容。但 FAT 表的表示方法卻與目錄有很大的不同。 在 FA
25、T 文件系統(tǒng)中,文件的存儲(chǔ)依照 FAT 表制定的簇鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)來進(jìn)行。同時(shí), FAT 文件系統(tǒng)將組織數(shù)據(jù)時(shí)使用的目錄也抽象為文件,以簡化對(duì)數(shù)據(jù)的管理。 存儲(chǔ)過程假想: 我們模擬對(duì)一個(gè)分區(qū)存儲(chǔ)數(shù)據(jù)的過程來說明 FAT 文件系統(tǒng)中數(shù)據(jù)的存儲(chǔ)原則。 假定現(xiàn)在有一個(gè)空的完全沒有存放數(shù)據(jù)的磁盤,大小為 100KB ,我們將其想象為線形的空間地址。為了存儲(chǔ)管理上的便利,我們?nèi)藶榈膶⑦@ 100KB 的空間均分成 100 份,每份 1KB 。我們來依次存儲(chǔ)這樣幾個(gè)文件: A.TXT( 大小 10KB),B.TXT( 大小 53.6KB) , C.TXT( 大小 20.5KB) 。 最起碼能夠想到,我們可以順序
26、的在這 100KB 空間中存放這 3 個(gè)文件。同時(shí)不要忘了,我們還要記下他們的大小和開始的位置,這樣下次要用時(shí)才能找的到,這就像是目錄。為了便于查找,我們假定用第 1K 的空間來存儲(chǔ)他們的特征 ( 屬性 ) 。還有,我們?cè)O(shè)計(jì)的存儲(chǔ)單位是 1KB ,所以, A.TXT 我們需要 10 個(gè)存儲(chǔ)單位 ( 為了說明方便,我們把存儲(chǔ)單位叫做 “ 簇 ” 吧。也能少打點(diǎn)字,呵呵。 ) , B.TXT 需要 54 個(gè)簇, C.TXT 需要 21 個(gè)簇??赡苡腥藭?huì)說 B.TXT 和 C.TXT 不是各自浪費(fèi)了不到 1 簇的空間嗎?干嘛不讓他們緊挨著,不是省地方嗎?我的回答是,如果按照這樣的方式存儲(chǔ),目錄中原本
27、只需要記下簇號(hào),現(xiàn)在還需要記下簇內(nèi)的偏移,這樣會(huì)增加目錄的存儲(chǔ)量,而且存取沒有了規(guī)則,讀取也不太方便,是得不償失的。 根據(jù)上面所說的思想,我們?cè)O(shè)計(jì)了這樣的圖 4.3.1 所示的存儲(chǔ)方式。 我們?cè)倏紤]如何來寫這三個(gè)文件的目錄。對(duì)于每個(gè)文件而言,一定要記錄的有:文件名,開始簇,大小,創(chuàng)建日期、時(shí)間,修改日期、時(shí)間,文件的讀寫屬性等。這里大小能不能用結(jié)束簇來計(jì)算呢?一定不能,因?yàn)槲募拇笮〔灰欢ň褪钦麛?shù)個(gè)簇的大小,否則的話像 B.TXT 的內(nèi)容就是 54KB 的內(nèi)容了,少了固然不行,可多了也是不行的。那么我們?cè)趺从涗浤??可以想象一下。為了管理上的方便,我們用?shù)據(jù)庫的管理方式來管理我們的目錄。于是我把
28、 1KB 再分成 10 份,假定開始簇號(hào)為 0 ,定義每份 100B 的各個(gè)位置的代表含義如圖 4.3.2 這樣設(shè)計(jì)的結(jié)構(gòu)絕對(duì)可以對(duì)文件進(jìn)行正確的讀寫了。接著讓我們?cè)O(shè)計(jì)的文件系統(tǒng)工作吧。先改動(dòng)個(gè)文件,比如 A.TXT ,增加點(diǎn)內(nèi)容吧!咦?增加后往哪里放呀,雖然存儲(chǔ)塊的后面有很多空間,但緊隨其后 B.TXT 的數(shù)據(jù)還頂著呢?要是把 A.TXT 移到后邊太浪費(fèi)處理資源,而且也不一定解決問題。這個(gè)問題看來暫時(shí)解決不了。 那我們換個(gè)操作,把 B.txt 刪了, b.txt 的空間隨之釋放。這時(shí)候空間如圖 4.3.3 ,目錄如圖 4.3.4 這個(gè)操作看來還可以,我們接著做,在存入一個(gè)文件 D.txt(
29、大小為 60.3KB), 總共 100 簇的空間只用了 31 簇,還有 68 簇剩余,按說能放下??墒??往那里放呢?沒有 61 個(gè)連續(xù)的空間了,目錄行沒辦法寫了,看來無連續(xù)塊存儲(chǔ)暫時(shí)也不行。 你一定能夠想到我們可以在連續(xù)空間不夠或增加文件長度的時(shí)候轉(zhuǎn)移影響我們操作的其他文件,從而騰出空間來,但我要問你,那不是成天啥也不要干了,就是倒騰東西了嗎? 看來我們?cè)O(shè)計(jì)的文件系統(tǒng)有致命的漏洞,怎么解決呢?其實(shí)可以這樣解決: 首先我們?cè)试S文件的不連續(xù)存儲(chǔ)。目錄中依然只記錄開始簇和文件的大小。那么我們?cè)趺从涗浳募加媚切┐啬?,以文件映射簇不太方便,因?yàn)槲募遣还潭ǖ?。我們換個(gè)思想,可以用簇來映射文件,在整個(gè)
30、存儲(chǔ)空間的前部留下幾簇來記錄數(shù)據(jù)區(qū)中數(shù)據(jù)與簇號(hào)的關(guān)系。對(duì)于上例因?yàn)榭偪臻g也不大,所以用前部的 1Kb 的空間來記錄這種對(duì)應(yīng),假設(shè) 3 個(gè)文件都存儲(chǔ),空間分配如圖 4.3.5 ,同時(shí)修改一下目錄,如圖 4.3.6 第一簇用來記錄數(shù)據(jù)區(qū)中每一簇的被占用情況,暫時(shí)稱其為文件分配表。結(jié)合文件分配表和文件目錄就可以達(dá)到完全的文件讀取了。我們想到,把文件分配表做成一個(gè)數(shù)據(jù)表,以圖 4.3.7 的形式記錄簇與數(shù)據(jù)的對(duì)應(yīng)。 用圖 4.3.7 的組織方式是完全可以實(shí)現(xiàn)對(duì)文件占有簇的記錄的。但還不夠效率。比如文件名在文件分配表中記錄太多,浪費(fèi)空間,而實(shí)際上在目錄中已經(jīng)記錄了文件的開始簇了。所以可以改良一下,用鏈的
31、方式來存放占有簇的關(guān)系,變成圖 4.3.8 的組織方式。 參照?qǐng)D 4.3.8 來理解一下文件分配表的意義。如文件 a.txt 我們根據(jù)目錄項(xiàng)中指定的 a.txt 的首簇為 2 ,然后找到文件分配表的第 2 簇記錄,上面登記的是 3 ,我們就能確定下一簇是 3 。找到文件分配表的第 3 簇記錄,上面登記的是 4 ,我們就能確定下一簇是 4. 直到指到第 11 簇,發(fā)現(xiàn)下一個(gè)指向是 FF ,就是結(jié)束。文件便絲毫無誤讀取完畢。 我們?cè)倏瓷厦嫣岬降牡谌N情況,就是將 b.txt 刪除以后,存入一個(gè)大小為 60.3KB 的 d.txt 。利用簇鏈可以很容易的實(shí)現(xiàn)。實(shí)現(xiàn)后的磁盤如圖 4.3.9 4.3.1
32、0 4.3.11 上面是我們對(duì)文件存儲(chǔ)的一種假設(shè),也該揭開謎底的時(shí)候了。上面的思想其實(shí)就是 fat 文件系統(tǒng)的思想的精髓 ( 但并不是,尤其像具體的參數(shù)的意義與我們所舉的例子是完全不同的。請(qǐng)忘掉上邊細(xì)節(jié),努力記憶下邊 ) 。 FAT16 存儲(chǔ)原理 : 當(dāng)把一部分磁盤空間格式化為 fat 文件系統(tǒng)時(shí), fat 文件系統(tǒng)就將這個(gè)分區(qū)當(dāng)成整塊可分配的區(qū)域進(jìn)行規(guī)劃,以便于數(shù)據(jù)的存儲(chǔ)。一般來講,其劃分形式如圖 7 所示。我們把 FAT16 部分提取出來,詳細(xì)描述一下: FAT16 是 Microsoft 較早推出的文件系統(tǒng),具有高度兼容性,目前仍然廣泛應(yīng)用于個(gè)人電腦尤其是移動(dòng)存儲(chǔ)設(shè)備中, FAT16 簡
33、單來講由圖 4.3.12 所示的 6 部分組成 ( 主要是前 5 部分 ) 。引導(dǎo)扇區(qū) (DBR) 我們已經(jīng)說過 ,FAT16 在 DBR 之后沒有留有任何保留扇區(qū),其后緊隨的便是 FAT 表。 FAT 表是 FAT16 用來記錄磁盤數(shù)據(jù)區(qū)簇鏈結(jié)構(gòu)的。像前面我們說過的例子一樣, FAT 將磁盤空間按一定數(shù)目的扇區(qū)為單位進(jìn)行劃分,這樣的單位稱為簇。通常情況下,每扇區(qū) 512 字節(jié)的原則是不變的。簇的大小一般是 2n (n 為整數(shù) ) 個(gè)扇區(qū)的大小,像 512B,1K,2K,4K,8K,16K,32K , 64K 。實(shí)際中通常不超過 32K 。 之所以簇為單位而不以扇區(qū)為單位進(jìn)行磁盤的分配,是因?yàn)?/p>
34、當(dāng)分區(qū)容量較大時(shí),采用大小為 512b 的扇區(qū)管理會(huì)增加 fat 表的項(xiàng)數(shù),對(duì)大文件存取增加消耗,文件系統(tǒng)效率不高。分區(qū)的大小和簇的取值是有關(guān)系的,見表 9 注意:少于 32680 個(gè)扇區(qū)的分區(qū)中,簇空間大小可最多達(dá)到每個(gè)簇 8 個(gè)扇區(qū)。不管用戶是使用磁盤管理器來格式化分區(qū),還是使用命令提示行鍵入 format 命令格式化,格式化程序都創(chuàng)建一個(gè) 12 位的 FAT 。少于 16MB 的分區(qū),系統(tǒng)通常會(huì)將其格式化成 12 位的 FAT , FAT12 是 FAT 的初始實(shí)現(xiàn)形式,是針對(duì)小型介質(zhì)的。 FAT12 文件分配表要比 FAT16 和 FAT32 的文件分配表小,因?yàn)樗鼘?duì)每個(gè)條目使用的空間
35、較少。這就給數(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 表本身所占空間 來確定 FAT 表所需的扇區(qū)數(shù)目,然后將計(jì)算后的結(jié)果寫入 DBR 的相關(guān)位置。 FAT16 DBR 參數(shù)的偏移 0x11 處記錄了根目錄所占扇區(qū)的數(shù)目。偏移 0x16 記錄了 FAT
36、表所占扇區(qū)的數(shù)據(jù)。偏移 0x10 記錄了 FAT 表的副本數(shù)目。系統(tǒng)在得到這幾項(xiàng)參數(shù)以后,就可以確定數(shù)據(jù)區(qū)的開始扇區(qū)偏移了。 FAT16 文件系統(tǒng)從根目錄所占的 32 個(gè)扇區(qū)之后的第一個(gè)扇區(qū)開始以簇為單位進(jìn)行數(shù)據(jù)的處理,這之前仍以扇區(qū)為單位。對(duì)于根目錄之后的第一個(gè)簇,系統(tǒng)并不編號(hào)為第 0 簇或第 1 簇 ( 可能是留作關(guān)鍵字的原因吧 ) ,而是編號(hào)為第 2 簇,也就是說數(shù)據(jù)區(qū)順序上的第 1 個(gè)簇也是編號(hào)上的第 2 簇。 FAT 文件系統(tǒng)之所以有 12 , 16 , 32 不同的版本之分,其根本在于 FAT 表用來記錄任意一簇鏈接的二進(jìn)制位數(shù)。以 FAT16 為例,每一簇在 FAT 表中占據(jù) 2
37、 字節(jié) ( 二進(jìn)制 16 位 ) 。所以, FAT16 最大可以表示的簇號(hào)為 0xFFFF( 十進(jìn)制的 65535) ,以 32K 為簇的大小的話, FAT32 可以管理的最大磁盤空間為: 32KB×65535=2048MB, 這就是為什么 FAT16 不支持超過 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)開始記錄除根目錄外的其他文件及文件夾的簇鏈情況。根據(jù)簇的表現(xiàn)情況 FAT 用相應(yīng)的取值來描述,見表 10 看一幅在 winh
38、ex 所截 FAT16 的文件分配表,圖 10 : 如圖, FAT 表以 "F8 FF FF FF" 開頭,此 2 字節(jié)為介質(zhì)描述單元,并不參與 FAT 表簇鏈關(guān)系。小紅字標(biāo)出的是 FAT 扇區(qū)每 2 字節(jié)對(duì)應(yīng)的簇號(hào)。 相對(duì)偏移 0x40x5 偏移為第 2 簇 ( 順序上第 1 簇 ) ,此處為 FF, 表示存儲(chǔ)在第 2 簇上的文件 ( 目錄 ) 是個(gè)小文件,只占用 1 個(gè)簇便結(jié)束了。 第 3 簇中存放的數(shù)據(jù)是 0x0005 ,這是一個(gè)文件或文件夾的首簇。其內(nèi)容為第 5 簇,就是說接下來的簇位于第 5 簇 ?D?D FAT 表指引我們到達(dá) FAT 表的第 5 簇指向,上面寫
39、的數(shù)據(jù)是 "FF FF", 意即此文件已至尾簇。 第 4 簇中存放的數(shù)據(jù)是 0x0006 ,這又是一個(gè)文件或文件夾的首簇。其內(nèi)容為第 6 簇,就是說接下來的簇位于第 6 簇 ?D?D FAT 表指引我們到達(dá) FAT 表的第 6 簇指向,上面寫的數(shù)據(jù)是 0x0007 ,就是說接下來的簇位于第 7 簇 ?D?D FAT 表指引我們到達(dá) FAT 表的第 7 簇指向 直到根據(jù) FAT 鏈讀取到扇區(qū)相對(duì)偏移 0x1A0x1B ,也就是第 13 簇,上面寫的數(shù)據(jù)是 0x000E ,也就是指向第 14 簇 ?D?D 14 簇的內(nèi)容為 "FF FF" ,意即此文件已至尾
40、簇。 后面的 FAT 表數(shù)據(jù)與上面的道理相同。不再分析。 FAT 表記錄了磁盤數(shù)據(jù)文件的存儲(chǔ)鏈表,對(duì)于數(shù)據(jù)的讀取而言是極其重要的,以至于 Microsoft 為其開發(fā)的 FAT 文件系統(tǒng)中的 FAT 表創(chuàng)建了一份備份,就是我們看到的 FAT2 。 FAT2 與 FAT1 的內(nèi)容通常是即時(shí)同步的,也就是說如果通過正常的系統(tǒng)讀寫對(duì) FAT1 做了更改,那么 FAT2 也同樣被更新。如果從這個(gè)角度來看,系統(tǒng)的這個(gè)功能在數(shù)據(jù)恢復(fù)時(shí)是個(gè)天災(zāi)。 FAT 文件系統(tǒng)的目錄結(jié)構(gòu)其實(shí)是一顆有向的從根到葉的樹,這里提到的有向是指對(duì)于 FAT 分區(qū)內(nèi)的任一文件 ( 包括文件夾 ) ,均需從根目錄尋址來找到??梢赃@樣認(rèn)
41、為:目錄存儲(chǔ)結(jié)構(gòu)的入口就是根目錄。 FAT 文件系統(tǒng)根據(jù)根目錄來尋址其他文件 ( 包括文件夾 ) ,故而根目錄的位置必須在磁盤存取數(shù)據(jù)之前得以確定。 FAT 文件系統(tǒng)就是根據(jù)分區(qū)的相關(guān) DBR 參數(shù)與 DBR 中存放的已經(jīng)計(jì)算好的 FAT 表 (2 份 ) 的大小來確定的。格式化以后,跟目錄的大小和位置其實(shí)都已經(jīng)確定下來了:位置緊隨 FAT2 之后,大小通常為 32 個(gè)扇區(qū)。根目錄之后便是數(shù)據(jù)區(qū)第 2 簇。 FAT 文件系統(tǒng)的一個(gè)重要思想是把目錄 ( 文件夾 ) 當(dāng)作一個(gè)特殊的文件來處理, FAT32 甚至將根目錄當(dāng)作文件處理 ( 旁: NTFS 將分區(qū)參數(shù)、安全權(quán)限等好多東西抽象為文件更是這
42、個(gè)思想的升華 ) ,在 FAT16 中,雖然根目錄地位并不等同于普通的文件或者說是目錄,但其組織形式和普通的目錄 ( 文件夾 ) 并沒有不同。 FAT 分區(qū)中所有的文件夾 ( 目錄 ) 文件,實(shí)際上可以看作是一個(gè)存放其他文件 ( 文件夾 ) 入口參數(shù)的數(shù)據(jù)表。所以目錄的占用空間的大小并不等同于其下所有數(shù)據(jù)的大小,但也不等同于 0 。通常是占很小的空間的,可以看作目錄文件是一個(gè)簡單的二維表文件。其具體存儲(chǔ)原理是: 不管目錄文件所占空間為多少簇,一簇為多少字節(jié)。系統(tǒng)都會(huì)以 32 個(gè)字節(jié)為單位進(jìn)行目錄文件所占簇的分配。這 32 個(gè)字節(jié)以確定的偏移來定義本目錄下的一個(gè)文件 ( 或文件夾 ) 的屬性,實(shí)
43、際上是一個(gè)簡單的二維表。 這 32 個(gè)字節(jié)的各字節(jié)偏移定義如表 11 : 對(duì)表 11 中的一些取值進(jìn)行說明: (1) 、對(duì)于短文件名,系統(tǒng)將文件名分成兩部分進(jìn)行存儲(chǔ),即主文件名 + 擴(kuò)展名。 0x00x7 字節(jié)記錄文件的主文件名, 0x80xA 記錄文件的擴(kuò)展名,取文件名中的 ASCII 碼值。不記錄主文件名與擴(kuò)展名之間的 "." 主文件名不足 8 個(gè)字符以空白符 (20H) 填充,擴(kuò)展名不足 3 個(gè)字符同樣以空白符 (20H) 填充。 0x0 偏移處的取值若為 00H ,表明目錄項(xiàng)為空;若為 E5H ,表明目錄項(xiàng)曾被使用,但對(duì)應(yīng)的文件或文件夾已被刪除。 ( 這也是誤刪除后
44、恢復(fù)的理論依據(jù) ) 。文件名中的第一個(gè)字符若為 “.” 或 “.” 表示這個(gè)簇記錄的是一個(gè)子目錄的目錄項(xiàng)。 “.” 代表當(dāng)前目錄; “.” 代表上級(jí)目錄 ( 和我們?cè)?dos 或 windows 中的使用意思是一樣的,如果磁盤數(shù)據(jù)被破壞,就可以通過這兩個(gè)目錄項(xiàng)的具體參數(shù)推算磁盤的數(shù)據(jù)區(qū)的起始位置,猜測(cè)簇的大小等等,故而是比較重要的 ) (2) 、 0xB 的屬性字段:可以看作系統(tǒng)將 0xB 的一個(gè)字節(jié)分成 8 位,用其中的一位代表某種屬性的有或無。這樣,一個(gè)字節(jié)中的 8 位每位取不同的值就能反映各個(gè)屬性的不同取值了。如 00000101 就表示這是個(gè)文件,屬性是只讀、系統(tǒng)。 (3) 、 0xC
45、0x15 在原 FAT16 的定義中是保留未用的。在高版本的 WINDOWS 系統(tǒng)中有時(shí)也用它來記錄修改時(shí)間和最近訪問時(shí)間。那樣其字段的意義和 FAT32 的定義是相同的,見后邊 FAT32 。 (4) 、 0x160x17 中的時(shí)間 = 小時(shí) *2048+ 分鐘 *32+ 秒 /2 。得出的結(jié)果換算成 16 進(jìn)制填入即可。也就是: 0x16 字節(jié)的 04 位是以 2 秒為單位的量值; 0x16 字節(jié)的 57 位和 0x17 字節(jié)的 02 位是分鐘; 0x17 字節(jié)的 37 位是小時(shí)。 (5) 、 0x180x19 中的日期 =( 年份 -1980)*512+ 月份 *32+ 日。得出的結(jié)果換
46、算成 16 進(jìn)制填入即可。也就是: 0x18 字節(jié) 04 位是日期數(shù); 0x18 字節(jié) 57 位和 0x19 字節(jié) 0 位是月份; 0x19 字節(jié)的 17 位為年號(hào),原定義中 0119 分別代表 19802099 ,目前高版本的 Windows 允許取 0127 ,即年號(hào)最大可以到 2107 年。 (6) 、 0x1A0x1B 存放文件或目錄的表示文件的首簇號(hào),系統(tǒng)根據(jù)掌握的首簇號(hào)在 FAT 表中找到入口,然后再跟蹤簇鏈直至簇尾,同時(shí)用 0x1C0x1F 處字節(jié)判定有效性。就可以完全無誤的讀取文件 ( 目錄 ) 了。 (7) 、普通子目錄的尋址過程也是通過其父目錄中的目錄項(xiàng)來指定的,與數(shù)據(jù)文件
47、 ( 指非目錄文件 ) 不同的是目錄項(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ū)無法分配給任何一個(gè)簇。這就是分區(qū)的剩余扇區(qū),位于分區(qū)的末尾。有的系統(tǒng)用最后一個(gè)剩余扇區(qū)備份本分區(qū)的 DBR ,這也是一種好的備份方法。 早的 FAT16 系統(tǒng)并沒有長文件名一說, Windows 操作系統(tǒng)已經(jīng)完全支持在 FAT16 上的長文件名了。 FAT16 的長文件名與 FAT32 長文件名的定義是相同的,關(guān)于長文件名,在 FAT32 部分再詳
48、細(xì)作解釋。 FAT32 存儲(chǔ)原理: FAT32 是個(gè)非常有功勞的文件系統(tǒng), Microsoft 成功地設(shè)計(jì)并運(yùn)用了它,直到今天 NTFS 鋪天蓋地襲來的時(shí)候, FAT32 依然占據(jù)著 Microsoft Windows 文件系統(tǒng)中重要的地位。 FAT32 最早是出于 FAT16 不支持大分區(qū)、單位簇容量大以致空間急劇浪費(fèi)等缺點(diǎn)設(shè)計(jì)的。實(shí)際應(yīng)用中, FAT32 還是成功的。 FAT32 與 FAT16 的原理基本上是相同的,圖 4.3.13 標(biāo)出了 FAT32 分區(qū)的基本構(gòu)成。 FAT32 在格式化的過程中就根據(jù)分區(qū)的特點(diǎn)構(gòu)建好了它的 DBR ,其中 BPB 參數(shù)是很重要的,可以回過頭來看一下表
49、 4 和表 5 。首先 FAT32 保留扇區(qū)的數(shù)目默認(rèn)為 32 個(gè),而不是 FAT16 的僅僅一個(gè)。這樣的好處是有助于磁盤 DBR 指令的長度擴(kuò)展,而且可以為 DBR 扇區(qū)留有備份空間。上面我們已經(jīng)提到,構(gòu)建在 FAT32 上的 win98 或 win2000 、 winXP ,其操作系統(tǒng)引導(dǎo)代碼并非只占一個(gè)扇區(qū)了。留有多余的保留扇區(qū)就可以很好的拓展 OS 引導(dǎo)代碼。在 BPB 中也記錄了 DBR 扇區(qū)的備份扇區(qū)編號(hào)。備份扇區(qū)可以讓我們?cè)诖疟P遭到意外破壞時(shí)恢復(fù) DBR 。 FAT32 的文件分配表的數(shù)據(jù)結(jié)構(gòu)依然和 FAT16 相同,所不同的是, FAT32 將記錄簇鏈的二進(jìn)制位數(shù)擴(kuò)展到了 32
50、 位,故而這種文件系統(tǒng)稱為 FAT32 。 32 位二進(jìn)制位的簇鏈決定了 FAT 表最大可以尋址 2T 個(gè)簇。這樣即使簇的大小為 1 扇區(qū),理論上仍然能夠?qū)ぶ?1TB 范圍內(nèi)的分區(qū)。但實(shí)際中 FAT32 是不能尋址這樣大的空間的,隨著分區(qū)空間大小的增加, FAT 表的記錄數(shù)會(huì)變得臃腫不堪,嚴(yán)重影響系統(tǒng)的性能。所以在實(shí)際中通常不格式化超過 32GB 的 FAT32 分區(qū)。 WIN2000 及之上的 OS 已經(jīng)不直接支持對(duì)超過 32GB 的分區(qū)格式化成 FAT32 ,但 WIN98 依然可以格式化大到 127GB 的 FAT32 分區(qū),但這樣沒必要也不推薦。同時(shí) FAT32 也有小的限制, FAT
51、32 卷必須至少有 65527 個(gè)簇,所以對(duì)于小的分區(qū),仍然需要使用 FAT16 或 FAT12 。 分區(qū)變大時(shí),如果簇很小,文件分配表也隨之變大。仍然會(huì)有上面的效率問題存在。既要有效地讀寫大文件,又要最大可能的減少空間的浪費(fèi)。 FAT32 同樣規(guī)定了相應(yīng)的分區(qū)空間對(duì)應(yīng)的簇的大小,見表 12 : FAT32 簇的取值意義和 FAT16 類似,不過是位數(shù)長了點(diǎn)罷了,比較見表 13 :FAT32 的另一項(xiàng)重大改革是根目錄的文件化,即將根目錄等同于普通的文件。這樣根目錄便沒有了 FAT16 中 512 個(gè)目錄項(xiàng)的限制,不夠用的時(shí)候增加簇鏈,分配空簇即可。而且,根目錄的位置也不再硬性地固定了,可以存儲(chǔ)
52、在分區(qū)內(nèi)可尋址的任意簇內(nèi),不過通常根目錄 是最早建立的 ( 格式化就生成了 ) 目錄表。所以,我們看到的情況基本上都是根目錄首簇占簇區(qū)順序上的第 1 個(gè)簇。在圖 4.3.12 中也是按這種情況制作的畫的。 FAT32 對(duì)簇的編號(hào)依然同 FAT16 。順序上第 1 個(gè)簇仍然編號(hào)為第 2 簇,通常為根目錄所用 ( 這和 FAT16 是不同的, FAT16 的根目錄并不占簇區(qū)空間, 32 個(gè)扇區(qū)的根目錄以后才是簇區(qū)第 1 個(gè)簇 ) FAT32 的文件尋址方法與 FAT16 相同,但目錄項(xiàng)的各字節(jié)參數(shù)意義卻與 FAT16 有所不同,一方面它啟用了 FAT16 中的目錄項(xiàng)保留字段,同時(shí)又完全支持長文件名了。 對(duì)于短文件格式的目錄項(xiàng)。其參數(shù)意義見表 14 : 說明: (1) 、這是 FAT32 短文件格式目錄項(xiàng)的意義。其中文件
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年初中文理科試題及答案
- 2025年力學(xué)博士 面試題及答案
- 2025年鐵路大修段考試題及答案
- 2025年競聘融資面試試題及答案
- 2025年養(yǎng)花配土測(cè)試題及答案
- 2025年大數(shù)據(jù)行業(yè)考試題及答案
- 2025年傳熱學(xué)測(cè)試題及答案
- 2025年移民心理測(cè)試題及答案
- 2025年銀行信貸管理試題及答案
- 2025年電商稅務(wù)面試題及答案
- 2024版體育賽事票務(wù)代理合同:賽事組織者與票務(wù)代理公司之間的合作協(xié)議3篇
- 醫(yī)院陪護(hù)管理制度
- 個(gè)人無償勞務(wù)合同模板
- 中國計(jì)量大學(xué)《微機(jī)原理及其應(yīng)用》2021-2022學(xué)年第一學(xué)期期末試卷
- 《車控操作系統(tǒng)功能軟件架構(gòu)及接口要求》
- 鈑金車間安全培訓(xùn)課件
- 急性心力衰竭的緊急處理與護(hù)理
- 中國技能大賽-第45屆世界技能大賽全國選拔賽“水處理技術(shù)”項(xiàng)目技術(shù)工作文件
- 無菌物品的儲(chǔ)存與管理
- 固定資產(chǎn)折舊合同
- 混凝土工安全教育培訓(xùn)試題及答案
評(píng)論
0/150
提交評(píng)論