根據(jù)自己電腦的fat,fat32分區(qū)來(lái)學(xué)習(xí)fat,fat32文件系統(tǒng)
fat16和fat32文件系統(tǒng)學(xué)習(xí) - 下載頻道 - CSDN.NET ?
http://download.csdn.net/detail/guyue35/9392290
FAT文件系統(tǒng)原理(一)---北亞數(shù)據(jù)恢復(fù)服務(wù)中心 4006-505-808 ?
http://www.raid-recovery.org/Article/sjhfdoc/200404/1.html
FAT文件系統(tǒng)原理(一) ? 更新時(shí)間:2004-4-20 【字體:小?大】
一、硬盤的物理結(jié)構(gòu):
????硬盤存儲(chǔ)數(shù)據(jù)是根據(jù)電、磁轉(zhuǎn)換原理實(shí)現(xiàn)的。硬盤由一個(gè)或幾個(gè)表面鍍有磁性物質(zhì)的金屬或玻璃等物質(zhì)盤片以及盤片兩面所安裝的磁頭和相應(yīng)的控制電路組成(圖1),其中盤片和磁頭密封在無(wú)塵的金屬殼中。 硬盤工作時(shí),盤片以設(shè)計(jì)轉(zhuǎn)速高速旋轉(zhuǎn),設(shè)置在盤片表面的磁頭則在電路控制下徑向移動(dòng)到指定位置然后將數(shù)據(jù)存儲(chǔ)或讀取出來(lái)。當(dāng)系統(tǒng)向硬盤寫入數(shù)據(jù)時(shí),磁頭中“寫數(shù)據(jù)”電流產(chǎn)生磁場(chǎng)使盤片表面磁性物質(zhì)狀態(tài)發(fā)生改變,并在寫電流磁場(chǎng)消失后仍能保持,這樣數(shù)據(jù)就存儲(chǔ)下來(lái)了;當(dāng)系統(tǒng)從硬盤中讀數(shù)據(jù)時(shí),磁頭經(jīng)過(guò)盤片指定區(qū)域,盤片表面磁場(chǎng)使磁頭產(chǎn)生感應(yīng)電流或線圈阻抗產(chǎn)生變化,經(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開(kāi)始編號(hào)。每個(gè)盤片被劃分成若干個(gè)同心圓磁道(邏輯上的,是不可見(jiàn)的。)每個(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鍵以后,開(kāi)始執(zhí)行主板bios程序。進(jìn)行完一系列檢測(cè)和配置以后。開(kāi)始按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來(lái)執(zhí)行。在總共512byte的主引導(dǎo)記錄中,MBR的引導(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)的特性。 我們來(lái)分析一段mbr。下面是用winhex查看的一塊希捷120GB硬盤的mbr。
?? 你的硬盤的MBR引導(dǎo)代碼可能并非這樣。不過(guò)即使不同,所執(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通過(guò)鏈接的方法解決了這個(gè)問(wèn)題。在DPT共64個(gè)字節(jié)中,以16個(gè)字節(jié)為分區(qū)表項(xiàng)單位描述一個(gè)分區(qū)的屬性。也就是說(shuō),第一個(gè)分區(qū)表項(xiàng)描述一個(gè)分區(qū)的屬性,一般為基本分區(qū)。第二個(gè)分區(qū)表項(xiàng)描述除基本分區(qū)外的其余空間,一般而言,就是我們所說(shuō)的擴(kuò)展分區(qū)。這部分的大體說(shuō)明見(jiàn)表1。
表1? 圖2分區(qū)表第一字段 字節(jié)位移 字段長(zhǎng)度 值 字段名和定義 0x01BE BYTE 0x80 ?? 引導(dǎo)指示符(Boot Indicator)?? 指明該分區(qū)是否是活動(dòng)分區(qū)。 0x01BF BYTE 0x01 開(kāi)始磁頭(Starting Head) 0x01C0 6位 0x01 開(kāi)始扇區(qū)(Starting Sector) 只用了0~5位。后面的兩位(第6位和第7位)被開(kāi)始柱面字段所使用 0x01C1 10位 0x00 開(kāi)始柱面(Starting Cylinder)?? 除了開(kāi)始扇區(qū)字段的最后兩位外,還使用了1位來(lái)組成該柱面值。開(kāi)始柱面是一個(gè)10位數(shù),最大值為1023 0x01C2 BYTE 0x07 系統(tǒng)ID(System ID) 定義了分區(qū)的類型,詳細(xì)定義,請(qǐng)參閱圖4 0x01C3 BYTE 0xFE 結(jié)束磁頭(Ending Head) 0x01C4 6位 0xFF 結(jié)束扇區(qū)(Ending Sector)???? 只使用了0~5位。最后兩位(第6、7位)被結(jié)束柱面字段所使用 0x01C5 10位 0x7B 結(jié)束柱面(Ending Cylinder) 除了結(jié)束扇區(qū)字段最后的兩位外,還使用了1位,以組成該柱面值。結(jié)束柱面是一個(gè)10位的數(shù),最大值為1023 0x01C6 DWORD 0x0000003F 相對(duì)扇區(qū)數(shù)(Relative Sectors) 從該磁盤的開(kāi)始到該分區(qū)的開(kāi)始的位移量,以扇區(qū)來(lái)計(jì)算 0x01CA DWORD 0x00DAA83D 總扇區(qū)數(shù)(Total Sectors) 該分區(qū)中的扇區(qū)總數(shù)
注:上表中的超過(guò)1字節(jié)的數(shù)據(jù)都以實(shí)際數(shù)據(jù)顯示,就是按高位到地位的方式顯示。存儲(chǔ)時(shí)是按低位到高位存儲(chǔ)的。兩者表現(xiàn)不同,請(qǐng)仔細(xì)看清楚。以后出現(xiàn)的表,圖均同。
也可以在winhex中看到這些參數(shù)的意義: ???? ??? 說(shuō)明: 每個(gè)分區(qū)表項(xiàng)占用16個(gè)字節(jié),假定偏移地址從0開(kāi)始。如圖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、重新說(shuō)明一下(這個(gè)非常重要):大于1個(gè)字節(jié)的數(shù)被以低字節(jié)在前的存儲(chǔ)格式格式(little endian format)或稱反字節(jié)順序保存下來(lái)。低字節(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ū)都不允許跨柱面,即均以柱面為單位,這就是通常所說(shuō)的分區(qū)粒度。有時(shí)候我們分區(qū)是輸入分區(qū)的大小為7000M,分出來(lái)卻是6997M,就是這個(gè)原因。 偏移2H和偏移6H的扇區(qū)和柱面參數(shù)中,扇區(qū)占6位(bit),柱面占10位(bit),以偏移6H為例,其低6位用作扇區(qū)數(shù)的二進(jìn)制表示。其高兩位做柱面數(shù)10位中的高兩位,偏移7H組成的8位做柱面數(shù)10位中的低8位。由此可知,實(shí)際上用這種方式表示的分區(qū)容量是有限的,柱面和磁頭從0開(kāi)始編號(hào),扇區(qū)從1開(kāi)始編號(hào),所以最多只能表示1024個(gè)柱面×63個(gè)扇區(qū)×256個(gè)磁頭×512byte=8455716864byte。即通常的8.4GB(實(shí)際上應(yīng)該是7.8GB左右)限制。實(shí)際上磁頭數(shù)通常只用到255個(gè)(由匯編語(yǔ)言的尋址寄存器決定),即使把這3個(gè)字節(jié)按線性尋址,依然力不從心。 在后來(lái)的操作系統(tǒng)中,超過(guò)8.4GB的分區(qū)其實(shí)已經(jīng)不通過(guò)C/H/S的方式尋址了。而是通過(guò)偏移CH~偏移FH共4個(gè)字節(jié)32位線性扇區(qū)地址來(lái)表示分區(qū)所占用的扇區(qū)總數(shù)。可知通過(guò)4個(gè)字節(jié)可以表示2^32個(gè)扇區(qū),即2TB=2048GB,目前對(duì)于大多數(shù)計(jì)算機(jī)而言,這已經(jīng)是個(gè)天文數(shù)字了。在未超過(guò)8.4GB的分區(qū)上,C/H/S的表示方法和線性扇區(qū)的表示方法所表示的分區(qū)大小是一致的。也就是說(shuō),兩種表示方法是協(xié)調(diào)的。即使不協(xié)調(diào),也以線性尋址為準(zhǔn)。(可能在某些系統(tǒng)中會(huì)提示出錯(cuò))。超過(guò)8.4GB的分區(qū)結(jié)束C/H/S一般填充為FEH FFH FFH。即C/H/S所能表示的最大值。有時(shí)候也會(huì)用柱面對(duì)1024的模來(lái)填充。不過(guò)這幾個(gè)字節(jié)是什么其實(shí)都無(wú)關(guān)緊要了。? ??? 雖然現(xiàn)在的系統(tǒng)均采用線性尋址的方式來(lái)處理分區(qū)的大小。但不可跨柱面的原則依然沒(méi)變。本分區(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,?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。但是,如果磁盤上沒(méi)有擴(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)器的擴(kuò)展分區(qū)表的第二項(xiàng)指向下一個(gè)邏輯驅(qū)動(dòng)器的EBR。擴(kuò)展分區(qū)表的第三項(xiàng)和第四項(xiàng)永遠(yuǎn)都不會(huì)被使用。 ??? 通過(guò)一幅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)器,說(shuō)明了前面的邏輯驅(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)。最后一個(gè)擴(kuò)展分區(qū)表的第二個(gè)項(xiàng)到第四個(gè)項(xiàng)被使用。???
??? 表2? 擴(kuò)展分區(qū)表項(xiàng)的內(nèi)容
擴(kuò)展分區(qū)表項(xiàng) 分區(qū)表項(xiàng)的內(nèi)容 第一個(gè)項(xiàng) 包括數(shù)據(jù)的開(kāi)始地址在內(nèi)的與擴(kuò)展分區(qū)中當(dāng)前邏輯驅(qū)動(dòng)器有關(guān)的信息 第二個(gè)項(xiàng) 有關(guān)擴(kuò)展分區(qū)中的下一個(gè)邏輯驅(qū)動(dòng)器的信息,包括包含下一個(gè)邏輯驅(qū)動(dòng)器的EBR的扇區(qū)的地址。如果不存在進(jìn)一步的邏輯驅(qū)動(dòng)器的話,該字段不會(huì)被使用 第三個(gè)項(xiàng) 未用 第四個(gè)項(xiàng) 未用
??? 擴(kuò)展分區(qū)表項(xiàng)中的相對(duì)扇區(qū)數(shù)字段所顯示的是從擴(kuò)展分區(qū)開(kāi)始到邏輯驅(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ì)有剩余空間,剩余空間是什么呢?我們前面說(shuō)到,分區(qū)是以1柱面的容量為分區(qū)粒度的,那么如果磁盤總空間不是整數(shù)個(gè)柱面的話,不夠一個(gè)柱面的剩下的空間就是剩余空間了,這部分空間并不參與分區(qū),所以一般無(wú)法利用。照道理說(shuō),磁盤的物理模式?jīng)Q定了磁盤的總?cè)萘烤蛻?yīng)該是整數(shù)個(gè)柱面的容量,為什么會(huì)有不夠一個(gè)柱面的空間呢。在我的理解看來(lái),本來(lái)現(xiàn)在的磁盤為了更大的利用空間,一般在物理上并不是按照外圍的扇區(qū)大于里圈的扇區(qū)這種管理方式,只是為了與操作系統(tǒng)兼容而抽象出來(lái)CHS。可能其實(shí)際空間容量不一定正好為整數(shù)個(gè)柱面的容量吧。關(guān)于這點(diǎn),如有高見(jiàn),請(qǐng)告知http://www.sjhf.net或zymail@vip.sina.com,sjhf@sjhf.net。?
FAT文件系統(tǒng)原理(二)---北亞數(shù)據(jù)恢復(fù)服務(wù)中心 4006-505-808 ?
http://www.raid-recovery.org/Article/sjhfdoc/200404/2.html
FAT文件系統(tǒng)原理(二) ? 更新時(shí)間:2004-4-20 【字體:小?大】
四、FAT分區(qū)原理。
先來(lái)一幅結(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)。下面依次解釋DBR、FAT1、FAT2、根目錄、數(shù)據(jù)區(qū)、剩余扇區(qū)的概念。提到的地址如無(wú)特別提示均為分區(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ū),我們先說(shuō)第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為例說(shuō)明分區(qū)DBR各字節(jié)的含義。見(jiàn)圖8。 ???? 圖8的對(duì)應(yīng)解釋見(jiàn)表3????
單擊此處查看PDF版全文
???? 表3???FAT32分區(qū)上DBR中各部分的位置劃分??? 字節(jié)位移 字段長(zhǎng)度 字段名 對(duì)應(yīng)圖8顏色 0x00 3個(gè)字節(jié) 跳轉(zhuǎn)指令 ? 0x03 8個(gè)字節(jié) 廠商標(biāo)志和os版本號(hào) ? 0x0B 53個(gè)字節(jié) BPB ? 0x40 26個(gè)字節(jié) 擴(kuò)展BPB ? 0x5A 420個(gè)字節(jié) 引導(dǎo)程序代碼 ? 0x01FE 2個(gè)字節(jié) 有效結(jié)束標(biāo)志 ?
圖9給出了winhex對(duì)圖8?DBR的相關(guān)參數(shù)解釋: ???? ??? 根據(jù)上邊圖例,我們來(lái)討論DBR各字節(jié)的參數(shù)意義。??????? ????MBR將CPU執(zhí)行轉(zhuǎn)移給引導(dǎo)扇區(qū),因此,引導(dǎo)扇區(qū)的前三個(gè)字節(jié)必須是合法的可執(zhí)行的基于x86的CPU指令。這通常是一條跳轉(zhuǎn)指令,該指令負(fù)責(zé)跳過(guò)接下來(lái)的幾個(gè)不可執(zhí)行的字節(jié)(BPB和擴(kuò)展BPB),跳到操作系統(tǒng)引導(dǎo)代碼部分。 ??? 跳轉(zhuǎn)指令之后是8字節(jié)長(zhǎng)的OEM ID,它是一個(gè)字符串, OEM ID標(biāo)識(shí)了格式化該分區(qū)的操作系統(tǒng)的名稱和版本號(hào)。為了保留與MS-DOS的兼容性,通常Windows 2000格式化該盤是在FAT16和FAT32磁盤上的該字段中記錄了“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”。 ??? 接下來(lái)的從偏移0x0B開(kāi)始的是一段描述能夠使可執(zhí)行引導(dǎo)代碼找到相關(guān)參數(shù)的信息。通常稱之為BPB(BIOS Parameter Block),BPB一般開(kāi)始于相同的位移量,因此,標(biāo)準(zhǔn)的參數(shù)都處于一個(gè)已知的位置。磁盤容量和幾何結(jié)構(gòu)變量都被封在BPB之中。由于引導(dǎo)扇區(qū)的第一部分是一個(gè)x86跳轉(zhuǎn)指令。因此,將來(lái)通過(guò)在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含義釋義為表格,見(jiàn)表4和表5。
表4??FAT32分區(qū)的BPB字段????? 字節(jié)位移 字段長(zhǎng)度(字節(jié)) 圖8對(duì)應(yīng)取值 名稱和定義 0x0B 2 0x0200 扇區(qū)字節(jié)數(shù)(Bytes Per Sector) 硬件扇區(qū)的大小。本字段合法的十進(jìn)制值有512、1024、2048和4096。對(duì)大多數(shù)磁盤來(lái)說(shuō),本字段的值為512 0x0D 1 0x08 每簇扇區(qū)數(shù)(Sectors Per Cluster),一簇中的扇區(qū)數(shù)。由于FAT32文件系統(tǒng)只能跟蹤有限個(gè)簇(最多為4 294 967 296個(gè)),因此,通過(guò)增加每簇扇區(qū)數(shù),可以使FAT32文件系統(tǒng)支持最大分區(qū)數(shù)。一個(gè)分區(qū)缺省的簇大小取決于該分區(qū)的大小。本字段的合法十進(jìn)制值有1、2、4、8、16、32、64和128。Windows 2000的FAT32實(shí)現(xiàn)只能創(chuàng)建最大為32GB的分區(qū)。但是,Windows 2000能夠訪問(wèn)由其他操作系統(tǒng)(Windows 95、OSR2及其以后的版本)所創(chuàng)建的更大的分區(qū) 0x0e 2 0x0020 保留扇區(qū)數(shù)(Reserved Sector) 第一個(gè)FAT開(kāi)始之前的扇區(qū)數(shù),包括引導(dǎo)扇區(qū)。本字段的十進(jìn)制值一般為32 0x10 1 0x02 FAT數(shù)(Number of?FAT) 該分區(qū)上FAT的副本數(shù)。本字段的值一般為2 0x11 2 0x0000 根目錄項(xiàng)數(shù)(Root Entries)只有FAT12/FAT16使用此字段。對(duì)FAT32分區(qū)而言,本字段必須設(shè)置為 0 0x13 2 0x0000 小扇區(qū)數(shù)(Small Sector)(只有FAT12/FAT16使用此字段)對(duì)FAT32分區(qū)而言,本字段必須設(shè)置為0 0x15 1 0xF8 媒體描述符( Media Descriptor)提供有關(guān)媒體被使用的信息。值0xF8表示硬盤,0xF0表示高密度的3.5寸軟盤。媒體描述符要用于MS-DOS?FAT16磁盤,在Windows 2000中未被使用 0x16 2 0x0000 每FAT扇區(qū)數(shù)(Sectors Per?FAT)只被FAT12/FAT16所使用,對(duì)FAT32分區(qū)而言,本字段必須設(shè)置為0 0x18 2 0x003F 每道扇區(qū)數(shù)(Sectors Per Track) 包含使用INT13h的磁盤的“每道扇區(qū)數(shù)”幾何結(jié)構(gòu)值。該分區(qū)被多個(gè)磁頭的柱面分成了多個(gè)磁道 0x1A 2 0x00FF 磁頭數(shù)(Number of Head) 本字段包含使用INT 13h的磁盤的“磁頭數(shù)”幾何結(jié)構(gòu)值。例如,在一張1.44MB 3.5英寸的軟盤上,本字段的值為 2 0x1C 4 0x0000003F 隱藏扇區(qū)數(shù)(Hidden Sector) 該分區(qū)上引導(dǎo)扇區(qū)之前的扇區(qū)數(shù)。在引導(dǎo)序列計(jì)算到根目錄的數(shù)據(jù)區(qū)的絕對(duì)位移的過(guò)程中使用了該值。本字段一般只對(duì)那些在中斷13h上可見(jiàn)的媒體有意義。在沒(méi)有分區(qū)的媒體上它必須總是為0 0x20 4 0x007D043F 總扇區(qū)數(shù)(Large Sector) 本字段包含F(xiàn)AT32分區(qū)中總的扇區(qū)數(shù) 0x24 4 0x00001F32 每FAT扇區(qū)數(shù)(Sectors Per?FAT)(只被FAT32使用)該分區(qū)每個(gè)FAT所占的扇區(qū)數(shù)。計(jì)算機(jī)利用這個(gè)數(shù)和?FAT數(shù)以及隱藏扇區(qū)數(shù)(本表中所描述的)來(lái)決定根目錄從哪里開(kāi)始。該計(jì)算機(jī)還可以從目錄中的項(xiàng)數(shù)決定該分區(qū)的用戶數(shù)據(jù)區(qū)從哪里開(kāi)始 0x28 2 0x00 擴(kuò)展標(biāo)志(Extended Flag)(只被FAT32使用)該兩個(gè)字節(jié)結(jié)構(gòu)中各位的值為: 位0-3:活動(dòng)?FAT數(shù)(從0開(kāi)始計(jì)數(shù),而不是1). ?????? 只有在不使用鏡像時(shí)才有效 位4-6:保留 位7:0值意味著在運(yùn)行時(shí)FAT被映射到所有的FAT ???? 1值表示只有一個(gè)FAT是活動(dòng)的 位8-15:保留
0x2A 2 0x0000 文件系統(tǒng)版本(File ystem Version)只供FAT32使用,高字節(jié)是主要的修訂號(hào),而低字節(jié)是次要的修訂號(hào)。本字段支持將來(lái)對(duì)該FAT32媒體類型進(jìn)行擴(kuò)展。如果本字段非零,以前的Windows版本將不支持這樣的分區(qū) 0x2C 4 0x00000002 根目錄簇號(hào)(Root Cluster Number)(只供FAT32使用) 根目錄第一簇的簇號(hào)。本字段的值一般為2,但不總是如此 0x30 2 0x0001 文件系統(tǒng)信息扇區(qū)號(hào)(File System Information SectorNumber)(只供FAT32使用)?FAT32分區(qū)的保留區(qū)中的文件系統(tǒng)信息(File System Information, FSINFO)結(jié)構(gòu)的扇區(qū)號(hào)。其值一般為1。在備份引導(dǎo)扇區(qū)(Backup Boot Sector)中保留了該FSINFO結(jié)構(gòu)的一個(gè)副本,但是這個(gè)副本不保持更新 0x34 2 0x0006 備份引導(dǎo)扇區(qū)(只供FAT32使用) 為一個(gè)非零值,這個(gè)非零值表示該分區(qū)保存引導(dǎo)扇區(qū)的副本的保留區(qū)中的扇區(qū)號(hào)。本字段的值一般為6,建議不要使用其他值 0x36 12 12個(gè)字節(jié)均為0x00 保留(只供FAT32使用)供以后擴(kuò)充使用的保留空間。本字段的值總為0
?
表5???FAT32分區(qū)的擴(kuò)展BPB字段??????????? 字節(jié)位移 字段長(zhǎng)度(字節(jié)) 圖8對(duì)應(yīng)取值 字段名稱和定義 0x40 1 0x80 物理驅(qū)動(dòng)器號(hào)( Physical Drive Number) 與BIOS物理驅(qū)動(dòng)器號(hào)有關(guān)。軟盤驅(qū)動(dòng)器被標(biāo)識(shí)為0x00,物理硬盤被標(biāo)識(shí)為0x80,而與物理磁盤驅(qū)動(dòng)器無(wú)關(guān)。一般地,在發(fā)出一個(gè)INT13h BIOS調(diào)用之前設(shè)置該值,具體指定所訪問(wèn)的設(shè)備。只有當(dāng)該設(shè)備是一個(gè)引導(dǎo)設(shè)備時(shí),這個(gè)值才有意義 0x41 1 0x00 保留(Reserved)?FAT32分區(qū)總是將本字段的值設(shè)置為0 0x42 1 0x29 擴(kuò)展引導(dǎo)標(biāo)簽(Extended Boot Signature) 本字段必須要有能被Windows 2000所識(shí)別的值0x28或0x29 0x43 4 0x33391CFE 分區(qū)序號(hào)(Volume Serial Number) 在格式化磁盤時(shí)所產(chǎn)生的一個(gè)隨機(jī)序號(hào),它有助于區(qū)分磁盤 0x47 11 "NO NAME" 卷標(biāo)(Volume Label) 本字段只能使用一次,它被用來(lái)保存卷標(biāo)號(hào)。現(xiàn)在,卷標(biāo)被作為一個(gè)特殊文件保存在根目錄中 0x52 8 "FAT32" 系統(tǒng)ID(System ID)?FAT32文件系統(tǒng)中一般取為"FAT32"
?????DBR的偏移0x5A開(kāi)始的數(shù)據(jù)為操作系統(tǒng)引導(dǎo)代碼。這是由偏移0x00開(kāi)始的跳轉(zhuǎn)指令所指向的。在圖8所列出的偏移0x00~0x02的跳轉(zhuǎn)指令"EB 58 90"清楚地指明了OS引導(dǎo)代碼的偏移位置。jump 58H加上跳轉(zhuǎn)指令所需的位移量,即開(kāi)始于0x5A。此段指令在不同的操作系統(tǒng)上和不同的引導(dǎo)方式上,其內(nèi)容也是不同的。大多數(shù)的資料上都說(shuō)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ì)使用基本分區(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)也是無(wú)法啟動(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ū)也需以0x55AA為合法結(jié)束標(biāo)志。
FAT16?DBR: ?????FAT32中DBR的含義大致如此,對(duì)于FAT12和FAT16其基本意義類似,只是相關(guān)偏移量和參數(shù)意義有小的差異,FAT格式的區(qū)別和來(lái)因,以后會(huì)說(shuō)到,此處不在多說(shuō)FAT12與FAT16。我將FAT16的扇區(qū)參數(shù)意義列表。感興趣的朋友自己研究一下,和FAT32大同小異的。
表6? 一個(gè)FAT16分區(qū)上的引導(dǎo)扇區(qū)段 字節(jié)位移 字段長(zhǎng)度(字節(jié)) 字段名稱 0x00 3 跳轉(zhuǎn)指令(Jump Instruction) 0x03 8 OEM ID 0x0B 25 BPB 0x24 26 擴(kuò)展BPB 0x3E 448 引導(dǎo)程序代碼(Bootstrap Code) 0x01FE 4 扇區(qū)結(jié)束標(biāo)識(shí)符(0x55AA)
表7??FAT16分區(qū)的BPB字段????? 字節(jié)位移 字段長(zhǎng)度(字節(jié)) 例值 名稱和定義 0x0B 2 0x0200 扇區(qū)字節(jié)數(shù)(Bytes Per Sector) 硬件扇區(qū)的大小。本字段合法的十進(jìn)制值有512、1024、2048和4096。對(duì)大多數(shù)磁盤來(lái)說(shuō),本字段的值為512 0x0D 1 0x40 每簇扇區(qū)數(shù)(Sectors Per Cluster) 一個(gè)簇中的扇區(qū)數(shù)。由于FAT16文件系統(tǒng)只能跟蹤有限個(gè)簇(最多為65536個(gè))。因此,通過(guò)增加每簇的扇區(qū)數(shù)可以支持最大分區(qū)數(shù)。分區(qū)的缺省的簇的大小取決于該 分區(qū)的大小。本字段合法的十進(jìn)制值有 1、2、4、8、16、32、64和128。導(dǎo)致簇大于32KB(每扇區(qū)字節(jié)數(shù)*每簇扇區(qū)數(shù))的值會(huì)引起磁盤錯(cuò)誤和軟件錯(cuò)誤 0x0e 2 0x0001 保留扇區(qū)數(shù)(Reserved Sector) 第一個(gè)FAT開(kāi)始之前的扇區(qū)數(shù),包括引導(dǎo)扇區(qū)。本字段的十進(jìn)制值一般為1 0x10 1 0x02 FAT數(shù)(Number of?FAT)該分區(qū)上FAT的副本數(shù)。本字段的值一般為2 0x11 2 0x0200 根目錄項(xiàng)數(shù)(Root Entries) 能夠保存在該分區(qū)的根目錄文件夾中的32個(gè)字節(jié)長(zhǎng)的文件和文件夾名稱項(xiàng)的總數(shù)。在一個(gè)典型的硬盤上,本字段的值為512。其中一個(gè)項(xiàng)常常被用作卷標(biāo)號(hào)(Volume Label),長(zhǎng)名稱的文件和文件夾每個(gè)文件使用多個(gè)項(xiàng)。文件和文件夾項(xiàng)的最大數(shù)一般為511,但是如果使用的長(zhǎng)文件名,往往都達(dá)不到這個(gè)數(shù) 0x13 2 0x0000 小扇區(qū)數(shù)(Small Sector) 該分區(qū)上的扇區(qū)數(shù),表示為16位(<65536)。對(duì)大于65536個(gè)扇區(qū)的分區(qū)來(lái)說(shuō),本字段的值為0,而使用大扇區(qū)數(shù)來(lái)取代它 0x15 1 0xF8 媒體描述符( Media Descriptor)提供有關(guān)媒體被使用的信息。值0xF8表示硬盤,0xF0表示高密度的3.5寸軟盤。媒體描述符要用于MS-DOS?FAT16磁盤,在Windows 2000中未被使用 0x16 2 0x00FC 每FAT扇區(qū)數(shù)(Sectors Per?FAT) 該分區(qū)上每個(gè)FAT所占用的扇區(qū)數(shù)。計(jì)算機(jī)利用這個(gè)數(shù)和FAT數(shù)以及隱藏扇區(qū)數(shù)來(lái)決定根目錄在哪里開(kāi)始。計(jì)算機(jī)還可以根據(jù)根目錄中的項(xiàng)數(shù)(512)決定該 分區(qū)的用戶數(shù)據(jù)區(qū)從哪里開(kāi)始 0x18 2 0x003F 每道扇區(qū)數(shù)(Sectors Per Trark) 0x1A 2 0x0040 磁頭數(shù)(Number of head) 0x1C 4 0x0000003F 隱藏扇區(qū)數(shù)(Hidden Sector) 該分區(qū)上引導(dǎo)扇區(qū)之前的扇區(qū)數(shù)。在引導(dǎo)序列計(jì)算到根目錄和數(shù)據(jù)區(qū)的絕對(duì)位移的過(guò)程中使用了該值 0x20 4 0x003EF001 大扇區(qū)數(shù)(Large Sector) 如果小扇區(qū)數(shù)字段的值為0,本字段就包含該FAT16分區(qū)中的總扇區(qū)數(shù)。如果小扇區(qū)數(shù)字段的值不為0,那么本字段的值為0
表8???FAT16分區(qū)的擴(kuò)展BPB字段??????????? 字節(jié)位移 字段長(zhǎng)度(字節(jié)) 圖8對(duì)應(yīng)取值 字段名稱和定義 0x24 1 0x80 物理驅(qū)動(dòng)器號(hào)( Physical Drive Number) 與BIOS物理驅(qū)動(dòng)器號(hào)有關(guān)。軟盤驅(qū)動(dòng)器被標(biāo)識(shí)為0x00,物理硬盤被標(biāo)識(shí)為0x80,而與物理磁盤驅(qū)動(dòng)器無(wú)關(guān)。一般地,在發(fā)出一個(gè)INT13h BIOS調(diào)用之前設(shè)置該值,具體指定所訪問(wèn)的設(shè)備。只有當(dāng)該設(shè)備是一個(gè)引導(dǎo)設(shè)備時(shí),這個(gè)值才有意義 0x25 1 0x00 保留(Reserved)?FAT16分區(qū)一般將本字段的值設(shè)置為0 0x26 1 0x29 擴(kuò)展引導(dǎo)標(biāo)簽(Extended Boot Signature) 本字段必須要有能被Windows 2000所識(shí)別的值0x28或0x29 0x27 2 0x52368BA8 卷序號(hào)(Volume Serial Number) 在格式化磁盤時(shí)所產(chǎn)生的一個(gè)隨機(jī)序號(hào),它有助于區(qū)分磁盤 0x2B 11 "NO NAME" 卷標(biāo)(Volume Label) 本字段只能使用一次,它被用來(lái)保存卷標(biāo)號(hào)。現(xiàn)在,卷標(biāo)被作為一個(gè)特殊文件保存在根目錄中 0x36 8 "FAT16" 文件系統(tǒng)類型(File System Type) 根據(jù)該磁盤格式,該字段的值可以為FAT、FAT12或FAT16
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ū)開(kāi)始的僅為系統(tǒng)所有的扇區(qū),包括DBR扇區(qū)。在FAT16文件系統(tǒng)中,保留扇區(qū)的數(shù)據(jù)通常設(shè)置為1,即僅僅DBR扇區(qū)。而在FAT32中,保留扇區(qū)的數(shù)據(jù)通常取為32,有時(shí)候用Partition Magic分過(guò)的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ù)管理,通常情況下是沒(méi)作用的。操作系統(tǒng)之所以在FAT32中設(shè)置保留扇區(qū),是為了對(duì)DBR作備份或留待以后升級(jí)時(shí)用。FAT32中,DBR偏移0x34占2字節(jié)的數(shù)據(jù)指明了DBR備份扇區(qū)所在,一般為0x06,即第6扇區(qū)。當(dāng)FAT32分區(qū)DBR扇區(qū)被破壞導(dǎo)致分區(qū)無(wú)法訪問(wèn)時(shí)。可以用第6扇區(qū)的原備份替換第0扇區(qū)來(lái)找回?cái)?shù)據(jù)。
單擊此處查看PDF版全文
FAT文件系統(tǒng)原理(三)---北亞數(shù)據(jù)恢復(fù)服務(wù)中心 4006-505-808 ?
http://www.raid-recovery.org/Article/sjhfdoc/200404/3.html
FAT文件系統(tǒng)原理(三) ? 更新時(shí)間:2004-4-20 【字體:小?大】
4.3??FAT表和數(shù)據(jù)的存儲(chǔ)原則。
???????FAT表(File Allocation Table 文件分配表),是Microsoft在FAT文件系統(tǒng)中用于磁盤數(shù)據(jù)(文件)索引和定位引進(jìn)的一種鏈?zhǔn)浇Y(jié)構(gòu)。假如把磁盤比作一本書(shū),FAT表可以認(rèn)為相當(dāng)于書(shū)中的目錄,而文件就是各個(gè)章節(jié)的內(nèi)容。但FAT表的表示方法卻與目錄有很大的不同。 ????? 在FAT文件系統(tǒng)中,文件的存儲(chǔ)依照FAT表制定的簇鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)來(lái)進(jìn)行。同時(shí),FAT文件系統(tǒng)將組織數(shù)據(jù)時(shí)使用的目錄也抽象為文件,以簡(jiǎn)化對(duì)數(shù)據(jù)的管理。
單擊此處查看PDF版全文 ?★存儲(chǔ)過(guò)程假想: ????? 我們模擬對(duì)一個(gè)分區(qū)存儲(chǔ)數(shù)據(jù)的過(guò)程來(lái)說(shuō)明FAT文件系統(tǒng)中數(shù)據(jù)的存儲(chǔ)原則。 ????? 假定現(xiàn)在有一個(gè)空的完全沒(méi)有存放數(shù)據(jù)的磁盤,大小為100KB,我們將其想象為線形的空間地址。為了存儲(chǔ)管理上的便利,我們?nèi)藶榈膶⑦@100KB的空間均分成100份,每份1KB。我們來(lái)依次存儲(chǔ)這樣幾個(gè)文件:A.TXT(大小10KB),B.TXT(大小53.6KB),C.TXT(大小20.5KB)。 ????? 最起碼能夠想到,我們可以順序的在這100KB空間中存放這3個(gè)文件。同時(shí)不要忘了,我們還要記下他們的大小和開(kāi)始的位置,這樣下次要用時(shí)才能找的到,這就像是目錄。為了便于查找,我們假定用第1K的空間來(lái)存儲(chǔ)他們的特征(屬性)。還有,我們?cè)O(shè)計(jì)的存儲(chǔ)單位是1KB,所以,A.TXT我們需要10個(gè)存儲(chǔ)單位(為了說(shuō)明方便,我們把存儲(chǔ)單位叫做“簇”吧。也能少打點(diǎn)字,呵呵。),B.TXT需要54個(gè)簇,C.TXT需要21個(gè)簇。可能有人會(huì)說(shuō)B.TXT和C.TXT不是各自浪費(fèi)了不到1簇的空間嗎?干嘛不讓他們緊挨著,不是省地方嗎?我的回答是,如果按照這樣的方式存儲(chǔ),目錄中原本只需要記下簇號(hào),現(xiàn)在還需要記下簇內(nèi)的偏移,這樣會(huì)增加目錄的存儲(chǔ)量,而且存取沒(méi)有了規(guī)則,讀取也不太方便,是得不償失的。 ??? 根據(jù)上面所說(shuō)的思想,我們?cè)O(shè)計(jì)了這樣的圖4.3.1所示的存儲(chǔ)方式。
????? 我們?cè)倏紤]如何來(lái)寫這三個(gè)文件的目錄。對(duì)于每個(gè)文件而言,一定要記錄的有:文件名,開(kāi)始簇,大小,創(chuàng)建日期、時(shí)間,修改日期、時(shí)間,文件的讀寫屬性等。這里大小能不能用結(jié)束簇來(lái)計(jì)算呢?一定不能,因?yàn)槲募拇笮〔灰欢ň褪钦麛?shù)個(gè)簇的大小,否則的話像B.TXT的內(nèi)容就是54KB的內(nèi)容了,少了固然不行,可多了也是不行的。那么我們?cè)趺从涗浤?#xff1f;可以想象一下。為了管理上的方便,我們用數(shù)據(jù)庫(kù)的管理方式來(lái)管理我們的目錄。于是我把1KB再分成10份,假定開(kāi)始簇號(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)處理資源,而且也不一定解決問(wèn)題。這個(gè)問(wèn)題看來(lái)暫時(shí)解決不了。 ??? 那我們換個(gè)操作,把B.txt刪了,b.txt的空間隨之釋放。這時(shí)候空間如圖4.3.3,目錄如圖4.3.4
????? 這個(gè)操作看來(lái)還可以,我們接著做,在存入一個(gè)文件D.txt(大小為60.3KB),總共100簇的空間只用了31簇,還有68簇剩余,按說(shuō)能放下。可是?往那里放呢?沒(méi)有61個(gè)連續(xù)的空間了,目錄行沒(méi)辦法寫了,看來(lái)無(wú)連續(xù)塊存儲(chǔ)暫時(shí)也不行。 ??? 你一定能夠想到我們可以在連續(xù)空間不夠或增加文件長(zhǎng)度的時(shí)候轉(zhuǎn)移影響我們操作的其他文件,從而騰出空間來(lái),但我要問(wèn)你,那不是成天啥也不要干了,就是倒騰東西了嗎?
??? 看來(lái)我們?cè)O(shè)計(jì)的文件系統(tǒng)有致命的漏洞,怎么解決呢?。。。。 。。。。。。
??? 其實(shí)可以這樣解決: ??? 首先我們?cè)试S文件的不連續(xù)存儲(chǔ)。目錄中依然只記錄開(kāi)始簇和文件的大小。那么我們?cè)趺从涗浳募加媚切┐啬?#xff0c;以文件映射簇不太方便,因?yàn)槲募遣还潭ǖ摹N覀儞Q個(gè)思想,可以用簇來(lái)映射文件,在整個(gè)存儲(chǔ)空間的前部留下幾簇來(lái)記錄數(shù)據(jù)區(qū)中數(shù)據(jù)與簇號(hào)的關(guān)系。對(duì)于上例因?yàn)榭偪臻g也不大,所以用前部的1Kb的空間來(lái)記錄這種對(duì)應(yīng),假設(shè)3個(gè)文件都存儲(chǔ),空間分配如圖4.3.5,同時(shí)修改一下目錄,如圖4.3.6
????? 第一簇用來(lái)記錄數(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)記錄了文件的開(kāi)始簇了。所以可以改良一下,用鏈的方式來(lái)存放占有簇的關(guān)系,變成圖4.3.8的組織方式。
????? 參照?qǐng)D4.3.8來(lái)理解一下文件分配表的意義。如文件a.txt我們根據(jù)目錄項(xiàng)中指定的a.txt的首簇為2,然后找到文件分配表的第2簇記錄,上面登記的是3,我們就能確定下一簇是3。找到文件分配表的第3簇記錄,上面登記的是4,我們就能確定下一簇是4......直到指到第11簇,發(fā)現(xiàn)下一個(gè)指向是FF,就是結(jié)束。文件便絲毫無(wú)誤讀取完畢。
??? 我們?cè)倏瓷厦嫣岬降牡谌N情況,就是將b.txt刪除以后,存入一個(gè)大小為60.3KB的d.txt。利用簇鏈可以很容易的實(shí)現(xiàn)。實(shí)現(xiàn)后的磁盤如圖4.3.9? 4.3.10? 4.3.11
???? 上面是我們對(duì)文件存儲(chǔ)的一種假設(shè),也該揭開(kāi)謎底的時(shí)候了。上面的思想其實(shí)就是fat文件系統(tǒng)的思想的精髓(但并不是,尤其像具體的參數(shù)的意義與我們所舉的例子是完全不同的。請(qǐng)忘掉上邊細(xì)節(jié),努力記憶下邊)。
單擊此處查看PDF版全文
FAT文件系統(tǒng)原理(四)---北亞數(shù)據(jù)恢復(fù)服務(wù)中心 4006-505-808 ?
http://www.raid-recovery.org/Article/sjhfdoc/200404/4.html
FAT文件系統(tǒng)原理(四) ? 更新時(shí)間:2004-4-20 【字體:小?大】
★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è)備中,FAT16簡(jiǎn)單來(lái)講由圖4.3.11所示的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ò)的例子一樣,FAT將磁盤空間按一定數(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??(單擊此處查看PDF版全文)
圖4.3.11 Fat16的組織形式 引導(dǎo)扇區(qū) FAT1 FAT2(重復(fù)的) 根文件夾 其他文件夾及所有文件 剩余扇區(qū) 1扇區(qū) 實(shí)際情況取大小 同F(xiàn)AT1 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,FAT12是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é)果寫入DBR的相關(guān)位置。 ????FAT16?DBR參數(shù)的偏移0x11處記錄了根目錄所占扇區(qū)的數(shù)目。偏移0x16記錄了FAT表所占扇區(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位)。所以,FAT16最大可以表示的簇號(hào)為0xFFFF(十進(jìn)制的65535),以32K為簇的大小的話,FAT32可以管理的最大磁盤空間為: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é)束簇
???? 看一幅在winhex所截FAT16的文件分配表,圖10:
??? ?? 如圖,FAT表以"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簇指向,上面寫的數(shù)據(jù)是"FF FF",意即此文件已至尾簇。 ?? 第4簇中存放的數(shù)據(jù)是0x0006,這又是一個(gè)文件或文件夾的首簇。其內(nèi)容為第6簇,就是說(shuō)接下來(lái)的簇位于第6簇——〉FAT表指引我們到達(dá)FAT表的第6簇指向,上面寫的數(shù)據(jù)是0x0007,就是說(shuō)接下來(lái)的簇位于第7簇——〉FAT表指引我們到達(dá)FAT表的第7簇指向……直到根據(jù)FAT鏈讀取到扇區(qū)相對(duì)偏移0x1A~0x1B,也就是第13簇,上面寫的數(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)讀寫對(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)處理,FAT32甚至將根目錄當(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(讀寫) 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)度
????對(duì)圖10中的一些取值進(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ì)作解釋。
★FAT32存儲(chǔ)原理: ????FAT32是個(gè)非常有功勞的文件系統(tǒng),Microsoft成功地設(shè)計(jì)并運(yùn)用了它,直到今天NTFS鋪天蓋地襲來(lái)的時(shí)候,FAT32依然占據(jù)著Microsoft Windows文件系統(tǒng)中重要的地位。FAT32最早是出于FAT16不支持大分區(qū)、單位簇容量大以致空間急劇浪費(fèi)等缺點(diǎn)設(shè)計(jì)的。實(shí)際應(yīng)用中,FAT32還是成功的。 ????FAT32與FAT16的原理基本上是相同的,圖4.3.12標(biāo)出了FAT32分區(qū)的基本構(gòu)成。
圖4.3.12 Fat32的組織形式 引導(dǎo)扇區(qū) 其余保留扇區(qū) FAT1 FAT2(重復(fù)的) 根文件夾首簇 其他文件夾及所有文件 剩余扇區(qū) 1扇區(qū) 31個(gè)扇區(qū) 實(shí)際情況取大小 同F(xiàn)AT1 第2簇 不足一簇 保留扇區(qū) ┗━━━━━━━━數(shù)據(jù)區(qū)━━━━━━━━┛
????FAT32在格式化的過(guò)程中就根據(jù)分區(qū)的特點(diǎn)構(gòu)建好了它的DBR,其中BPB參數(shù)是很重要的,可以回過(guò)頭來(lái)看一下表4和表5。首先FAT32保留扇區(qū)的數(shù)目默認(rèn)為32個(gè),而不是FAT16的僅僅一個(gè)。這樣的好處是有助于磁盤DBR指令的長(zhǎng)度擴(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位,故而這種文件系統(tǒng)稱為FAT32。32位二進(jìn)制位的簇鏈決定了FAT表最大可以尋址2T個(gè)簇。這樣即使簇的大小為1扇區(qū),理論上仍然能夠?qū)ぶ?TB范圍內(nèi)的分區(qū)。但實(shí)際中FAT32是不能尋址這樣大的空間的,隨著分區(qū)空間大小的增加,FAT表的記錄數(shù)會(huì)變得臃腫不堪,嚴(yán)重影響系統(tǒng)的性能。所以在實(shí)際中通常不格式化超過(guò)32GB的FAT32分區(qū)。WIN2000及之上的OS已經(jīng)不直接支持對(duì)超過(guò)32GB的分區(qū)格式化成FAT32,但WIN98依然可以格式化大到127GB的FAT32分區(qū),但這樣沒(méi)必要也不推薦。同時(shí)FAT32也有小的限制,FAT32卷必須至少有65527個(gè)簇,所以對(duì)于小的分區(qū),仍然需要使用FAT16或FAT12。 ??? 分區(qū)變大時(shí),如果簇很小,文件分配表也隨之變大。仍然會(huì)有上面的效率問(wèn)題存在。既要有效地讀寫大文件,又要最大可能的減少空間的浪費(fèi)。FAT32同樣規(guī)定了相應(yīng)的分區(qū)空間對(duì)應(yīng)的簇的大小,見(jiàn)表12:
表12??FAT32分區(qū)大小與對(duì)因簇大小 分區(qū)空間大小 每個(gè)簇的扇區(qū) 簇空間大小 <8GB 8 4k >=8GB且<16GB 16 8k >=16GB且<32GB 32 16k >=32GB 64 32k
??? 簇的取值意義和FAT16類似,不過(guò)是位數(shù)長(zhǎng)了點(diǎn)罷了,比較見(jiàn)表13:
表13?FAT各系統(tǒng)記錄項(xiàng)的取值含義(16進(jìn)制) FAT12記錄項(xiàng)的取值 FAT16記錄項(xiàng)的取值 FAT32記錄項(xiàng)的取值 對(duì)應(yīng)簇的表現(xiàn)情況 000 0000 00000000 未分配的簇 002~FFF 0002~FFEF 00000002~FFFFFFEF 已分配的簇 FF0~FF6 FFF0~FFF6 FFFFFFF0~FFFFFFF6 系統(tǒng)保留 FF7 FFF7 FFFFFFF7 壞簇 FF8~FFF FFF8~FFFF FFFFFFF8~FFFFFFFF 文件結(jié)束簇
????FAT32的另一項(xiàng)重大改革是根目錄的文件化,即將根目錄等同于普通的文件。這樣根目錄便沒(méi)有了FAT16中512個(gè)目錄項(xiàng)的限制,不夠用的時(shí)候增加簇鏈,分配空簇即可。而且,根目錄的位置也不再硬性地固定了,可以存儲(chǔ)在分區(qū)內(nèi)可尋址的任意簇內(nèi),不過(guò)通常根目錄是最早建立的(格式化就生成了)目錄表。所以,我們看到的情況基本上都是根目錄首簇占簇區(qū)順序上的第1個(gè)簇。在圖4.3.12中也是按這種情況制作的畫的。 ????FAT32對(duì)簇的編號(hào)依然同F(xiàn)AT16。順序上第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í)又完全支持長(zhǎng)文件名了。 ??? 對(duì)于短文件格式的目錄項(xiàng)。其參數(shù)意義見(jiàn)表14:
表14???FAT32短文件目錄項(xiàng)32個(gè)字節(jié)的表示定義 字節(jié)偏移(16進(jìn)制) 字節(jié)數(shù) 定義 0x0~0x7 8 文件名 0x8~0xA 3 擴(kuò)展名 0xB* 1 屬性字節(jié) 00000000(讀寫) 00000001(只讀) 00000010(隱藏) 00000100(系統(tǒng)) 00001000(卷標(biāo)) ? 00010000(子目錄) 00100000(歸檔) 0xC 1 系統(tǒng)保留 0xD 1 創(chuàng)建時(shí)間的10毫秒位 0xE~0xF 2 文件創(chuàng)建時(shí)間 0x10~0x11 2 文件創(chuàng)建日期 0x12~0x13 2 文件最后訪問(wèn)日期 0x14~0x15 2 文件起始簇號(hào)的高16位 0x16~0x17 2 文件的最近修改時(shí)間 0x18~0x19 2 文件的最近修改日期 0x1A~0x1B 2 文件起始簇號(hào)的低16位 0x1C~0x1F 4 表示文件的長(zhǎng)度
????? * 此字段在短文件目錄項(xiàng)中不可取值0FH,如果設(shè)值為0FH,目錄段為長(zhǎng)文件名目錄段
說(shuō)明: ??? (1)、這是FAT32短文件格式目錄項(xiàng)的意義。其中文件名、擴(kuò)展名、時(shí)間、日期的算法和FAT16時(shí)相同的。 ??? (2)、由于FAT32可尋址的簇號(hào)到了32位二進(jìn)制數(shù)。所以系統(tǒng)在記錄文件(文件夾)開(kāi)始簇地址的時(shí)候也需要32位來(lái)記錄,FAT32啟用目錄項(xiàng)偏移0x12~0x13來(lái)表示起始簇號(hào)的高16位。 ??? (3)、文件長(zhǎng)度依然用4個(gè)字節(jié)表示,這說(shuō)明FAT32依然只支持小于4GB的文件(目錄),超過(guò)4GB的文件(目錄),系統(tǒng)會(huì)截?cái)嗵幚怼?/p>
????FAT32的一個(gè)重要的特點(diǎn)是完全支持長(zhǎng)文件名。長(zhǎng)文件名依然是記錄在目錄項(xiàng)中的。為了低版本的OS或程序能正確讀取長(zhǎng)文件名文件,系統(tǒng)自動(dòng)為所有長(zhǎng)文件名文件創(chuàng)建了一個(gè)對(duì)應(yīng)的短文件名,使對(duì)應(yīng)數(shù)據(jù)既可以用長(zhǎng)文件名尋址,也可以用短文件名尋址。不支持長(zhǎng)文件名的OS或程序會(huì)忽略它認(rèn)為不合法的長(zhǎng)文件名字段,而支持長(zhǎng)文件名的OS或程序則會(huì)以長(zhǎng)文件名為顯式項(xiàng)來(lái)記錄和編輯,并隱藏起短文件名。 ??? 當(dāng)創(chuàng)建一個(gè)長(zhǎng)文件名文件時(shí),系統(tǒng)會(huì)自動(dòng)加上對(duì)應(yīng)的短文件名,其一般有的原則: ??? (1)、取長(zhǎng)文件名的前6個(gè)字符加上"~1"形成短文件名,擴(kuò)展名不變。 ??? (2)、如果已存在這個(gè)文件名,則符號(hào)"~"后的數(shù)字遞增,直到5。 ??? (3)、如果文件名中"~"后面的數(shù)字達(dá)到5,則短文件名只使用長(zhǎng)文件名的前兩個(gè)字母。通過(guò)數(shù)學(xué)操縱長(zhǎng)文件名的剩余字母生成短文件名的后四個(gè)字母,然后加后綴"~1"直到最后(如果有必要,或是其他數(shù)字以避免重復(fù)的文件名)。 ??? (4)、如果存在老OS或程序無(wú)法讀取的字符,換以"_"
??? 長(zhǎng)文件名的實(shí)現(xiàn)有賴于目錄項(xiàng)偏移為0xB的屬性字節(jié),當(dāng)此字節(jié)的屬性為:只讀、隱藏、系統(tǒng)、卷標(biāo),即其值為0FH時(shí),DOS和WIN32會(huì)認(rèn)為其不合法而忽略其存在。這正是長(zhǎng)文件名存在的依據(jù)。將目錄項(xiàng)的0xB置為0F,其他就任由系統(tǒng)定義了,Windows9x或Windows 2000、XP通常支持不超過(guò)255個(gè)字符的長(zhǎng)文件名。系統(tǒng)將長(zhǎng)文件名以13個(gè)字符為單位進(jìn)行切割,每一組占據(jù)一個(gè)目錄項(xiàng)。所以可能一個(gè)文件需要多個(gè)目錄項(xiàng),這時(shí)長(zhǎng)文件名的各個(gè)目錄項(xiàng)按倒序排列在目錄表中,以防與其他文件名混淆。 ??? 長(zhǎng)文件名中的字符采用unicode形式編碼(一個(gè)巨大的進(jìn)步哦),每個(gè)字符占據(jù)2字節(jié)的空間。其目錄項(xiàng)定義如表15。
表15???FAT32長(zhǎng)文件目錄項(xiàng)32個(gè)字節(jié)的表示定義 字節(jié)偏移 (16進(jìn)制) 字節(jié)數(shù) 定義 0x0 1 屬性字節(jié)位意義 7 保留未用 6 1表示長(zhǎng)文件最后一個(gè)目錄項(xiàng) 5 保留未用 4 順序號(hào)數(shù)值 3 2 1 0 0x1~0xA 10 長(zhǎng)文件名unicode碼① 0xB 1 長(zhǎng)文件名目錄項(xiàng)標(biāo)志,取值0FH 0xC 1 系統(tǒng)保留 0xD 1 校驗(yàn)值(根據(jù)短文件名計(jì)算得出) 0xE ~0x19 12 長(zhǎng)文件名unicode碼② 0x1A~0x1B 2 文件起始簇號(hào)(目前常置0) 0x1C~0x1F 4 長(zhǎng)文件名unicode碼③
?? ??系統(tǒng)在存儲(chǔ)長(zhǎng)文件名時(shí),總是先按倒序填充長(zhǎng)文件名目錄項(xiàng),然后緊跟其對(duì)應(yīng)的短文件名。從表15可以看出,長(zhǎng)文件名中并不存儲(chǔ)對(duì)應(yīng)文件的文件開(kāi)始簇、文件大小、各種時(shí)間和日期屬性。文件的這些屬性還是存放在短文件名目錄項(xiàng)中,一個(gè)長(zhǎng)文件名總是和其相應(yīng)的短文件名一一對(duì)應(yīng),短文件名沒(méi)有了長(zhǎng)文件名還可以讀,但長(zhǎng)文件名如果沒(méi)有對(duì)應(yīng)的短文件名,不管什么系統(tǒng)都將忽略其存在。所以短文件名是至關(guān)重要的。在不支持長(zhǎng)文件名的環(huán)境中對(duì)短文件名中的文件名和擴(kuò)展名字段作更改(包括刪除,因?yàn)閯h除是對(duì)首字符改寫E5H),都會(huì)使長(zhǎng)文件名形同虛設(shè)。長(zhǎng)文件名和短文件名之間的聯(lián)系光靠他們之間的位置關(guān)系維系顯然遠(yuǎn)遠(yuǎn)不夠。其實(shí),長(zhǎng)文件名的0xD字節(jié)的校驗(yàn)和起很重要的作用,此校驗(yàn)和是用短文件名的11個(gè)字符通過(guò)一種運(yùn)算方式來(lái)得到的。系統(tǒng)根據(jù)相應(yīng)的算法來(lái)確定相應(yīng)的長(zhǎng)文件名和短文件名是否匹配。這個(gè)算法不太容易用公式說(shuō)明,我們用一段c程序來(lái)加以說(shuō)明。 ??? 假設(shè)文件名11個(gè)字符組成字符串shortname[],校驗(yàn)和用chknum表示。得到過(guò)程如下:
??? int i,j,chknum=0; ??? for (i=11; i>0; i--) ??????? chksum = ((chksum & 1) ? 0x80 : 0) + (chksum >> 1) + shortname[j++];
??? 如果通過(guò)短文件名計(jì)算出來(lái)的校驗(yàn)和與長(zhǎng)文件名中的0xD偏移處數(shù)據(jù)不相等。系統(tǒng)無(wú)論如何都不會(huì)將它們配對(duì)的。 ??? 依據(jù)長(zhǎng)文件名和短文件名對(duì)目錄項(xiàng)的定義,加上對(duì)簇的編號(hào)和鏈接,FAT32上數(shù)據(jù)的讀取便游刃有余了。
五、結(jié)束。
本文出自數(shù)據(jù)恢復(fù)網(wǎng)(www.sjhf.net),疏漏在所難免,希望指正。若需轉(zhuǎn)載請(qǐng)保留此信息;若需修改,請(qǐng)用以下方式與作者取得聯(lián)系 ??? 1、http://www.sjhf.net ??? 2、zymail@vip.sina.com ??? 3、sjhf@sjhf.net
單擊此處查看PDF版全文
FAT32文件系統(tǒng)的存儲(chǔ)組織結(jié)構(gòu)(一)-曾德標(biāo)-ChinaUnix博客 ?
http://blog.chinaunix.net/uid-26913704-id-3213948.html
FAT32文件系統(tǒng)的存儲(chǔ)組織結(jié)構(gòu)(一)?
2012-05-19 16:57:56
分類:?WINDOWS
???? 對(duì)磁盤的物理結(jié)構(gòu),邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu)有了比較深入的了解后,我們來(lái)仔細(xì)探討FAT32文件系統(tǒng)的存儲(chǔ)組織結(jié)構(gòu)。說(shuō)到文件系統(tǒng)的組織結(jié)構(gòu),我們應(yīng)該馬上意識(shí)到,這指的是文件系統(tǒng)在同一個(gè)分區(qū)內(nèi)的組織結(jié)構(gòu),在這個(gè)話題上,我們完全可以不管分區(qū)之外的所有事情。
???? 為了分析FAT32文件系統(tǒng)的存儲(chǔ)組織結(jié)構(gòu),我們來(lái)建立一個(gè)實(shí)實(shí)在在的文件系統(tǒng):將U盤插入電腦,將U盤格式化成FAT32分區(qū)格式:
以建好的U盤FAT32文件系統(tǒng)為基礎(chǔ),下面從文件系統(tǒng)的各個(gè)組成來(lái)分別加以介紹。
分區(qū)引導(dǎo)扇區(qū)DBR
用winhex打開(kāi)U盤顯示如下:
這是FAT32分區(qū)引導(dǎo)記錄 ,定義如下:
偏移00H: 3字節(jié)的 跳轉(zhuǎn)指令? EB 58 90,跳過(guò)下面的BPB和擴(kuò)展BPB部分
偏移03H:8字節(jié)的硬盤分區(qū)類型文本字符名:4D 53 44 4F 53 35 2E 30 即: MSDOS5.0
偏移0BH: 25字節(jié)的分區(qū)參數(shù)塊(BPB),細(xì)分如下:
偏移0BH:扇區(qū)字節(jié)數(shù)???? 00 02 即0X0200,512字節(jié)
偏移0DH:每簇扇區(qū)數(shù)??? 08即每簇包括8個(gè)扇區(qū)
偏移0EH:保留扇區(qū)數(shù)??? 24 00即保留36個(gè)扇區(qū)
偏移10H:FAT表份數(shù)??? 02即兩個(gè)FAT表
偏移11H:未用???????? 00 00
偏移13H:未用???????? 00 00
偏移15H:介質(zhì)類型? F8即本地硬盤
偏移16H:未用???????? 00 00
偏移18H:每磁道扇區(qū)數(shù)?? 3F 00 即每磁道63扇區(qū)?
偏移1AH:磁頭數(shù)???? FF 00即255個(gè)磁頭
偏移1CH:隱藏扇區(qū)數(shù)??? 80 1F即8064個(gè)隱藏扇區(qū)
偏移20H:磁盤總扇區(qū)數(shù) 80 F0 77 00即總共7860352個(gè)扇區(qū)(7860352*512=4024500224,因?yàn)槲业腢盤是4G)
偏移24H:52字節(jié)的擴(kuò)展分區(qū)參數(shù)塊(擴(kuò)展BPB),細(xì)分如下:
偏移24H:FAT表占用扇區(qū)數(shù)? EE 1D? 00 00即FAT表占7662個(gè)扇區(qū)
偏移28H:未用? 00 00 00 00
偏移2CH:根目錄入口簇號(hào) 02 00 00 00即根目錄從02號(hào)簇開(kāi)始
偏移30H:文件系統(tǒng)信息扇區(qū)號(hào)? 01 00即扇區(qū)1
偏移32H:備份引導(dǎo)扇區(qū)的位置 06 00即6號(hào)扇區(qū)(第7個(gè)扇區(qū)),從WINHEX中我們也可以看到,6號(hào)扇區(qū)的內(nèi)容和0號(hào)引導(dǎo)扇區(qū)內(nèi)容???? 是 一樣的
偏移34H:未用???????? 00 00 00 00 00 00 00 00 00 00 00 00
偏移40H:物理磁盤號(hào)? 00
偏移41H:未用? 00
偏移42H:擴(kuò)展引導(dǎo)標(biāo)志 29即0X29
偏移43H:磁盤序列號(hào)F1 2A 27 04通常為一隨機(jī)數(shù)
偏移47H:卷標(biāo)ASCII 4E 4F 20 4E 41 4D 45 20 20 20 20 即NO NAME
偏移52H:文件系統(tǒng)格式ASCII? 46 41 54 33 32 20 20 20即FAT32
偏移5AH:分區(qū)引導(dǎo)代碼 420字節(jié):
????????????????????? 33C98ED1BCF47B8EC18ED9BD007C884E028A5640B408CD137305B9FFFF8AF166
????????????????????? 0FB6C640660FB6D180E23FF7E286CDC0ED0641660FB7C966F7E1668946F8837E1
????????????????????? 6007538837E2A007732668B461C6683C00CBB0080B90100E82B00E94803A0FA7DB
????????????????????? 47D8BF0AC84C074173CFF7409B40EBB0700CD10EBEEA0FB7DEBE5A0F97DEBE0
????????????????????? 98CD16CD196660663B46F80F824A00666A0066500653666810000100807E02000F8
????????????????????? 52000B441BBAA558A5640CD130F821C0081FB55AA0F851400F6C1010F840D00FE4
????????????????????? 602B4428A56408BF4CD13B0F96658665866586658EB2A6633D2660FB74E1866F7F1
????????????????????? FEC28ACA668BD066C1EA10F7761A86D68A56408AE8C0E4060ACCB80102CD13666
????????????????????? 10F8254FF81C300026640490F8571FFC34E544C445220202020202000000000000000
????????????????????? 00000000000000000000000000000000000000000000000000000000000000000000000
????????????????????? 00000000000000D0A52656D6F7665206469736B73206F72206F74686572206D656469
????????????????????? 612EFF0D0A4469736B206572726F72FF0D0A507265737320616E79206B657920746F2
????????????????????? 0726573746172740D0A0000000000ACCBD80000
偏移1FEH:有效扇區(qū)結(jié)束標(biāo)志 55 AA
到此分區(qū)引導(dǎo)扇區(qū)介紹結(jié)束。
文件分配表FAT
簡(jiǎn)介:
???? FAT表(文件分配表),是FAT文件系統(tǒng)中用于磁盤數(shù)據(jù)索引和定位而引進(jìn)的一種鏈?zhǔn)浇Y(jié)構(gòu)。在FAT文件系統(tǒng)中,文件的存儲(chǔ)依照FAT表制定的簇鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)來(lái)進(jìn)行。同時(shí),FAT文件系統(tǒng)將組織數(shù)據(jù)時(shí)使用的目錄也抽象為文件,以簡(jiǎn)化對(duì)數(shù)據(jù)的管理。
FAT1表位置的定位:
???? 在我們前面介紹分區(qū)引導(dǎo)記錄的時(shí)候提到,在偏移0EH處存儲(chǔ)了保留扇區(qū)的個(gè)數(shù),這個(gè)保留扇區(qū)數(shù)指的就是當(dāng)前分區(qū)內(nèi)DBR到FAT表之間的所有扇區(qū)的個(gè)數(shù)(包括DBR但不包括FAT表)。因此,我們可以定位FAT表所在的起始偏移位置了,即24H*200H=4800H。我們貼出4800H處得部分內(nèi)容如下:
???? 顯然沒(méi)有錯(cuò),這就是我們FAT1所存儲(chǔ)的位置,只是當(dāng)前沒(méi)有存儲(chǔ)文件,所以FAT比較簡(jiǎn)單罷了。
FAT2表位置的定位:
???? 在我們前面介紹分區(qū)引導(dǎo)記錄的時(shí)候提到,在偏移24H處存儲(chǔ)了FAT表所占用的扇區(qū)個(gè)數(shù),我們又知道FAT2是緊鄰FAT1的,所以可以很容易得到FAT2的存儲(chǔ)位置的偏移地址:FAT1的起始偏移地址+FAT1的大小=4800H+1DEEH*200H=3C2400H,我們貼出3C2400H處的部分內(nèi)容如下:
????? 顯然沒(méi)有錯(cuò),這就是我們FAT2所存儲(chǔ)的位置,內(nèi)容與FAT1相同。
FAT表的特性:
???? FAT表由一系列大小相等的FAT表項(xiàng)組成,它有如下特性:? ???? FAT32中每個(gè)簇的簇地址,使用32bit(4個(gè)字節(jié))記錄在FAT表中。FAT表中的所有字節(jié)位置以4個(gè)字節(jié)為單位進(jìn)行劃分,并對(duì)所有劃分后的位置由0進(jìn)行地址編號(hào)。0 號(hào)地址與1號(hào)地址被系統(tǒng)保留并存儲(chǔ)特殊標(biāo)志內(nèi)容。從2號(hào)地址開(kāi)始,每個(gè)地址對(duì)應(yīng)于數(shù)據(jù)區(qū)的簇號(hào),FAT表中的地址編號(hào)與數(shù)據(jù)區(qū)中的簇號(hào)相同。我們稱FAT中的這些地址為FAT表項(xiàng),FAT表項(xiàng)中記錄的值稱為FAT表項(xiàng)值。? ???? 當(dāng)文件系統(tǒng)被創(chuàng)建,也就是進(jìn)行格式化操作時(shí),分配給FAT區(qū)域的空間將會(huì)被清空,在FAT1與FAT2的0號(hào)表項(xiàng)與1號(hào)表項(xiàng)寫入特定值。由于創(chuàng)建文件系統(tǒng)的同時(shí)也會(huì)創(chuàng)建根目錄,也就是為根目錄分配了一個(gè)簇空間,通常為2號(hào)簇,所以2號(hào)簇所對(duì)應(yīng)的2號(hào)FAT表項(xiàng)也會(huì)被寫入一個(gè)結(jié)束標(biāo)記。? ???? 如果某個(gè)簇未被分配使用,它所對(duì)應(yīng)的FAT表項(xiàng)內(nèi)的FAT表項(xiàng)值即用0進(jìn)行填充,表示該FAT表項(xiàng)所對(duì)應(yīng)的簇未分配使用。? ???? 當(dāng)某個(gè)簇已被分配使用時(shí),則它對(duì)應(yīng)的FAT表項(xiàng)值也就是該文件的下一個(gè)存儲(chǔ)位置的簇號(hào)。如果該文件結(jié)束于該簇,則在它的FAT表項(xiàng)中記錄的是一個(gè)文件結(jié)束標(biāo)記,對(duì)于FAT32而言,代表文件結(jié)束的FAT表項(xiàng)值為0x0FFFFFFF。 (guyue:實(shí)際測(cè)試文件結(jié)束符是FF FF FF 0F ) ???? 如果某個(gè)簇存在壞扇區(qū),則整個(gè)簇會(huì)用FAT表項(xiàng)值0x0FFFFFF7標(biāo)記為壞簇,不再使用,這個(gè)壞簇標(biāo)記就記錄在它所對(duì)應(yīng)的FAT表項(xiàng)中。? ???? 由于簇號(hào)起始于2,所以FAT表的0號(hào)表項(xiàng)與1號(hào)表項(xiàng)不與任何簇對(duì)應(yīng)。FAT32的0號(hào)表項(xiàng)值總是“F8FFFF0F”。1號(hào)表項(xiàng)可能被用于記錄臟標(biāo)志,以說(shuō)明文件系統(tǒng)沒(méi)有被正常卸載或者磁盤表面存在錯(cuò)誤。不過(guò)此值似乎并不重要,因此我們只要了解就可以。正常情況下,1號(hào)表項(xiàng)值為“FFFFFFFF”或“FFFFFF0F"。? ???? 在文件系統(tǒng)中新建文件時(shí),如果新建的文件只占用一個(gè)簇,為其分配的簇所對(duì)應(yīng)的FAT表項(xiàng)將會(huì)被寫入結(jié)束標(biāo)記。如果新建的文件不只占用一個(gè)簇,則在其所占用的每個(gè)簇對(duì)應(yīng)的FAT表項(xiàng)中寫入為其分配的下一簇的簇號(hào),在最后一個(gè)簇對(duì)應(yīng)的FAT表項(xiàng)中寫入結(jié)束標(biāo)記。? ???? 新建目錄時(shí),只為其分配一個(gè)簇的空間,對(duì)應(yīng)的FAT表項(xiàng)中寫入結(jié)束標(biāo)記。當(dāng)目錄增大超出一個(gè)簇的大小時(shí),將會(huì)在空閑空間中繼續(xù)為其分配一個(gè)簇,并在FAT表中為其建立FAT表鏈以描述它所占用的簇情況。? ???? 對(duì)文件或目錄進(jìn)行刪除操作時(shí),它們所對(duì)應(yīng)的FAT表項(xiàng)將會(huì)被清空,設(shè)置為0以表示其所對(duì)應(yīng)的簇處于未分配狀態(tài)。
根目錄區(qū)
簡(jiǎn)介:
????? 在FAT32文件系統(tǒng)中,根目錄的位置不再硬性地固定,可以存儲(chǔ)在分區(qū)內(nèi)可尋址的任意簇內(nèi),不過(guò)通常根目錄是最早建立的(格式化就生成了)目錄表。所以,我們看到的情況基本上都是根目錄首簇緊鄰FAT2,占簇區(qū)順序上的第1個(gè)簇(即2號(hào)簇)。同時(shí),FAT32文件系統(tǒng)將根目錄當(dāng)做普通的數(shù)據(jù)文件來(lái)看,所有沒(méi)有了目錄項(xiàng)數(shù)的限制,在需要的時(shí)候可以分配空簇,存儲(chǔ)更多的目錄項(xiàng)。
起始偏移地址定位:
???? 根目錄起始扇區(qū)=保留扇區(qū)數(shù)+FAT×2+(起始簇-2)x每簇的扇區(qū)數(shù),在我們前面介紹分區(qū)引導(dǎo)記錄的時(shí)候提到,偏移2CH處保存了根目錄起始簇號(hào)是2,所以求得根目錄起始扇區(qū)是24H+1DEEH*2H+(2-2)*8H=3C00H,即求得偏移地址3C00H*200H=780000H,我們貼出780000H處的部分內(nèi)容如下:
???? 目錄區(qū)的一個(gè)目錄項(xiàng)占用32個(gè)字節(jié),可以是長(zhǎng)文件名目錄項(xiàng)、文件目錄項(xiàng)、子目錄項(xiàng)等。
????????????????????????????????????????? 短文件名格式的目錄項(xiàng)??
?? 對(duì)于短文件名格式的目錄項(xiàng)。其參數(shù)意義如下:
?? 根據(jù)參數(shù)定義,我們來(lái)分析一下上圖的目錄項(xiàng) 54 45 53 54 5F 46 41 54 33 32 20 08 00 00 00 00 00 00 00 00 00 00 19 95 10 3F 00 00 00 00 00 00。其中起始11字節(jié)54 45 53 54 5F 46 41 54 33 32 20 是卷標(biāo)TEST_FAT32;第12字節(jié)08指示當(dāng)前目錄項(xiàng)保存的是卷標(biāo);第23-24字節(jié)19 95即9519H,是最近修改時(shí)間:19點(diǎn)40分50秒;第25-26字節(jié)10 3F即3F10H,是最近修改日期:2011年8月16日;
?????????????????????????????????????????????? 長(zhǎng)文件名格式的目錄項(xiàng)
FAT32的一個(gè)重要的特點(diǎn)是完全支持長(zhǎng)文件名。長(zhǎng)文件名依然是記錄在目錄項(xiàng)中的。為了低版本的OS或程序能正確讀取長(zhǎng)文件名文件,系統(tǒng)自動(dòng)為所有長(zhǎng)文件名文件創(chuàng)建了一個(gè)對(duì)應(yīng)的短文件名,使對(duì)應(yīng)數(shù)據(jù)既可以用長(zhǎng)文件名尋址,也可以用短文件名尋址。不支持長(zhǎng)文件名的OS或程序會(huì)忽略它認(rèn)為不合法的長(zhǎng)文件名字段,而支持長(zhǎng)文件名的OS或程序則會(huì)以長(zhǎng)文件名為顯式項(xiàng)來(lái)記錄和編輯,并隱藏起短文件名。
?? 當(dāng)創(chuàng)建一個(gè)長(zhǎng)文件名文件時(shí),系統(tǒng)會(huì)自動(dòng)加上對(duì)應(yīng)的短文件名,其原則如下:? ???? (1)、取長(zhǎng)文件名的前6個(gè)字符加上"~1"形成短文件名,擴(kuò)展名不變。? ???? (2)、如果已存在這個(gè)文件名,則符號(hào)"~"后的數(shù)字遞增,直到5。? 長(zhǎng)文件名的實(shí)現(xiàn)有賴于目錄項(xiàng)第12字節(jié)屬性字節(jié),當(dāng)此字節(jié)的值為0FH時(shí),支持長(zhǎng)文件名的系統(tǒng)會(huì)將其當(dāng)做長(zhǎng)文件名的依據(jù),而只支持短文件名的系統(tǒng)會(huì)認(rèn)為是異常而忽略掉。系統(tǒng)將長(zhǎng)文件名以13個(gè)字符為單位進(jìn)行切割,每一組占據(jù)一個(gè)目錄項(xiàng)。所以可能一個(gè)文件需要多個(gè)目錄項(xiàng),這時(shí)長(zhǎng)文件名的各個(gè)目錄項(xiàng)按倒序排列在目錄表中,以防與其他文件名混淆。? 長(zhǎng)文件名中的字符采用unicode形式編碼,每個(gè)字符占據(jù)2字節(jié)的空間。其目錄項(xiàng)定義如:
下面是我建立的長(zhǎng)文件名文件夾abcdefghijklmnopqrstuvwxyz1234567890的目錄項(xiàng):
FAT32文件系統(tǒng)的存儲(chǔ)組織結(jié)構(gòu)(二)-曾德標(biāo)-ChinaUnix博客 ?
http://blog.chinaunix.net/uid-26913704-id-3213951.html
FAT32文件系統(tǒng)的存儲(chǔ)組織結(jié)構(gòu)(二)?
2012-05-19 17:40:57
分類:?WINDOWS
?????? 前面已經(jīng)基于一個(gè)格式化的空U盤分析了一下FAT32文件系統(tǒng)存儲(chǔ)的組織結(jié)構(gòu),下面我們從文件操作的角度來(lái)分析一下文件系統(tǒng)的運(yùn)作機(jī)制。由于換了個(gè)U盤,所以仍然貼出剛格式化的空U盤的幾個(gè)重要的數(shù)據(jù)區(qū)如下:
?
我們可以看出,在分區(qū)格式化的時(shí)候,系統(tǒng)將卷標(biāo)TEST_FAT32存儲(chǔ)在2號(hào)簇,即跟目錄區(qū),如上面根目錄貼圖所示。同時(shí),在FDT區(qū)2號(hào)簇標(biāo)記位置寫入了文件結(jié)束符FF FF FF 0F。顯然,FAT32文件系統(tǒng)將目錄當(dāng)做普通文件來(lái)處理的。
下面我們?cè)诟夸浵滦陆ㄒ粋€(gè)文件夾TEST1,看會(huì)有什么變化:
建立了TEST1文件夾后,FDT變成如下:
根目錄變成如下:
重新分配了3號(hào)簇:
從上面的變化可以直觀的看出,系統(tǒng)在新建文件夾時(shí)完成了如下動(dòng)作:
???? a.在父目錄所在簇上建立新的目錄項(xiàng),存儲(chǔ)當(dāng)前所建文件夾信息。
???? b.分配一個(gè)新簇,給新建的文件夾建立兩個(gè)目錄項(xiàng):父目錄和當(dāng)前目錄。
???? c.在FDT表中新分配的簇對(duì)應(yīng)的位置上寫下文件結(jié)束符。
???? d.建立各部分的鏈路關(guān)系:新建文件夾所對(duì)應(yīng)的目錄項(xiàng)的文件起始簇號(hào)字段寫上新分配簇的簇號(hào),新簇上的兩個(gè)目錄項(xiàng)的文件起始簇號(hào)字段分配寫上父目錄所在簇號(hào)(此處是0,本來(lái)我以為是2,即根目錄所在簇,不知道為什么,可能特地用0指示根目錄吧)和當(dāng)前簇號(hào)(此處是3)。
為了驗(yàn)證我們上面分析的正確性,我們?cè)僭赥EST1文件夾下建立新文件夾TEST11,看是否做了如下操作:
????? a.在父目錄(即TEST1)所在簇(即3號(hào)簇)上建立新的目錄項(xiàng),存儲(chǔ)TEST11文件夾信息。
???? b.分配一個(gè)新簇(應(yīng)該是4號(hào)簇),給新建的文件夾(即TEST11)建立兩個(gè)目錄項(xiàng):父目錄和當(dāng)前目錄。
???? c.在FDT表中新分配的簇(應(yīng)該是4號(hào)簇)對(duì)應(yīng)的位置上寫下文件結(jié)束符。
???? d.建立各部分的鏈路關(guān)系:新建文件夾(即TEST11)所對(duì)應(yīng)的目錄項(xiàng)的文件起始簇號(hào)字段寫上新分配簇的簇號(hào)(應(yīng)該是4號(hào)簇),,新簇上的兩個(gè)目錄項(xiàng)的文件起始簇號(hào)字段分配寫上父目錄所在簇號(hào)(3號(hào)簇)和當(dāng)前簇號(hào)(應(yīng)該是4號(hào)簇)。
新建TEST11文件夾后FDT變成:
根目錄沒(méi)有變化:
3號(hào)簇變成:
新分配4號(hào)簇:
顯然我們的估計(jì)沒(méi)有錯(cuò)的,也進(jìn)一步證明我們前面的分析是正確的。
下面我們?cè)俜治鼋⑽募那闆r
我們先建立一個(gè)100字節(jié)的文件TEST.TXT,然后把這個(gè)文件拷貝到U盤的根目錄下,FDT變成如下:
根目錄變成:
新分配5號(hào)簇保存文件內(nèi)容:
從上面的變化可以直觀的看出,系統(tǒng)新建文件和新建文件夾所完成的操作是一樣一樣的:
???? a.在父目錄所在簇上建立新的目錄項(xiàng),存儲(chǔ)當(dāng)前所建文件信息。
???? b.分配一個(gè)新簇,存儲(chǔ)新建的文件的內(nèi)容。
???? c.在FDT表中新分配的簇對(duì)應(yīng)的位置上寫下文件結(jié)束符。
???? d.建立鏈路關(guān)系:新建文件所對(duì)應(yīng)的目錄項(xiàng)的文件起始簇號(hào)字段寫上新分配簇的簇號(hào)。
結(jié)束總結(jié):
????? 1.在FAT32文件系統(tǒng)中,目錄和文件的存儲(chǔ)采用統(tǒng)一的方式。
????? 2.文件系統(tǒng)的操作的單位是簇,每新建立一個(gè)文件或文件夾,至少會(huì)重新分配一個(gè)簇號(hào)。
????? 3.如果一個(gè)文件或目錄的內(nèi)容要多個(gè)簇才能存儲(chǔ)得下,則系統(tǒng)會(huì)分配多個(gè)簇來(lái)存儲(chǔ)文件或目錄的內(nèi)容
????? 4.當(dāng)需要多個(gè)簇時(shí),這些簇可能連續(xù)也可能不連續(xù),但無(wú)論是連續(xù)或是不連續(xù),系統(tǒng)都是采用FDT鏈表的形式來(lái)組織的。
/
文件系統(tǒng)基礎(chǔ)知識(shí)之磁盤-曾德標(biāo)-ChinaUnix博客 ?
http://blog.chinaunix.net/uid-26913704-id-3213957.html
文件系統(tǒng)基礎(chǔ)知識(shí)之磁盤?
2012-05-19 16:33:50
分類:?WINDOWS
?????????????????????????? 磁盤的物理結(jié)構(gòu)
??? 一個(gè)磁盤驅(qū)動(dòng)器兩個(gè)主要的移動(dòng)部件;一個(gè)是磁盤片組合(disk assembly) ,另一個(gè)是磁頭組合(head assembly)。磁盤片組合由一個(gè)或多個(gè)圓盤(platter)組成,它們圍繞著一根中心主軸旋轉(zhuǎn)。圓盤的上表面和下表面涂覆了一薄層磁性材料,二進(jìn)制位被存儲(chǔ)在這些磁性材料上。其中,0和1在磁材料中表現(xiàn)為不同的模式。??????? ??? 磁盤被組織成磁道(track),磁道是單個(gè)盤片上的同心圓。所有盤面上半徑相同的磁道構(gòu)成了柱面(cylinder),從磁盤的頂視圖可以看到,磁道占據(jù)大部分盤面,最靠近主軸的區(qū)域除外。沿著磁道的數(shù)據(jù)密度大于沿著半徑的數(shù)據(jù)密度。在2008年,一個(gè)典型的磁盤上每英寸有大約100 000個(gè)磁道,但是沿著磁道每英寸能夠存儲(chǔ)100萬(wàn)個(gè)二進(jìn)制位。?
??? ??? 磁道被組織成扇區(qū)(sector)。扇區(qū)是被間隙(gap)分割的圓的片段,間隙未被磁化為0或1? ??? 雖然圖片中顯示每一個(gè)磁道有相同的扇區(qū)數(shù),但實(shí)際上,每個(gè)磁道的扇區(qū)數(shù)通常是不同的,靠外圈磁道的扇區(qū)數(shù)比靠?jī)?nèi)圈磁道的扇區(qū)數(shù)多。就讀寫磁盤而論,扇區(qū)是不可分割的單位;就磁盤錯(cuò)誤而論,它也是一個(gè)不可分割的單位。倘若一部分磁化層被以某種方式損壞,以至于它不再能存儲(chǔ)信息,那么那些包含這個(gè)部分的整個(gè)扇區(qū)也不能再使用。間隙大約占整個(gè)磁道的10%,用于幫助標(biāo)識(shí)扇區(qū)的起點(diǎn)。通常,在磁盤與主存之間所傳輸數(shù)據(jù)的邏輯單元稱為塊,其由一個(gè)或多個(gè)扇區(qū)所組成。? ??? 第二個(gè)可移動(dòng)部件是磁頭組合,它承載著磁頭。每一個(gè)盤面有一個(gè)磁頭,它極其貼近地懸浮在盤面上,但是絕對(duì)不與盤面接觸(否則就要發(fā)生“頭損毀”,盤片被破壞)。磁頭讀出經(jīng)過(guò)它下面的盤面的磁方向,也能改變其磁方向,以便在磁盤上寫信息。每個(gè)磁頭被固定在一個(gè)磁頭臂上,所有盤面的磁頭隨著磁頭臂一同移進(jìn)移出,磁頭臂是固定的磁頭組合的一部分。? ??? 很顯然,計(jì)算整個(gè)磁盤的容量的算法是:盤面數(shù)X磁道數(shù)X扇區(qū)數(shù)X扇區(qū)字節(jié)數(shù)
??????????????????????????????? 磁盤的邏輯結(jié)構(gòu)
要組織磁盤上存儲(chǔ)的數(shù)據(jù),使得可以方便的存儲(chǔ)和訪問(wèn),就要實(shí)現(xiàn)數(shù)據(jù)的定位。數(shù)據(jù)的定位主要有兩種方式:CHS地址和LBA線性地址。
CHS地址
??? 早期硬盤存儲(chǔ)空間采用3維地址結(jié)構(gòu)描述:
??? C=Cylinder(柱面。若干盤體重疊,相同的磁道(track上)構(gòu)成的一個(gè)立面體)
??? H=Head(磁頭。一張盤有兩面(side),每面一個(gè)磁頭)
??? S=Sector(扇區(qū)。盤體上的圓形軌跡為磁道,把磁道等分為若干存儲(chǔ)區(qū)域)
??? 磁盤的容量=柱面總數(shù)×磁頭總數(shù)×每道扇區(qū)總數(shù)×每扇區(qū)容量(512byte)
LBA地址
??? LBA是邏輯塊地址的簡(jiǎn)稱,它是一種線性地址結(jié)構(gòu),它其實(shí)是由CHS計(jì)算的扇區(qū)編號(hào)順序編址,即0柱0面1扇區(qū)為L(zhǎng)BA 0扇區(qū)。現(xiàn)在的硬盤廠家為了保持兼容性,仍然提供了虛擬的CHS參數(shù),可在BIOS設(shè)置中看到。對(duì)硬盤的數(shù)據(jù)訪問(wèn)是靠系統(tǒng)調(diào)用INT 13H中斷程序?qū)崿F(xiàn)的,它將欲訪問(wèn)的數(shù)據(jù)地址傳遞給硬盤接口電路(ATA接口)完成讀寫操作。
528MB的限制:早期的硬盤的CHS參數(shù)被限制為:磁頭數(shù)最大16,柱面數(shù)最大1024,扇區(qū)最大63,每扇區(qū)字節(jié)數(shù)為512字節(jié)。因此1024×16×63×512B≈528MB。
8GB容量限制:將柱面數(shù)增加到16384,其他不變,共計(jì)24bit,則硬盤容量最大為:16384×16×63×512B≈8.4GB。
32GB容量限制:硬盤采用了虛擬CHS值,使得柱面數(shù)為65535,其他不變,共計(jì)26bit,這樣,磁盤的總?cè)萘孔畲鬄?#xff1a; 65535×16×63×512B≈32GB。?? 137G? 容量限制:由于普遍使用了LBA尋址模式和虛擬CHS參數(shù),將扇區(qū)數(shù)進(jìn)一步增加為255,共計(jì)28位,將其乘積作為L(zhǎng)BA值。這樣系統(tǒng)使用28位的LBA參數(shù),約計(jì)137GB。
???????????????????????????????????磁盤的存儲(chǔ)結(jié)構(gòu)
??? 剛剛從廠商處購(gòu)來(lái)的新硬盤既無(wú)任何數(shù)據(jù),也不能寫入任何數(shù)據(jù),必須先進(jìn)行低級(jí)格式化,FDISK 分區(qū),FORMAT 高級(jí)格式化后方可使用。對(duì)硬盤的這一系列初始化工作,稱之為硬盤準(zhǔn)備。過(guò)程如下:低級(jí)格式化---------------FDISK 分區(qū)-------------------FORMAT 高級(jí)格式化。? (1)低級(jí)格式化:磁盤為了達(dá)到隨機(jī)存取的目的,需要在磁盤上劃分出磁道,然后又在磁道劃分出扇區(qū),每個(gè)扇區(qū)以扇區(qū)間隙、同步引導(dǎo)字節(jié)和扇區(qū)編號(hào)作為扇區(qū)的起始,然后才是扇區(qū)的內(nèi)容,后面還有校驗(yàn)標(biāo)記。計(jì)算機(jī)就是憑借這些標(biāo)記信息來(lái)識(shí)別扇區(qū)的。低級(jí)格式化就是在磁道上標(biāo)上這些標(biāo)記而已。所以低級(jí)格式化的操作實(shí)際上僅僅是一個(gè)簡(jiǎn)單的寫過(guò)程,寫的不是數(shù)據(jù)而是標(biāo)記。同時(shí)低級(jí)格式化還會(huì)剔出壞磁道。? (2)FDISK分區(qū):允許整個(gè)物理硬盤在邏輯上劃分成最多4個(gè)主分區(qū)(其中可以有一個(gè)擴(kuò)展分區(qū)),以實(shí)現(xiàn)多個(gè)操作系統(tǒng)共享硬盤空間。在建立了擴(kuò)展分區(qū)的前提下,可以將擴(kuò)展分區(qū)劃分成一個(gè)或多個(gè)邏輯分區(qū)。在硬盤上建立分區(qū)表的同時(shí),FDISK 會(huì)把主引導(dǎo)記錄MBR 寫到硬盤的主引導(dǎo)記錄(柱面0,磁頭0,扇區(qū)1),并激活一個(gè)用戶指定的主分區(qū)。下面要特別介紹一下主引導(dǎo)記錄MBR :?? ???? MBR 稱為硬盤主引導(dǎo)記錄。它是在分區(qū)時(shí)由FDISK 建立在硬盤柱面0,磁頭0,扇區(qū)1 上的,總共占用512 個(gè)字節(jié),包括一小段執(zhí)行代碼(主引導(dǎo)代碼)、磁盤特征和硬盤分區(qū)表。主引導(dǎo)記錄(以及后面介紹的引導(dǎo)扇區(qū))結(jié)束的兩個(gè)字節(jié)必須是引導(dǎo)自舉標(biāo)記0x55AA。磁盤特征位于0x01B8, 指定磁盤操作系統(tǒng)。?? ???? 主引導(dǎo)代碼實(shí)現(xiàn)下列功能:?? a. 掃描分區(qū)表查找活動(dòng)分區(qū);? b. 尋找活動(dòng)分區(qū)的起始扇區(qū); c. 將活動(dòng)分區(qū)的引導(dǎo)扇區(qū)讀到內(nèi)存; d. 執(zhí)行引導(dǎo)扇區(qū)的運(yùn)行代碼。 如果主引導(dǎo)代碼未完成這些功能, 系統(tǒng)會(huì)顯示下列的錯(cuò)誤信息之一: Invalid partition table, Error loading operating system, Missing operating system.?? ???? 主引導(dǎo)記錄MBR 由4 個(gè)部分組成:a.主引導(dǎo)程序(偏移地址0000H~0088H),它負(fù)責(zé)從活動(dòng)分區(qū)中裝載并運(yùn)行系統(tǒng)引導(dǎo)程序;b.出錯(cuò)信息數(shù)據(jù)區(qū)(偏移地址0089~00E1 為出錯(cuò)信息,10E2H~10BD 全為0 字節(jié)); c.分區(qū)表(DPT,Disk Partition Table,含4 個(gè)分區(qū)項(xiàng),偏移地址01BEH~01FDH,每個(gè)分區(qū)表項(xiàng)長(zhǎng)16 個(gè)字節(jié),共64 字節(jié)),即主分區(qū)和擴(kuò)展分區(qū)的信息;d.結(jié)束標(biāo)志(偏移地址01EFH~01FFH ),這兩個(gè)字節(jié)值為結(jié)束標(biāo)志55AA,如果該標(biāo)志錯(cuò)誤系統(tǒng)就不能啟動(dòng).?? ???? 注意:硬盤的引導(dǎo)記錄是不屬于任何一個(gè)操作系統(tǒng)的,它先于所有的操作系統(tǒng)而被調(diào)入內(nèi)存并發(fā)揮作用,然后才將控制權(quán)交給主分區(qū)內(nèi)的操作系統(tǒng),并讓主分區(qū)信息表來(lái)管理硬盤。
(3)高級(jí)格式化:?? ???? 這一步之前的所有操作,都是與具體的文件系統(tǒng)沒(méi)有任何關(guān)系的,從現(xiàn)在開(kāi)始,才涉及到具體的文件系統(tǒng),換句話說(shuō),高級(jí)格式化是與我們要建立的文件系統(tǒng)相關(guān)的,因此我們調(diào)用高級(jí)格式化命令時(shí),文件類型是必須提供的參數(shù)之一。
???? 在DOS/WINDOWS系統(tǒng)中,用FORMAT對(duì)指定分區(qū)進(jìn)行高級(jí)格式化,將分區(qū)空間劃分邏輯扇區(qū),生成DOS 引導(dǎo)扇區(qū)(即邏輯0 扇區(qū))DBR,文件分配表FAT 和根文件目錄表FDT。???????? ?????? 在LINUX系統(tǒng)中,需要使用mkfs命令將分區(qū)進(jìn)行格式化,建立想要的文件系統(tǒng),如EXT2,EXT3,等。
經(jīng)過(guò)以上三步后,磁盤的存儲(chǔ)結(jié)構(gòu)看起來(lái)如下圖所示:
總結(jié)
以上是生活随笔 為你收集整理的fat16和fat32文件系统学习 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。