欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
硬盤(pán) FAT 文件系統原理的詳細分析
一、硬盤(pán)的物理結構:
硬盤(pán)存儲數據是根據電、磁轉換原理實(shí)現的。硬盤(pán)由一個(gè)或幾個(gè)表面鍍有磁性物質(zhì)的金屬或玻璃等物質(zhì)盤(pán)片以及盤(pán)片兩面所安裝的磁頭和相應的控制電路組成 ( 圖 1) ,其中盤(pán)片和磁頭密封在無(wú)塵的金屬殼中。
硬盤(pán)工作時(shí),盤(pán)片以設計轉速高速旋轉,設置在盤(pán)片表面的磁頭則在電路控制下徑向移動(dòng)到指定位置然后將數據存儲或讀取出來(lái)。當系統向硬盤(pán)寫(xiě)入數據時(shí),磁頭中 “ 寫(xiě)數據 ” 電流產(chǎn)生磁場(chǎng)使盤(pán)片表面磁性物質(zhì)狀態(tài)發(fā)生改變,并在寫(xiě)電流磁場(chǎng)消失后仍能保持,這樣數據就存儲下來(lái)了;當系統從硬盤(pán)中讀數據時(shí),磁頭經(jīng)過(guò)盤(pán)片指定區域,盤(pán)片表面磁場(chǎng)使磁頭產(chǎn)生感應電流或線(xiàn)圈阻抗產(chǎn)生變化,經(jīng)相關(guān)電路處理后還原成數據。因此只要能將盤(pán)片表面處理得更平滑、磁頭設計得更精密以及盡量提高盤(pán)片旋轉速度,就能造出容量更大、讀寫(xiě)數據速度更快的硬盤(pán)。這是因為盤(pán)片表面處理越平、轉速越快就能越使磁頭離盤(pán)片表面越近,提高讀、寫(xiě)靈敏度和速度;磁頭設計越小越精密就能使磁頭在盤(pán)片上占用空間越小,使磁頭在一張盤(pán)片上建立更多的磁道以存儲更多的數據。
二、硬盤(pán)的邏輯結構:
硬盤(pán)由很多盤(pán)片 (platter) 組成,每個(gè)盤(pán)片的每個(gè)面都有一個(gè)讀寫(xiě)磁頭。如果有 N 個(gè)盤(pán)片。就有 2N 個(gè)面,對應 2N 個(gè)磁頭 (Heads) ,從 0 、 1 、 2 開(kāi)始編號。每個(gè)盤(pán)片被劃分成若干個(gè)同心圓磁道 ( 邏輯上的,是不可見(jiàn)的。 ) 每個(gè)盤(pán)片的劃分規則通常是一樣的。這樣每個(gè)盤(pán)片的半徑均為固定值 R 的同心圓再邏輯上形成了一個(gè)以電機主軸為軸的柱面 (Cylinders) ,從外至里編號為 0 、 1 、 2…… 每個(gè)盤(pán)片上的每個(gè)磁道又被劃分為幾十個(gè)扇區 (Sector) ,通常的容量是 512byte ,并按照一定規則編號為 1 、 2 、 3…… 形成 Cylinders×Heads×Sector 個(gè)扇區。這三個(gè)參數即是硬盤(pán)的物理參數。我們下面的很多實(shí)踐需要深刻理解這三個(gè)參數的意義。
三、磁盤(pán)引導原理:
3.1  MBR(master boot record) 扇區:
計算機在按下 power 鍵以后,開(kāi)始執行主板 bios 程序。進(jìn)行完一系列檢測和配置以后。開(kāi)始按 bios 中設定的系統引導順序引導系統。假定現在是硬盤(pán)。 Bios 執行完自己的程序后如何把執行權交給硬盤(pán)呢。交給硬盤(pán)后又執行存儲在哪里的程序呢。其實(shí),稱(chēng)為 mbr 的一段代碼起著(zhù)舉足輕重的作用。 MBR(master boot record), 即主引導記錄,有時(shí)也稱(chēng)主引導扇區。位于整個(gè)硬盤(pán)的 0 柱面 0 磁頭 1 扇區 ( 可以看作是硬盤(pán)的第一個(gè)扇區 ) , bios 在執行自己固有的程序以后就會(huì ) jump 到 mbr 中的第一條指令。將系統的控制權交由 mbr 來(lái)執行。在總共 512byte 的主引導記錄中, MBR 的引導程序占了其中的前 446 個(gè)字節 ( 偏移 0H~ 偏移 1BDH) ,隨后的 64 個(gè)字節 ( 偏移 1BEH~ 偏移 1FDH) 為 DPT(Disk PartitionTable ,硬盤(pán)分區表 ) ,最后的兩個(gè)字節 “55 AA”( 偏移 1FEH~ 偏移 1FFH) 是分區有效結束標志。
MBR 不隨操作系統的不同而不同,意即不同的操作系統可能會(huì )存在相同的 MBR ,即使不同, MBR 也不會(huì )夾帶操作系統的性質(zhì)。具有公共引導的特性。
我們來(lái)分析一段 mbr 。下面是用 winhex 查看的一塊希捷 120GB 硬盤(pán)的 mbr 。
你的硬盤(pán)的 MBR 引導代碼可能并非這樣。不過(guò)即使不同,所執行的功能大體是一樣的。這里找 wowocock 關(guān)于磁盤(pán) mbr 的反編譯 ,已加了詳細的注釋?zhuān)信d趣可以細細研究一下。
我們看 DPT 部分。操作系統為了便于用戶(hù)對磁盤(pán)的管理。加入了磁盤(pán)分區的概念。即將一塊磁盤(pán)邏輯劃分為幾塊。磁盤(pán)分區數目的多少只受限于 C ~ Z 的英文字母的數目,在上圖 DPT 共 64 個(gè)字節中如何表示多個(gè)分區的屬性呢 ?microsoft 通過(guò)鏈接的方法解決了這個(gè)問(wèn)題。在 DPT 共 64 個(gè)字節中,以 16 個(gè)字節為分區表項單位描述一個(gè)分區的屬性。也就是說(shuō),第一個(gè)分區表項描述一個(gè)分區的屬性,一般為基本分區。第二個(gè)分區表項描述除基本分區外的其余空間,一般而言,就是我們所說(shuō)的擴展分區。這部分的大體說(shuō)明見(jiàn)表 1 。
注:上表中的超過(guò) 1 字節的數據都以實(shí)際數據顯示,就是按高位到地位的方式顯示。存儲時(shí)是按低位到高位存儲的。兩者表現不同,請仔細看清楚。以后出現的表,圖均同。
也可以在 winhex 中看到這些參數的意義:
說(shuō)明:   每個(gè)分區表項占用 16 個(gè)字節,假定偏移地址從 0 開(kāi)始。如圖 3 的分區表項 3 。分區表項 4 同分區表項 3 。
1 、 0H 偏移為活動(dòng)分區是否標志,只能選 00H 和 80H 。 80H 為活動(dòng), 00H 為非活動(dòng)。其余值對 microsoft 而言為非法值。
2 、重新說(shuō)明一下 ( 這個(gè)非常重要 ) :大于 1 個(gè)字節的數被以低字節在前的存儲格式格式 (little endian format) 或稱(chēng)反字節順序保存下來(lái)。低字節在前的格式是一種保存數的方法,這樣,最低位的字節最先出現在十六進(jìn)制數符號中。例如,相對扇區數字段的值 0x3F000000 的低字節在前表示為 0x0000003F 。這個(gè)低字節在前的格式數的十進(jìn)制數為 63 。
3 、系統在分區時(shí),各分區都不允許跨柱面,即均以柱面為單位,這就是通常所說(shuō)的分區粒度。有時(shí)候我們分區是輸入分區的大小為 7000M ,分出來(lái)卻是 6997M ,就是這個(gè)原因。   偏移 2H 和偏移 6H 的扇區和柱面參數中 , 扇區占 6 位 (bit) ,柱面占 10 位 (bit) ,以偏移 6H 為例,其低 6 位用作扇區數的二進(jìn)制表示。其高兩位做柱面數 10 位中的高兩位,偏移 7H 組成的 8 位做柱面數 10 位中的低 8 位。由此可知,實(shí)際上用這種方式表示的分區容量是有限的,柱面和磁頭從 0 開(kāi)始編號 , 扇區從 1 開(kāi)始編號 , 所以最多只能表示 1024 個(gè)柱面 ×63 個(gè)扇區 ×256 個(gè)磁頭 ×512byte=8455716864byte 。即通常的 8.4GB( 實(shí)際上應該是 7.8GB 左右 ) 限制。實(shí)際上磁頭數通常只用到 255 個(gè) ( 由匯編語(yǔ)言的尋址寄存器決定 ), 即使把這 3 個(gè)字節按線(xiàn)性尋址,依然力不從心。   在后來(lái)的操作系統中,超過(guò) 8.4GB 的分區其實(shí)已經(jīng)不通過(guò) C/H/S 的方式尋址了。而是通過(guò)偏移 CH ~偏移 FH 共 4 個(gè)字節 32 位線(xiàn)性扇區地址來(lái)表示分區所占用的扇區總數??芍ㄟ^(guò) 4 個(gè)字節可以表示 2^32 個(gè)扇區,即 2TB=2048GB ,目前對于大多數計算機而言,這已經(jīng)是個(gè)天文數字了。在未超過(guò) 8.4GB 的分區上, C/H/S 的表示方法和線(xiàn)性扇區的表示方法所表示的分區大小是一致的。也就是說(shuō),兩種表示方法是協(xié)調的。即使不協(xié)調,也以線(xiàn)性尋址為準。 ( 可能在某些系統中會(huì )提示出錯 ) 。超過(guò) 8.4GB 的分區結束 C/H/S 一般填充為 FEH FFH FFH 。即 C/H/S 所能表示的最大值。有時(shí)候也會(huì )用柱面對 1024 的模來(lái)填充。不過(guò)這幾個(gè)字節是什么其實(shí)都無(wú)關(guān)緊要了。
雖然現在的系統均采用線(xiàn)性尋址的方式來(lái)處理分區的大小。但不可跨柱面的原則依然沒(méi)變。本分區的扇區總數加上與前一分區之間的保留扇區數目依然必須是柱面容量的整數倍。 ( 保留扇區中的第一個(gè)扇區就是存放分區表的 MBR 或虛擬 MBR 的扇區,分區的扇區總數在線(xiàn)性表示方式上是不計入保留扇區的。如果是第一個(gè)分區,保留扇區是本分區前的所有扇區。
附:分區表類(lèi)型標志如圖 4
3.2  擴展分區
擴展分區中的每個(gè)邏輯驅動(dòng)器都存在一個(gè)類(lèi)似于 MBR 的擴展引導記錄 ( Extended Boot Record, EBR) ,也有人稱(chēng)之為虛擬 mbr 或擴展 mbr ,意思是一樣的。擴展引導記錄包括一個(gè)擴展分區表和該扇區的標簽。擴展引導記錄將記錄只包含擴展分區中每個(gè)邏輯驅動(dòng)器的第一個(gè)柱面的第一面的信息。一個(gè)邏輯驅動(dòng)器中的引導扇區一般位于相對扇區 32 或 63 。但是,如果磁盤(pán)上沒(méi)有擴展分區,那么就不會(huì )有擴展引導記錄和邏輯驅動(dòng)器。第一個(gè)邏輯驅動(dòng)器的擴展分區表中的第一項指向它自身的引導扇區。第二項指向下一個(gè)邏輯驅動(dòng)器的 EBR 。如果不存在進(jìn)一步的邏輯驅動(dòng)器,第二項就不會(huì )使用,而且被記錄成一系列零。如果有附加的邏輯驅動(dòng)器,那么第二個(gè)邏輯驅動(dòng)器的擴展分區表的第一項會(huì )指向它本身的引導扇區。第二個(gè)邏輯驅動(dòng)器的擴展分區表的第二項指向下一個(gè)邏輯驅動(dòng)器的 EBR 。擴展分區表的第三項和第四項永遠都不會(huì )被使用。
通過(guò)一幅 4 分區的磁盤(pán)結構圖可以看到磁盤(pán)的大致組織形式。如圖 5 :
關(guān)于擴展分區,如圖 6 所示,擴展分區中邏輯驅動(dòng)器的擴展引導記錄是一個(gè)連接表。該圖顯示了一個(gè)擴展分區上的三個(gè)邏輯驅動(dòng)器,說(shuō)明了前面的邏輯驅動(dòng)器和最后一個(gè)邏輯驅動(dòng)器之間在擴展分區表中的差異。
除了擴展分區上最后一個(gè)邏輯驅動(dòng)器外,表 2 中所描述的擴展分區表的格式在每個(gè)邏輯驅動(dòng)器中都是重復的:第一個(gè)項標識了邏輯驅動(dòng)器本身的引導扇區,第二個(gè)項標識了下一個(gè)邏輯驅動(dòng)器的 EBR 。最后一個(gè)邏輯驅動(dòng)器的擴展分區表只會(huì )列出它本身的分區項。最后一個(gè)擴展分區表的第二個(gè)項到第四個(gè)項被使用。
擴展分區表項中的相對扇區數字段所顯示的是從擴展分區開(kāi)始到邏輯驅動(dòng)器中第一個(gè)扇區的位移的字節數??偵葏^數字段中的數是指組成該邏輯驅動(dòng)器的扇區數目??偵葏^數字段的值等于從擴展分區表項所定義的引導扇區到邏輯驅動(dòng)器末尾的扇區數。
有時(shí)候在磁盤(pán)的末尾會(huì )有剩余空間,剩余空間是什么呢?我們前面說(shuō)到,分區是以 1 柱面的容量為分區粒度的,那么如果磁盤(pán)總空間不是整數個(gè)柱面的話(huà),不夠一個(gè)柱面的剩下的空間就是剩余空間了,這部分空間并不參與分區,所以一般無(wú)法利用。照道理說(shuō),磁盤(pán)的物理模式?jīng)Q定了磁盤(pán)的總容量就應該是整數個(gè)柱面的容量,為什么會(huì )有不夠一個(gè)柱面的空間呢。在我的理解看來(lái),本來(lái)現在的磁盤(pán)為了更大的利用空間,一般在物理上并不是按照外圍的扇區大于里圈的扇區這種管理方式,只是為了與操作系統兼容而抽象出來(lái) CHS ??赡芷鋵?shí)際空間  mailto:zymail@vip.sina.com
四、 FAT 分區原理
先來(lái)一幅結構圖:
現在我們著(zhù)重研究 FAT 格式分區內數據是如何存儲的。 FAT 分區格式是 MICROSOFT 最早支持的分區格式,依據 FAT 表中每個(gè)簇鏈的所占位數 ( 有關(guān)概念,后面會(huì )講到 ) 分為 fat12 、 fat16 、 fat32 三種格式 " 變種 " ,但其基本存儲方式是相似的。
仔細研究圖 7 中的 fat16 和 fat32 分區的組成結構。下面依次解釋 DBR 、 FAT1 、 FAT2 、根目錄、數據區、剩余扇區的概念。提到的地址如無(wú)特別提示均為分區內部偏移。
4.1  關(guān)于 DBR.
DBR 區 (DOS BOOT RECORD) 即操作系統引導記錄區的意思,通常占用分區的第 0 扇區共 512 個(gè)字節 ( 特殊情況也要占用其它保留扇區,我們先說(shuō)第 0 扇 ) 。在這 512 個(gè)字節中,其實(shí)又是由跳轉指令,廠(chǎng)商標志和操作系統版本號, BPB(BIOS Parameter Block) ,擴展 BPB , os 引導程序,結束標志幾部分組成。   以用的最多的 FAT32 為例說(shuō)明分區 DBR 各字節的含義。見(jiàn)圖 8 。
圖 8 的對應解釋見(jiàn)表 3
圖 9 給出了 winhex 對圖 8 DBR 的相關(guān)參數解釋?zhuān)?div style="height:15px;">
 
根據上邊圖例,我們來(lái)討論 DBR 各字節的參數意義。
MBR 將 CPU 執行轉移給引導扇區,因此,引導扇區的前三個(gè)字節必須是合法的可執行的基于 x86 的 CPU 指令。這通常是一條跳轉指令,該指令負責跳過(guò)接下來(lái)的幾個(gè)不可執行的字節 (BPB 和擴展 BPB) ,跳到操作系統引導代碼部分。
跳轉指令之后是 8 字節長(cháng)的 OEM ID ,它是一個(gè)字符串,  OEM ID 標識了格式化該分區的操作系統的名稱(chēng)和版本號。為了保留與 MS-DOS 的兼容性,通常 Windows 2000 格式化該盤(pán)是在 FAT16 和 FAT32 磁盤(pán)上的該字段中記錄了 “MSDOS 5.0” ,在 NTFS 磁盤(pán)上 ( 關(guān)于 ntfs ,另述 ) , Windows 2000 記錄的是 “NTFS” 。通常在被 Windows 95 格式化的磁盤(pán)上 OEM ID 字段出現 “MSWIN4.0” ,在被 Windows 95 OSR2 和 Windows 98 格式化的磁盤(pán)上 OEM ID 字段出現 “MSWIN4.1” 。
接下來(lái)的從偏移 0x0B 開(kāi)始的是一段描述能夠使可執行引導代碼找到相關(guān)參數的信息。通常稱(chēng)之為 BPB(BIOS Parameter Block) , BPB 一般開(kāi)始于相同的位移量,因此,標準的參數都處于一個(gè)已知的位置。磁盤(pán)容量和幾何結構變量都被封在 BPB 之中。由于引導扇區的第一部分是一個(gè) x86 跳轉指令。因此,將來(lái)通過(guò)在 BPB 末端附加新的信息,可以對 BPB 進(jìn)行擴展。只需要對該跳轉指令作一個(gè)小的調整就可以適應 BPB 的變化。圖 9 已經(jīng)列出了項目的名稱(chēng)和取值,為了系統的研究,針對圖 8 ,將 FAT32 分區格式的 BPB 含義和擴展 BPB 含義釋義為表格,見(jiàn)表 4 和表 5 。
DBR 的偏移 0x5A 開(kāi)始的數據為操作系統引導代碼。這是由偏移 0x00 開(kāi)始的跳轉指令所指向的。在圖 8 所列出的偏移 0x00~0x02 的跳轉指令 "EB 58 90" 清楚地指明了 OS 引導代碼的偏移位置。 jump 58H 加上跳轉指令所需的位移量,即開(kāi)始于 0x5A 。此段指令在不同的操作系統上和不同的引導方式上,其內容也是不同的。大多數的資料上都說(shuō) win98, 構建于 fat 基本分區上的 win2000,winxp 所使用的 DBR 只占用基本分區的第 0 扇區。他們提到,對于 fat32 ,一般的 32 個(gè)基本分區保留扇區只有第 0 扇區是有用的。實(shí)際上,以 FAT32 構建的操作系統如果是 win98, 系統會(huì )使用基本分區的第 0 扇區和第 2 扇區存儲 os 引導代碼;以 FAT32 構建的操作系統如果是 win2000 或 winxp, 系統會(huì )使用基本分區的第 0 扇區和第 0xC 扇區 (win2000 或 winxp, 其第 0xC 的位置由第 0 扇區的 0xAB 偏移指出 ) 存儲 os 引導代碼。所以,在 fat32 分區格式上,如果 DBR 一扇區的內容正確而缺少第 2 扇區 (win98 系統 ) 或第 0xC 扇區 (win2000 或 winxp 系統 ) ,系統也是無(wú)法啟動(dòng)的。如果自己手動(dòng)設置 NTLDR 雙系統,必須知道這一點(diǎn)。
DBR 扇區的最后兩個(gè)字節一般存儲值為 0x55AA 的 DBR 有效標志,對于其他的取值,系統將不會(huì )執行 DBR 相關(guān)指令。上面提到的其他幾個(gè)參與 os 引導的扇區也需以 0x55AA 為合法結束標志。
FAT16 DBR :
FAT32 中 DBR 的含義大致如此,對于 FAT12 和 FAT16 其基本意義類(lèi)似,只是相關(guān)偏移量和參數意義有小的差異, FAT 格式的區別和來(lái)因,以后會(huì )說(shuō)到,此處不在多說(shuō) FAT12 與 FAT16 。我將 FAT16 的扇區參數意義列表。感興趣的朋友自己研究一下,和 FAT32 大同小異的。
 
4.2   關(guān)于保留扇區
在上述 FAT 文件系統 DBR 的偏移 0x0E 處,用 2 個(gè)字節存儲保留扇區的數目。所謂保留扇區 ( 有時(shí)候會(huì )叫系統扇區,隱藏扇區 ) ,是指從分區 DBR 扇區開(kāi)始的僅為系統所有的扇區,包括 DBR 扇區。在 FAT16 文件系統中,保留扇區的數據通常設置為 1 ,即僅僅 DBR 扇區。而在 FAT32 中,保留扇區的數據通常取為 32 ,有時(shí)候用 Partition Magic 分過(guò)的 FAT32 分區會(huì )設置 36 個(gè)保留扇區,有的工具可能會(huì )設置 63 個(gè)保留扇區。
FAT32 中的保留扇區除了磁盤(pán)總第 0 扇區用作 DBR ,總第 2 扇區 (win98 系統 ) 或總第 0xC 扇區 (win2000,winxp) 用作 OS 引導代碼擴展部分外,其余扇區都不參與操作系統管理與磁盤(pán)數據管理,通常情況下是沒(méi)作用的。操作系統之所以在 FAT32 中設置保留扇區,是為了對 DBR 作備份或留待以后升級時(shí)用。 FAT32 中, DBR 偏移 0x34 占 2 字節的數據指明了 DBR 備份扇區所在,一般為 0x06 ,即第 6 扇區。當 FAT32 分區 DBR 扇區被破壞導致分區無(wú)法訪(fǎng)問(wèn)時(shí)??梢杂玫?6 扇區的原備份替換第 0 扇區來(lái)找回數據。
4.3  FAT 表和數據的存儲原則
FAT 表 (File Allocation Table  文件分配表 ) ,是 Microsoft 在 FAT 文件系統中用于磁盤(pán)數據 ( 文件 ) 索引和定位引進(jìn)的一種鏈式結構。假如把磁盤(pán)比作一本書(shū), FAT 表可以認為相當于書(shū)中的目錄,而文件就是各個(gè)章節的內容。但 FAT 表的表示方法卻與目錄有很大的不同。
在 FAT 文件系統中,文件的存儲依照 FAT 表制定的簇鏈式數據結構來(lái)進(jìn)行。同時(shí), FAT 文件系統將組織數據時(shí)使用的目錄也抽象為文件,以簡(jiǎn)化對數據的管理。
★ 存儲過(guò)程假想:
我們模擬對一個(gè)分區存儲數據的過(guò)程來(lái)說(shuō)明 FAT 文件系統中數據的存儲原則。
假定現在有一個(gè)空的完全沒(méi)有存放數據的磁盤(pán),大小為 100KB ,我們將其想象為線(xiàn)形的空間地址。為了存儲管理上的便利,我們人為的將這 100KB 的空間均分成 100 份,每份 1KB 。我們來(lái)依次存儲這樣幾個(gè)文件: A.TXT( 大小 10KB),B.TXT( 大小 53.6KB) , C.TXT( 大小 20.5KB) 。
最起碼能夠想到,我們可以順序的在這 100KB 空間中存放這 3 個(gè)文件。同時(shí)不要忘了,我們還要記下他們的大小和開(kāi)始的位置,這樣下次要用時(shí)才能找的到,這就像是目錄。為了便于查找,我們假定用第 1K 的空間來(lái)存儲他們的特征 ( 屬性 ) 。還有,我們設計的存儲單位是 1KB ,所以, A.TXT 我們需要 10 個(gè)存儲單位 ( 為了說(shuō)明方便,我們把存儲單位叫做 “ 簇 ” 吧。也能少打點(diǎn)字,呵呵。 ) , B.TXT 需要 54 個(gè)簇, C.TXT 需要 21 個(gè)簇??赡苡腥藭?huì )說(shuō) B.TXT 和 C.TXT 不是各自浪費了不到 1 簇的空間嗎?干嘛不讓他們緊挨著(zhù),不是省地方嗎?我的回答是,如果按照這樣的方式存儲,目錄中原本只需要記下簇號,現在還需要記下簇內的偏移,這樣會(huì )增加目錄的存儲量,而且存取沒(méi)有了規則,讀取也不太方便,是得不償失的。
根據上面所說(shuō)的思想,我們設計了這樣的圖 4.3.1 所示的存儲方式。
我們再考慮如何來(lái)寫(xiě)這三個(gè)文件的目錄。對于每個(gè)文件而言,一定要記錄的有:文件名,開(kāi)始簇,大小,創(chuàng )建日期、時(shí)間,修改日期、時(shí)間,文件的讀寫(xiě)屬性等。這里大小能不能用結束簇來(lái)計算呢?一定不能,因為文件的大小不一定就是整數個(gè)簇的大小,否則的話(huà)像 B.TXT 的內容就是 54KB 的內容了,少了固然不行,可多了也是不行的。那么我們怎么記錄呢?可以想象一下。為了管理上的方便,我們用數據庫的管理方式來(lái)管理我們的目錄。于是我把 1KB 再分成 10 份,假定開(kāi)始簇號為 0 ,定義每份 100B 的各個(gè)位置的代表含義如圖 4.3.2
這樣設計的結構絕對可以對文件進(jìn)行正確的讀寫(xiě)了。接著(zhù)讓我們設計的文件系統工作吧。先改動(dòng)個(gè)文件,比如 A.TXT ,增加點(diǎn)內容吧!咦?增加后往哪里放呀,雖然存儲塊的后面有很多空間,但緊隨其后 B.TXT 的數據還頂著(zhù)呢?要是把 A.TXT 移到后邊太浪費處理資源,而且也不一定解決問(wèn)題。這個(gè)問(wèn)題看來(lái)暫時(shí)解決不了。
那我們換個(gè)操作,把 B.txt 刪了, b.txt 的空間隨之釋放。這時(shí)候空間如圖 4.3.3 ,目錄如圖 4.3.4
這個(gè)操作看來(lái)還可以,我們接著(zhù)做,在存入一個(gè)文件 D.txt( 大小為 60.3KB), 總共 100 簇的空間只用了 31 簇,還有 68 簇剩余,按說(shuō)能放下??墒??往那里放呢?沒(méi)有 61 個(gè)連續的空間了,目錄行沒(méi)辦法寫(xiě)了,看來(lái)無(wú)連續塊存儲暫時(shí)也不行。
你一定能夠想到我們可以在連續空間不夠或增加文件長(cháng)度的時(shí)候轉移影響我們操作的其他文件,從而騰出空間來(lái),但我要問(wèn)你,那不是成天啥也不要干了,就是倒騰東西了嗎?
看來(lái)我們設計的文件系統有致命的漏洞,怎么解決呢?其實(shí)可以這樣解決:
首先我們允許文件的不連續存儲。目錄中依然只記錄開(kāi)始簇和文件的大小。那么我們怎么記錄文件占用那些簇呢,以文件映射簇不太方便,因為文件名是不固定的。我們換個(gè)思想,可以用簇來(lái)映射文件,在整個(gè)存儲空間的前部留下幾簇來(lái)記錄數據區中數據與簇號的關(guān)系。對于上例因為總空間也不大,所以用前部的 1Kb 的空間來(lái)記錄這種對應,假設 3 個(gè)文件都存儲,空間分配如圖 4.3.5 ,同時(shí)修改一下目錄,如圖 4.3.6
第一簇用來(lái)記錄數據區中每一簇的被占用情況,暫時(shí)稱(chēng)其為文件分配表。結合文件分配表和文件目錄就可以達到完全的文件讀取了。我們想到,把文件分配表做成一個(gè)數據表,以圖 4.3.7 的形式記錄簇與數據的對應。
用圖 4.3.7 的組織方式是完全可以實(shí)現對文件占有簇的記錄的。但還不夠效率。比如文件名在文件分配表中記錄太多,浪費空間,而實(shí)際上在目錄中已經(jīng)記錄了文件的開(kāi)始簇了。所以可以改良一下,用鏈的方式來(lái)存放占有簇的關(guān)系,變成圖 4.3.8 的組織方式。
參照圖 4.3.8 來(lái)理解一下文件分配表的意義。如文件 a.txt 我們根據目錄項中指定的 a.txt 的首簇為 2 ,然后找到文件分配表的第 2 簇記錄,上面登記的是 3 ,我們就能確定下一簇是 3 。找到文件分配表的第 3 簇記錄,上面登記的是 4 ,我們就能確定下一簇是 4...... 直到指到第 11 簇,發(fā)現下一個(gè)指向是 FF ,就是結束。文件便絲毫無(wú)誤讀取完畢。
我們再看上面提到的第三種情況,就是將 b.txt 刪除以后,存入一個(gè)大小為 60.3KB 的 d.txt 。利用簇鏈可以很容易的實(shí)現。實(shí)現后的磁盤(pán)如圖 4.3.9  4.3.10  4.3.11
 
上面是我們對文件存儲的一種假設,也該揭開(kāi)謎底的時(shí)候了。上面的思想其實(shí)就是 fat 文件系統的思想的精髓 ( 但并不是,尤其像具體的參數的意義與我們所舉的例子是完全不同的。請忘掉上邊細節,努力記憶下邊 ) 。
★ FAT16 存儲原理 :
當把一部分磁盤(pán)空間格式化為 fat 文件系統時(shí), fat 文件系統就將這個(gè)分區當成整塊可分配的區域進(jìn)行規劃,以便于數據的存儲。一般來(lái)講,其劃分形式如圖 7 所示。我們把 FAT16 部分提取出來(lái),詳細描述一下:
FAT16 是 Microsoft 較早推出的文件系統,具有高度兼容性,目前仍然廣泛應用于個(gè)人電腦尤其是移動(dòng)存儲設備中, FAT16 簡(jiǎn)單來(lái)講由圖 4.3.12 所示的 6 部分組成 ( 主要是前 5 部分 ) 。引導扇區 (DBR) 我們已經(jīng)說(shuō)過(guò) ,FAT16 在 DBR 之后沒(méi)有留有任何保留扇區,其后緊隨的便是 FAT 表。 FAT 表是 FAT16 用來(lái)記錄磁盤(pán)數據區簇鏈結構的。像前面我們說(shuō)過(guò)的例子一樣, FAT 將磁盤(pán)空間按一定數目的扇區為單位進(jìn)行劃分,這樣的單位稱(chēng)為簇。通常情況下,每扇區 512 字節的原則是不變的。簇的大小一般是 2n (n 為整數 ) 個(gè)扇區的大小,像 512B,1K,2K,4K,8K,16K,32K , 64K 。實(shí)際中通常不超過(guò) 32K 。   之所以簇為單位而不以扇區為單位進(jìn)行磁盤(pán)的分配,是因為當分區容量較大時(shí),采用大小為 512b 的扇區管理會(huì )增加 fat 表的項數,對大文件存取增加消耗,文件系統效率不高。分區的大小和簇的取值是有關(guān)系的,見(jiàn)表 9
注意:少于 32680 個(gè)扇區的分區中,簇空間大小可最多達到每個(gè)簇 8 個(gè)扇區。不管用戶(hù)是使用磁盤(pán)管理器來(lái)格式化分區,還是使用命令提示行鍵入 format 命令格式化,格式化程序都創(chuàng )建一個(gè) 12 位的 FAT 。少于 16MB 的分區,系統通常會(huì )將其格式化成 12 位的 FAT , FAT12 是 FAT 的初始實(shí)現形式,是針對小型介質(zhì)的。 FAT12 文件分配表要比 FAT16 和 FAT32 的文件分配表小,因為它對每個(gè)條目使用的空間較少。這就給數據留下較多的空間。所有用 FAT12 格式化的 5.25 英寸軟盤(pán)以及 1.44MB 的 3.5 英寸軟盤(pán)都是由 FAT12 格式化的。除了 FAT 表中記錄每簇鏈結的二進(jìn)制位數與 FAT16 不同外,其余原理與 FAT16 均相同,不再單獨解釋。
格式化 FAT16 分區時(shí),格式化程序根據分區的大小確定簇的大小,然后根據保留扇區的數目、根目錄的扇區數目、數據區可分的簇數與 FAT 表本身所占空間   來(lái)確定 FAT 表所需的扇區數目,然后將計算后的結果寫(xiě)入 DBR 的相關(guān)位置。
FAT16 DBR 參數的偏移 0x11 處記錄了根目錄所占扇區的數目。偏移 0x16 記錄了 FAT 表所占扇區的數據。偏移 0x10 記錄了 FAT 表的副本數目。系統在得到這幾項參數以后,就可以確定數據區的開(kāi)始扇區偏移了。
FAT16 文件系統從根目錄所占的 32 個(gè)扇區之后的第一個(gè)扇區開(kāi)始以簇為單位進(jìn)行數據的處理,這之前仍以扇區為單位。對于根目錄之后的第一個(gè)簇,系統并不編號為第 0 簇或第 1 簇  ( 可能是留作關(guān)鍵字的原因吧 ) ,而是編號為第 2 簇,也就是說(shuō)數據區順序上的第 1 個(gè)簇也是編號上的第 2 簇。
FAT 文件系統之所以有 12 , 16 , 32 不同的版本之分,其根本在于 FAT 表用來(lái)記錄任意一簇鏈接的二進(jìn)制位數。以 FAT16 為例,每一簇在 FAT 表中占據 2 字節 ( 二進(jìn)制 16 位 ) 。所以, FAT16 最大可以表示的簇號為 0xFFFF( 十進(jìn)制的 65535) ,以 32K 為簇的大小的話(huà), FAT32 可以管理的最大磁盤(pán)空間為: 32KB×65535=2048MB, 這就是為什么 FAT16 不支持超過(guò) 2GB 分區的原因。
FAT 表實(shí)際上是一個(gè)數據表,以 2 個(gè)字節為單位,我們暫將這個(gè)單位稱(chēng)為 FAT 記錄項,通常情況其第 1 、 2 個(gè)記錄項 ( 前 4 個(gè)字節 ) 用作介質(zhì)描述。從第三個(gè)記錄項開(kāi)始記錄除根目錄外的其他文件及文件夾的簇鏈情況。根據簇的表現情況 FAT 用相應的取值來(lái)描述,見(jiàn)表 10
看一幅在 winhex 所截 FAT16 的文件分配表,圖 10 :
如圖, FAT 表以 "F8 FF FF FF"  開(kāi)頭,此 2 字節為介質(zhì)描述單元,并不參與 FAT 表簇鏈關(guān)系。小紅字標出的是 FAT 扇區每 2 字節對應的簇號。
相對偏移 0x4~0x5 偏移為第 2 簇 ( 順序上第 1 簇 ) ,此處為 FF, 表示存儲在第 2 簇上的文件 ( 目錄 ) 是個(gè)小文件,只占用 1 個(gè)簇便結束了。
第 3 簇中存放的數據是 0x0005 ,這是一個(gè)文件或文件夾的首簇。其內容為第 5 簇,就是說(shuō)接下來(lái)的簇位于第 5 簇 ?D?D 〉  FAT 表指引我們到達 FAT 表的第 5 簇指向,上面寫(xiě)的數據是 "FF FF", 意即此文件已至尾簇。
第 4 簇中存放的數據是 0x0006 ,這又是一個(gè)文件或文件夾的首簇。其內容為第 6 簇,就是說(shuō)接下來(lái)的簇位于第 6 簇 ?D?D 〉 FAT 表指引我們到達 FAT 表的第 6 簇指向,上面寫(xiě)的數據是 0x0007 ,就是說(shuō)接下來(lái)的簇位于第 7 簇 ?D?D 〉 FAT 表指引我們到達 FAT 表的第 7 簇指向 …… 直到根據 FAT 鏈讀取到扇區相對偏移 0x1A~0x1B ,也就是第 13 簇,上面寫(xiě)的數據是 0x000E ,也就是指向第 14 簇 ?D?D 〉 14 簇的內容為 "FF FF" ,意即此文件已至尾簇。
后面的 FAT 表數據與上面的道理相同。不再分析。
FAT 表記錄了磁盤(pán)數據文件的存儲鏈表,對于數據的讀取而言是極其重要的,以至于 Microsoft 為其開(kāi)發(fā)的 FAT 文件系統中的 FAT 表創(chuàng )建了一份備份,就是我們看到的 FAT2 。 FAT2 與 FAT1 的內容通常是即時(shí)同步的,也就是說(shuō)如果通過(guò)正常的系統讀寫(xiě)對 FAT1 做了更改,那么 FAT2 也同樣被更新。如果從這個(gè)角度來(lái)看,系統的這個(gè)功能在數據恢復時(shí)是個(gè)天災。
FAT 文件系統的目錄結構其實(shí)是一顆有向的從根到葉的樹(shù),這里提到的有向是指對于 FAT 分區內的任一文件 ( 包括文件夾 ) ,均需從根目錄尋址來(lái)找到??梢赃@樣認為:目錄存儲結構的入口就是根目錄。
FAT 文件系統根據根目錄來(lái)尋址其他文件 ( 包括文件夾 ) ,故而根目錄的位置必須在磁盤(pán)存取數據之前得以確定。 FAT 文件系統就是根據分區的相關(guān) DBR 參數與 DBR 中存放的已經(jīng)計算好的 FAT 表 (2 份 ) 的大小來(lái)確定的。格式化以后,跟目錄的大小和位置其實(shí)都已經(jīng)確定下來(lái)了:位置緊隨 FAT2 之后,大小通常為 32 個(gè)扇區。根目錄之后便是數據區第 2 簇。
FAT 文件系統的一個(gè)重要思想是把目錄 ( 文件夾 ) 當作一個(gè)特殊的文件來(lái)處理, FAT32 甚至將根目錄當作文件處理 ( 旁: NTFS 將分區參數、安全權限等好多東西抽象為文件更是這個(gè)思想的升華 ) ,在 FAT16 中,雖然根目錄地位并不等同于普通的文件或者說(shuō)是目錄,但其組織形式和普通的目錄 ( 文件夾 ) 并沒(méi)有不同。 FAT 分區中所有的文件夾 ( 目錄 ) 文件,實(shí)際上可以看作是一個(gè)存放其他文件 ( 文件夾 ) 入口參數的數據表。所以目錄的占用空間的大小并不等同于其下所有數據的大小,但也不等同于 0 。通常是占很小的空間的,可以看作目錄文件是一個(gè)簡(jiǎn)單的二維表文件。其具體存儲原理是:
不管目錄文件所占空間為多少簇,一簇為多少字節。系統都會(huì )以 32 個(gè)字節為單位進(jìn)行目錄文件所占簇的分配。這 32 個(gè)字節以確定的偏移來(lái)定義本目錄下的一個(gè)文件 ( 或文件夾 ) 的屬性,實(shí)際上是一個(gè)簡(jiǎn)單的二維表。
這 32 個(gè)字節的各字節偏移定義如表 11 :
對表 11 中的一些取值進(jìn)行說(shuō)明:
(1) 、對于短文件名,系統將文件名分成兩部分進(jìn)行存儲,即主文件名 + 擴展名。 0x0~0x7 字節記錄文件的主文件名, 0x8~0xA 記錄文件的擴展名,取文件名中的 ASCII 碼值。不記錄主文件名與擴展名之間的 "."   主文件名不足 8 個(gè)字符以空白符 (20H) 填充,擴展名不足 3 個(gè)字符同樣以空白符 (20H) 填充。 0x0 偏移處的取值若為 00H ,表明目錄項為空;若為 E5H ,表明目錄項曾被使用,但對應的文件或文件夾已被刪除。 ( 這也是誤刪除后恢復的理論依據 ) 。文件名中的第一個(gè)字符若為 “.” 或 “..” 表示這個(gè)簇記錄的是一個(gè)子目錄的目錄項。 “.” 代表當前目錄; “..” 代表上級目錄 ( 和我們在 dos 或 windows 中的使用意思是一樣的,如果磁盤(pán)數據被破壞,就可以通過(guò)這兩個(gè)目錄項的具體參數推算磁盤(pán)的數據區的起始位置,猜測簇的大小等等,故而是比較重要的 )
(2) 、 0xB 的屬性字段:可以看作系統將 0xB 的一個(gè)字節分成 8 位,用其中的一位代表某種屬性的有或無(wú)。這樣,一個(gè)字節中的 8 位每位取不同的值就能反映各個(gè)屬性的不同取值了。如 00000101 就表示這是個(gè)文件,屬性是只讀、系統。
(3) 、 0xC~0x15 在原 FAT16 的定義中是保留未用的。在高版本的 WINDOWS 系統中有時(shí)也用它來(lái)記錄修改時(shí)間和最近訪(fǎng)問(wèn)時(shí)間。那樣其字段的意義和 FAT32 的定義是相同的,見(jiàn)后邊 FAT32 。
(4) 、 0x16~0x17 中的時(shí)間 = 小時(shí) *2048+ 分鐘 *32+ 秒 /2 。得出的結果換算成 16 進(jìn)制填入即可。也就是: 0x16 字節的 0~4 位是以 2 秒為單位的量值; 0x16 字節的 5~7 位和 0x17 字節的 0~2 位是分鐘; 0x17 字節的 3~7 位是小時(shí)。
(5) 、 0x18~0x19 中的日期 =( 年份 -1980)*512+ 月份 *32+ 日。得出的結果換算成 16 進(jìn)制填入即可。也就是: 0x18 字節 0~4 位是日期數; 0x18 字節 5~7 位和 0x19 字節 0 位是月份; 0x19 字節的 1~7 位為年號,原定義中 0~119 分別代表 1980~2099 ,目前高版本的 Windows 允許取 0~127 ,即年號最大可以到 2107 年。
(6) 、 0x1A~0x1B 存放文件或目錄的表示文件的首簇號,系統根據掌握的首簇號在 FAT 表中找到入口,然后再跟蹤簇鏈直至簇尾,同時(shí)用 0x1C~0x1F 處字節判定有效性。就可以完全無(wú)誤的讀取文件 ( 目錄 ) 了。
(7) 、普通子目錄的尋址過(guò)程也是通過(guò)其父目錄中的目錄項來(lái)指定的,與數據文件 ( 指非目錄文件 ) 不同的是目錄項偏移 0xB 的第 4 位置 1 ,而數據文件為 0 。
對于整個(gè) FAT 分區而言,簇的分配并不完全總是分配干凈的。如一個(gè)數據區為 99 個(gè)扇區的 FAT 系統,如果簇的大小設定為 2 扇區,就會(huì )有 1 個(gè)扇區無(wú)法分配給任何一個(gè)簇。這就是分區的剩余扇區,位于分區的末尾。有的系統用最后一個(gè)剩余扇區備份本分區的 DBR ,這也是一種好的備份方法。
早的 FAT16 系統并沒(méi)有長(cháng)文件名一說(shuō), Windows 操作系統已經(jīng)完全支持在 FAT16 上的長(cháng)文件名了。 FAT16 的長(cháng)文件名與 FAT32 長(cháng)文件名的定義是相同的,關(guān)于長(cháng)文件名,在 FAT32 部分再詳細作解釋。
★ FAT32 存儲原理:
FAT32 是個(gè)非常有功勞的文件系統, Microsoft 成功地設計并運用了它,直到今天 NTFS 鋪天蓋地襲來(lái)的時(shí)候, FAT32 依然占據著(zhù) Microsoft Windows 文件系統中重要的地位。 FAT32 最早是出于 FAT16 不支持大分區、單位簇容量大以致空間急劇浪費等缺點(diǎn)設計的。實(shí)際應用中, FAT32 還是成功的。
FAT32 與 FAT16 的原理基本上是相同的,圖 4.3.13 標出了 FAT32 分區的基本構成。
FAT32 在格式化的過(guò)程中就根據分區的特點(diǎn)構建好了它的 DBR ,其中 BPB 參數是很重要的,可以回過(guò)頭來(lái)看一下表 4 和表 5 。首先 FAT32 保留扇區的數目默認為 32 個(gè),而不是 FAT16 的僅僅一個(gè)。這樣的好處是有助于磁盤(pán) DBR 指令的長(cháng)度擴展,而且可以為 DBR 扇區留有備份空間。上面我們已經(jīng)提到,構建在 FAT32 上的 win98 或 win2000 、 winXP ,其操作系統引導代碼并非只占一個(gè)扇區了。留有多余的保留扇區就可以很好的拓展 OS 引導代碼。在 BPB 中也記錄了 DBR 扇區的備份扇區編號。備份扇區可以讓我們在磁盤(pán)遭到意外破壞時(shí)恢復 DBR 。
FAT32 的文件分配表的數據結構依然和 FAT16 相同,所不同的是, FAT32 將記錄簇鏈的二進(jìn)制位數擴展到了 32 位,故而這種文件系統稱(chēng)為 FAT32 。 32 位二進(jìn)制位的簇鏈決定了 FAT 表最大可以尋址 2T 個(gè)簇。這樣即使簇的大小為 1 扇區,理論上仍然能夠尋址 1TB 范圍內的分區。但實(shí)際中 FAT32 是不能尋址這樣大的空間的,隨著(zhù)分區空間大小的增加, FAT 表的記錄數會(huì )變得臃腫不堪,嚴重影響系統的性能。所以在實(shí)際中通常不格式化超過(guò) 32GB 的 FAT32 分區。 WIN2000 及之上的 OS 已經(jīng)不直接支持對超過(guò) 32GB 的分區格式化成 FAT32 ,但 WIN98 依然可以格式化大到 127GB 的 FAT32 分區,但這樣沒(méi)必要也不推薦。同時(shí) FAT32 也有小的限制, FAT32 卷必須至少有 65527 個(gè)簇,所以對于小的分區,仍然需要使用 FAT16 或 FAT12 。
分區變大時(shí),如果簇很小,文件分配表也隨之變大。仍然會(huì )有上面的效率問(wèn)題存在。既要有效地讀寫(xiě)大文件,又要最大可能的減少空間的浪費。 FAT32 同樣規定了相應的分區空間對應的簇的大小,見(jiàn)表 12 :
FAT32 簇的取值意義和 FAT16 類(lèi)似,不過(guò)是位數長(cháng)了點(diǎn)罷了,比較見(jiàn)表 13 :
FAT32 的另一項重大改革是根目錄的文件化,即將根目錄等同于普通的文件。這樣根目錄便沒(méi)有了 FAT16 中 512 個(gè)目錄項的限制,不夠用的時(shí)候增加簇鏈,分配空簇即可。而且,根目錄的位置也不再硬性地固定了,可以存儲在分區內可尋址的任意簇內,不過(guò)通常根目錄
是最早建立的 ( 格式化就生成了 ) 目錄表。所以,我們看到的情況基本上都是根目錄首簇占簇區順序上的第 1 個(gè)簇。在圖 4.3.12 中也是按這種情況制作的畫(huà)的。
FAT32 對簇的編號依然同 FAT16 。順序上第 1 個(gè)簇仍然編號為第 2 簇,通常為根目錄所用 ( 這和 FAT16 是不同的, FAT16 的根目錄并不占簇區空間, 32 個(gè)扇區的根目錄以后才是簇區第 1 個(gè)簇 )
FAT32 的文件尋址方法與 FAT16 相同,但目錄項的各字節參數意義卻與 FAT16 有所不同,一方面它啟用了 FAT16 中的目錄項保留字段,同時(shí)又完全支持長(cháng)文件名了。
對于短文件格式的目錄項。其參數意義見(jiàn)表 14 :
說(shuō)明:
(1) 、這是 FAT32 短文件格式目錄項的意義。其中文件名、擴展名、時(shí)間、日期的算法和 FAT16 時(shí)相同的。
(2) 、由于 FAT32 可尋址的簇號到了 32 位二進(jìn)制數。所以系統在記錄文件 ( 文件夾 ) 開(kāi)始簇地址的時(shí)候也需要 32 位來(lái)記錄, FAT32 啟用目錄項偏移 0x12~0x13 來(lái)表示起始簇號的高 16 位。
(3) 、文件長(cháng)度依然用 4 個(gè)字節表示,這說(shuō)明 FAT32 依然只支持小于 4GB 的文件 ( 目錄 ) ,超過(guò) 4GB 的文件 ( 目錄 ), 系統會(huì )截斷處理。
FAT32 的一個(gè)重要的特點(diǎn)是完全支持長(cháng)文件名。長(cháng)文件名依然是記錄在目錄項中的。為了低版本的 OS 或程序能正確讀取長(cháng)文件名文件,系統自動(dòng)為所有長(cháng)文件名文件創(chuàng )建了一個(gè)對應的短文件名,使對應數據既可以用長(cháng)文件名尋址,也可以用短文件名尋址。不支持長(cháng)文件名的 OS 或程序會(huì )忽略它認為不合法的長(cháng)文件名字段,而支持長(cháng)文件名的 OS 或程序則會(huì )以長(cháng)文件名為顯式項來(lái)記錄和編輯,并隱藏起短文件名。
當創(chuàng )建一個(gè)長(cháng)文件名文件時(shí),系統會(huì )自動(dòng)加上對應的短文件名,其一般有的原則:
(1) 、取長(cháng)文件名的前 6 個(gè)字符加上 "~1" 形成短文件名,擴展名不變。
(2) 、如果已存在這個(gè)文件名,則符號 "~" 后的數字遞增,直到 5 。
(3) 、如果文件名中 "~" 后面的數字達到 5 ,則短文件名只使用長(cháng)文件名的前兩個(gè)字母。通過(guò)數學(xué)操縱長(cháng)文件名的剩余字母生成短文件名的后四個(gè)字母,然后加后綴 "~1" 直到最后 ( 如果有必要,或是其他數字以避免重復的文件名 ) 。
(4) 、如果存在老 OS 或程序無(wú)法讀取的字符,換以 "_"
長(cháng)文件名的實(shí)現有賴(lài)于目錄項偏移為 0xB 的屬性字節,當此字節的屬性為:只讀、隱藏、系統、卷標,即其值為 0FH 時(shí), DOS 和 WIN32 會(huì )認為其不合法而忽略其存在。這正是長(cháng)文件名存在的依據。將目錄項的 0xB 置為 0F ,其他就任由系統定義了, Windows9x 或 Windows 2000 、 XP 通常支持不超過(guò) 255 個(gè)字符的長(cháng)文件名。系統將長(cháng)文件名以 13 個(gè)字符為單位進(jìn)行切割,每一組占據一個(gè)目錄項。所以可能一個(gè)文件需要多個(gè)目錄項,這時(shí)長(cháng)文件名的各個(gè)目錄項按倒序排列在目錄表中,以防與其他文件名混淆。
長(cháng)文件名中的字符采用 unicode 形式編碼 ( 一個(gè)巨大的進(jìn)步哦 ) ,每個(gè)字符占據 2 字節的空間。其目錄項定義如表 15 。
系統在存儲長(cháng)文件名時(shí),總是先按倒序填充長(cháng)文件名目錄項,然后緊跟其對應的短文件名。從表 15 可以看出,長(cháng)文件名中并不存儲對應文件的文件開(kāi)始簇、文件大小、各種時(shí)間和日期屬性。文件的這些屬性還是存放在短文件名目錄項中,一個(gè)長(cháng)文件名總是和其相應的短文件名一一對應,短文件名沒(méi)有了長(cháng)文件名還可以讀,但長(cháng)文件名如果沒(méi)有對應的短文件名,不管什么系統都將忽略其存在。所以短文件名是至關(guān)重要的。在不支持長(cháng)文件名的環(huán)境中對短文件名中的文件名和擴展名字段作更改 ( 包括刪除,因為刪除是對首字符改寫(xiě) E5H) ,都會(huì )使長(cháng)文件名形同虛設。長(cháng)文件名和短文件名之間的聯(lián)系光靠他們之間的位置關(guān)系維系顯然遠遠不夠。其實(shí),長(cháng)文件名的 0xD 字節的校驗和起很重要的作用,此校驗和是用短文件名的 11 個(gè)字符通過(guò)一種運算方式來(lái)得到的。系統根據相應的算法來(lái)確定相應的長(cháng)文件名和短文件名是否匹配。這個(gè)算法不太容易用公式說(shuō)明,我們用一段 c 程序來(lái)加以說(shuō)明。
假設文件名 11 個(gè)字符組成字符串 shortname[], 校驗和用 chknum 表示。得到過(guò)程如下:
int i , j,chknum=0;
for (i=11; i>0; i--)
chksum = ((chksum & 1) ? 0x80 : 0) + (chksum >> 1) + shortname[j++];
如果通過(guò)短文件名計算出來(lái)的校驗和與長(cháng)文件名中的 0xD 偏移處數據不相等。系統無(wú)論如何都不會(huì )將它們配對的。
依據長(cháng)文件名和短文件名對目錄項的定義,加上對簇的編號和鏈接, FAT32 上數據的讀取便游刃有余了。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
FAT16 文件結構與組織
圖解電腦硬盤(pán)維修及數據恢復11
FAT16存儲原理:
FAT文件系統原理+FAT32文件系統學(xué)習+FAT32 FAT區__FAT表解析
fat32
FAT32文件系統的存儲組織結構(一)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久