硬盤(pán)的數(shù)據(jù)結(jié)構(gòu)_第1頁(yè)
硬盤(pán)的數(shù)據(jù)結(jié)構(gòu)_第2頁(yè)
硬盤(pán)的數(shù)據(jù)結(jié)構(gòu)_第3頁(yè)
硬盤(pán)的數(shù)據(jù)結(jié)構(gòu)_第4頁(yè)
硬盤(pán)的數(shù)據(jù)結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 硬盤(pán)的數(shù)據(jù)結(jié)構(gòu)在上文中,我們談了數(shù)據(jù)在硬盤(pán)中的存儲(chǔ)的一般原理。為了能更深入的了解硬盤(pán),我們還必須對(duì)硬盤(pán)的數(shù)據(jù)結(jié)構(gòu)有個(gè)簡(jiǎn)單的了解。硬盤(pán)上的數(shù)據(jù)按照其不同的特點(diǎn)和作用大致可分為5部分:MBR區(qū)、DBR區(qū)、FAT區(qū)、DIR區(qū)和DATA區(qū)。我們來(lái)分別介紹一下:(1)MBR區(qū)MBR(Main Boot Record),按其字面上的理解即為主引導(dǎo)記錄區(qū),位于整個(gè)硬盤(pán)的0磁道0柱面1扇區(qū)。不過(guò),在總共512字節(jié)的主引導(dǎo)扇區(qū)中,MBR只占用了其中的446個(gè)字節(jié)(偏移0-偏移1BDH),另外的64個(gè)字節(jié)(偏移1BEH-偏移1FDH)交給了DPT(Disk Partition Table硬盤(pán)分區(qū)表)(見(jiàn)下表),

2、最后兩個(gè)字節(jié)55,AA(偏移1FEH- 偏移1FFH)是分區(qū)的結(jié)束標(biāo)志。這個(gè)整體構(gòu)成了硬盤(pán)的主引導(dǎo)扇區(qū)。大致的結(jié)構(gòu)如圖5: 主引導(dǎo)記錄中包含了硬盤(pán)的一系列參數(shù)和一段引導(dǎo)程序。其中的硬盤(pán)引導(dǎo)程序的主要作用是檢查分區(qū)表是否正確并且在系統(tǒng)硬件完成自檢以后引導(dǎo)具有激活標(biāo)志的分區(qū)上的操作系統(tǒng),并將控制權(quán)交給啟動(dòng)程序。MBR是由分區(qū)程序(如F)所產(chǎn)生的,它不依賴(lài)任何操作系統(tǒng),而且硬盤(pán)引導(dǎo)程序也是可以改變的,從而實(shí)現(xiàn)多系統(tǒng)共存。下面,我們以一個(gè)實(shí)例讓大家更直觀地來(lái)了解主引導(dǎo)記錄:例:80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00在這里我們可以看到,最前面的80

3、是一個(gè)分區(qū)的激活標(biāo)志,表示系統(tǒng)可引導(dǎo);01 01 00表示分區(qū)開(kāi)始的磁頭號(hào)為01,開(kāi)始的扇區(qū)號(hào)為01,開(kāi)始的柱面號(hào)為00;0B表示分區(qū)的系統(tǒng)類(lèi)型是FAT32,其他比較常用的有04(FAT16)、07(NTFS);FE BF FC表示分區(qū)結(jié)束的磁頭號(hào)為254,分區(qū)結(jié)束的扇區(qū)號(hào)為63、分區(qū)結(jié)束的柱面號(hào)為764;3F 00 00 00表示首扇區(qū)的相對(duì)扇區(qū)號(hào)為63;7E 86 BB 00表示總扇區(qū)數(shù)為12289622。(2)DBR區(qū)DBR(Dos Boot Record)是操作系統(tǒng)引導(dǎo)記錄區(qū)的意思。它通常位于硬盤(pán)的0磁道1柱面1扇區(qū),是操作系統(tǒng)可以直接訪問(wèn)的第一個(gè)扇區(qū),它包括一個(gè)引導(dǎo)程序和一個(gè)被稱(chēng)為B

4、PB(Bios Parameter Block)的本分區(qū)參數(shù)記錄表。引導(dǎo)程序的主要任務(wù)是當(dāng)MBR將系統(tǒng)控制權(quán)交給它時(shí),判斷本分區(qū)跟目錄前兩個(gè)文件是不是操作系統(tǒng)的引導(dǎo)文件(以DOS為例,即是Io.sys和Msdos.sys)。如果確定存在,就把其讀入內(nèi)存,并把控制權(quán) 交給該文件。BPB參數(shù)塊記錄著本分區(qū)的起始扇區(qū)、結(jié)束扇區(qū)、文件存儲(chǔ)格式、硬盤(pán)介質(zhì)描述符、根目錄大小、FAT個(gè)數(shù),分配單元的大小等重要參數(shù)。(3)FAT區(qū)在DBR之后的是我們比較熟悉的FAT(File Allocation Table文件分配表)區(qū)。在解釋文件分配表的概念之前,我們先來(lái)談?wù)劥兀╟luster)的概念。文件占用磁盤(pán)空間時(shí)

5、,基本單位不是字節(jié)而是簇。簇的大小與磁盤(pán)的規(guī)格有關(guān),一般情況下,軟盤(pán)每簇是1個(gè)扇區(qū),硬盤(pán)每簇的扇區(qū)數(shù)與硬盤(pán)的總?cè)萘看笮∮嘘P(guān),可能是4、8、16、32、64通過(guò)上文我們已經(jīng)知道,同一個(gè)文件的數(shù)據(jù)并不一定完整地存放在磁盤(pán)的一個(gè)連續(xù)的區(qū)域內(nèi),而往往會(huì)分成若干段,像一條鏈子一樣存放。這種存儲(chǔ)方式稱(chēng)為文件的鏈?zhǔn)酱鎯?chǔ)。(見(jiàn)圖6)硬盤(pán)上的文件常常要進(jìn)行創(chuàng)建、刪除、增長(zhǎng)、縮短等操作。這樣操作做的越多,盤(pán)上的文件就可能被分得越零碎(每段至少是1簇)。但是,由于硬盤(pán)上保存著段與段之間的連接信息(即FAT),操作系統(tǒng)在讀取文件時(shí),總是能夠準(zhǔn)確地找到各段的位置并正確讀出。不過(guò),這種以簇為單位的存儲(chǔ)法也是有其缺陷的。這

6、主要表現(xiàn)在對(duì)空間的利用上。每個(gè)文件的最后一簇都有可能有未被完全利用的空間(稱(chēng)為尾簇空間)。一般來(lái)說(shuō),當(dāng)文件個(gè)數(shù)比較多時(shí),平均每個(gè)文件要浪費(fèi)半個(gè)簇的空間。好了,我們言歸正傳,為了實(shí)現(xiàn)文件的鏈?zhǔn)酱鎯?chǔ),硬盤(pán)上必須準(zhǔn)確地記錄哪些簇已經(jīng)被文件占用,還必須為每個(gè)已經(jīng)占用的簇指明存儲(chǔ)后繼內(nèi)容的下一個(gè)簇的簇號(hào),對(duì)一個(gè)文件的最后一簇,則要指明本簇?zé)o后繼簇。這些都是由FAT表來(lái)保存的,表中有很多表項(xiàng),每項(xiàng)記錄一個(gè)簇的信息。由于FAT對(duì)于文件管理的重要性,所以FAT有一個(gè)備份,即在原FAT的后面再建一個(gè)同樣的FAT。初形成的FAT中所有項(xiàng)都標(biāo)明為未占用,但如果磁盤(pán)有局部損壞,那么格式化程序會(huì)檢測(cè)出損壞的簇,在相應(yīng)的

7、項(xiàng)中標(biāo)為壞簇,以后存文件時(shí)就不會(huì)再使用這個(gè)簇了。FAT的項(xiàng)數(shù)與硬盤(pán)上的總簇?cái)?shù)相當(dāng),每一項(xiàng)占用的字節(jié)數(shù)也要與總簇?cái)?shù)相適應(yīng),因?yàn)槠渲行枰娣糯靥?hào)。FAT的格式有多種,最為常見(jiàn)和為讀者所熟悉的是FAT16和FAT32,其中FAT16是指文件分配表使用16位數(shù)字,由于16位分配表最多能管理65536(即2的16次方)個(gè)簇,也就是所規(guī)定的一個(gè)硬盤(pán)分區(qū)。由于每個(gè)簇的存儲(chǔ)空間最大只有32KB,所以在使用FAT16管理硬盤(pán)時(shí),每個(gè)分區(qū)的最大存儲(chǔ)容量只有(6553632 KB)即2048MB,也就是我們常說(shuō)的2G?,F(xiàn)在的硬盤(pán)容量是越來(lái)越大,由于FAT16對(duì)硬盤(pán)分區(qū)的容量限制,所以當(dāng)硬盤(pán)容量超過(guò)2G之后,用戶(hù)只能

8、將硬盤(pán)劃分成多個(gè)2G的分區(qū)后才能正常使用,為此微軟公司從Windows 95 OSR2版本開(kāi)始使用FAT32標(biāo)準(zhǔn),即使用32位的文件分配表來(lái)管理硬盤(pán)文件,這樣系統(tǒng)就能為文件分配多達(dá)4294967296(即2的32次方)個(gè)簇,所以在簇同樣為32KB時(shí)每個(gè)分區(qū)容量最大可達(dá)65G以上。此外使用FAT32管理硬盤(pán)時(shí),每個(gè)邏輯盤(pán)中的簇長(zhǎng)度也比使用FAT16標(biāo)準(zhǔn)管理的同等容量邏輯盤(pán)小很多。由于文件存儲(chǔ)在硬盤(pán)上占用的磁盤(pán)空間以簇為最小單位,所以某一文件即使只有幾十個(gè)字節(jié)也必須占用整個(gè)簇,因此邏輯盤(pán)的簇單位容量越小越能合理利用存儲(chǔ)空間。所以FAT32更適于大硬盤(pán)。(4)DIR區(qū)DIR(Directory)是根

9、目錄區(qū),緊接著第二FAT表(即備份的FAT表)之后,記錄著根目錄下每個(gè)文件(目錄)的起始單元,文件的屬性等。定位文件位置時(shí),操作系統(tǒng)根據(jù)DIR中的起始單元,結(jié)合FAT表就可以知道文件在硬盤(pán)中的具體位置和大小了。(5)數(shù)據(jù)(DATA)區(qū)數(shù)據(jù)區(qū)是真正意義上的數(shù)據(jù)存儲(chǔ)的地方,位于DIR區(qū)之后,占據(jù)硬盤(pán)上的大部分?jǐn)?shù)據(jù)空間。數(shù)據(jù)在硬盤(pán)上的存儲(chǔ)(創(chuàng)易工作室2001年06月26日 11:37)硬盤(pán)是現(xiàn)在計(jì)算機(jī)上最常用的存儲(chǔ)器。我們都知道,計(jì)算機(jī)之所以神奇,是因?yàn)樗哂懈咚俜治鎏幚頂?shù)據(jù)的能力。而這些數(shù)據(jù)都被以文件的形式存儲(chǔ)在硬盤(pán)里。不過(guò),計(jì)算機(jī)可不像人那么聰明。在讀取相應(yīng)的文件時(shí),你必須要給出它相應(yīng)的規(guī)則。這

10、就是分區(qū)概念的形成。 分區(qū)從實(shí)質(zhì)上說(shuō)就是對(duì)硬盤(pán)的一種格式化。當(dāng)我們創(chuàng)建分區(qū)時(shí),就已經(jīng)設(shè)置好了硬盤(pán)的各項(xiàng)物理參數(shù),指定了硬盤(pán)主引導(dǎo)記錄(即MasterBootRecord,一般簡(jiǎn)稱(chēng)為MBR)和引導(dǎo)記錄備份的存放位置。而對(duì)于文件系統(tǒng)以及其他操作系統(tǒng)管理硬盤(pán)所需要的信息則是通過(guò)之后的高級(jí)格式化,即Format命令來(lái)實(shí)現(xiàn)。硬件分區(qū)后,將會(huì)被劃分為面、磁道和扇區(qū)。需要注意的是,這些只是個(gè)虛擬的概念,并不是真正在硬盤(pán)上劃道子_。先從面說(shuō)起,硬盤(pán)一般是由一片或幾片圓形薄膜疊加而成。我們所說(shuō),每個(gè)圓形薄膜都有兩個(gè)面(Side),這兩個(gè)面都是用來(lái)存儲(chǔ)數(shù)據(jù)的。按照面的多少,依次稱(chēng)為0面、1面、2面由于每個(gè)面都專(zhuān)有

11、一個(gè)讀寫(xiě)磁頭,也常用0頭(head)、1頭稱(chēng)之。按照硬盤(pán)容量和規(guī)格的不同,硬盤(pán)面數(shù)(或頭數(shù))也不一定相同,少的只有2面,多的可達(dá)數(shù)十面。各面上磁道號(hào)相同的磁道合起來(lái),稱(chēng)為一個(gè)柱面(cylinder)(見(jiàn)圖1)。圖1上面我們提到了磁道的概念。那么究竟何為磁道呢?大家都知道,讀寫(xiě)硬盤(pán)時(shí),磁頭依靠磁盤(pán)的高速旋轉(zhuǎn)引起的空氣動(dòng)力效應(yīng)懸浮在盤(pán)面上,與盤(pán)面的距離不到1微米(約為頭發(fā)直徑的百分之一)。由于磁盤(pán)是旋轉(zhuǎn)的,則連續(xù)寫(xiě)入的數(shù)據(jù)是排列在一個(gè)圓周上的。我們稱(chēng)這樣的圓周為一個(gè)磁道(Track)。(見(jiàn)圖2)如果讀寫(xiě)磁頭沿著圓形薄膜的半徑方向移動(dòng)一段距離,以后寫(xiě)入的數(shù)據(jù)又排列在另外一個(gè)磁道上。圖2根據(jù)硬盤(pán)規(guī)格的

12、不同,磁道數(shù)可以從幾百到數(shù)千不等;一個(gè)磁道上可以容納數(shù)KB的數(shù)據(jù),而主機(jī)讀寫(xiě)時(shí)往往并不需要一次讀寫(xiě)那么多,于是,磁道又被劃分成若干段,每段稱(chēng)為一個(gè)扇區(qū)(Sector)。一個(gè)扇區(qū)一般存放512字節(jié)的數(shù)據(jù)。扇區(qū)也需要編號(hào),同一磁道中的扇區(qū),分別稱(chēng)為1扇區(qū),2扇區(qū)。這里需要注意的是,硬盤(pán)在劃分扇區(qū)時(shí),和一般的軟盤(pán)有一定的區(qū)別。軟盤(pán)的一個(gè)磁道中,扇區(qū)號(hào)依次編排,即2號(hào)與1號(hào)相鄰,3號(hào)與2號(hào)相鄰,以此類(lèi)推。而在硬盤(pán)的一個(gè)磁道中,扇區(qū)號(hào)是按照某個(gè)間隔跳躍著編排的。我們舉一個(gè)例子來(lái)說(shuō)明:在某個(gè)硬盤(pán)上,以實(shí)際存儲(chǔ)位置而論,2號(hào)扇區(qū)并不是1號(hào)扇區(qū)后的第一個(gè),而是第5個(gè),3號(hào)扇區(qū)又是2號(hào)扇區(qū)后的第5個(gè),以此類(lèi)推。

13、這個(gè)5就是我們說(shuō)的交叉因子。(見(jiàn)圖3)當(dāng)然,這個(gè)交叉因子的設(shè)定并不是絕對(duì)的,每個(gè)種類(lèi)的硬盤(pán)為根據(jù)自身的情況加以變化。選擇適當(dāng)?shù)慕徊嬉蜃樱墒褂脖P(pán)驅(qū)動(dòng)器讀寫(xiě)扇區(qū)的速度與硬盤(pán)的旋轉(zhuǎn)速度相匹配,提高存儲(chǔ)數(shù)據(jù)的速度。圖3計(jì)算機(jī)對(duì)硬盤(pán)的讀寫(xiě),處于效率的考慮,是以扇區(qū)為基本單位的。即使計(jì)算機(jī)只需要硬盤(pán)上存儲(chǔ)的某個(gè)字節(jié),也必須一次把這個(gè)字節(jié)所在的扇區(qū)中的512字節(jié)全部讀入內(nèi)存,再使用所需的那個(gè)字節(jié)。不過(guò),在上文中我們也提到,硬盤(pán)上面、磁道、扇區(qū)的劃分表面上是看不到任何痕跡的,雖然磁頭可以根據(jù)某個(gè)磁道的應(yīng)有半徑來(lái)對(duì)準(zhǔn)這個(gè)磁道,但怎樣才能在首尾相連的一圈扇區(qū)中找出所需要的某一扇區(qū)呢?原來(lái),每個(gè)扇區(qū)并不僅僅是由5

14、12個(gè)字節(jié)組成的,在這些由計(jì)算機(jī)存取的數(shù)據(jù)的前、后兩端,都另有一些特定的數(shù)據(jù),這些數(shù)據(jù)構(gòu)成了扇區(qū)的界限標(biāo)志,標(biāo)志中含有扇區(qū)的編號(hào)和其他信息。計(jì)算機(jī)就憑借著這些標(biāo)志來(lái)識(shí)別扇區(qū)(見(jiàn)圖4)。 圖4(責(zé)任編輯 Jacky school) 硬盤(pán)數(shù)據(jù)存儲(chǔ)及其相關(guān)系統(tǒng)的原理(勝鷗2001年04月29日 02:13)對(duì)計(jì)算機(jī)用戶(hù)來(lái)說(shuō),硬盤(pán)故障簡(jiǎn)直就是一場(chǎng)災(zāi)難。很多時(shí)候硬盤(pán)里的數(shù)據(jù)比硬盤(pán)本身甚至整臺(tái)電腦更值錢(qián)。如果你沒(méi)有按我上期“備份數(shù)據(jù)、有備無(wú)患”一文中所講經(jīng)常備份你寶貴的數(shù)據(jù),一旦遇到數(shù)據(jù)丟失的災(zāi)難,要恢復(fù)起來(lái)就很難了。但通過(guò)一些軟件和方法,你還是有可能恢復(fù)一些重要數(shù)據(jù)的。數(shù)據(jù)丟失后,你首先應(yīng)該“保護(hù)好災(zāi)難

15、現(xiàn)場(chǎng)”:即在確定恢復(fù)計(jì)劃前,不要再對(duì)硬盤(pán)進(jìn)行任何寫(xiě)操作。在介紹一些數(shù)據(jù)恢復(fù)的軟件及方法前,我們有必要先來(lái)了解一下硬盤(pán)數(shù)據(jù)存儲(chǔ)及其相關(guān)系統(tǒng)的原理。硬盤(pán)驅(qū)動(dòng)器是一種采用磁介質(zhì)的數(shù)據(jù)存儲(chǔ)設(shè)備,數(shù)據(jù)存儲(chǔ)在密封于潔凈的硬盤(pán)驅(qū)動(dòng)器內(nèi)腔的若干個(gè)磁盤(pán)片上。這些盤(pán)片一般是在以鋁為主要成分的片基表面涂上磁性介質(zhì)所形成,在磁盤(pán)片的每一面上,以轉(zhuǎn)動(dòng)軸為軸心、以一定的磁密度為間隔的若干個(gè)同心圓就被劃分成磁道(track),每個(gè)磁道又被劃分為若干個(gè)扇區(qū)(sector),數(shù)據(jù)就按扇區(qū)存放在硬盤(pán)上。在每一面上都相應(yīng)地有一個(gè)讀寫(xiě)磁頭(head),所以不同磁頭的所有相同位置的磁道就構(gòu)成了所謂的柱面(cylinder)。傳統(tǒng)的硬盤(pán)

16、讀寫(xiě)都是以柱面、磁頭、扇區(qū)為尋址方式的(CHS尋址)。硬盤(pán)在上電后保持高速旋轉(zhuǎn)(5400轉(zhuǎn)/min以上),位于磁頭臂上的磁頭懸浮在磁盤(pán)表面,可以通過(guò)步進(jìn)電機(jī)在不同柱面之間移動(dòng),對(duì)不同的柱面進(jìn)行讀寫(xiě)。所以在上電期間如果硬盤(pán)受到劇烈振蕩,磁盤(pán)表面就容易被劃傷,磁頭也容易損壞,這都將給盤(pán)上存儲(chǔ)的數(shù)據(jù)帶來(lái)災(zāi)難性的后果。硬盤(pán)的第一個(gè)扇區(qū)(0道0頭1扇區(qū))被保留為主引導(dǎo)扇區(qū)。在主引導(dǎo)區(qū)內(nèi)主要有兩項(xiàng)內(nèi)容:主引導(dǎo)記錄和硬盤(pán)分區(qū)表。主引導(dǎo)記錄是一段程序代碼,其作用主要是對(duì)硬盤(pán)上安裝的操作系統(tǒng)進(jìn)行引導(dǎo);硬盤(pán)分區(qū)表則存儲(chǔ)了硬盤(pán)的分區(qū)信息。計(jì)算機(jī)啟動(dòng)時(shí)將讀取該扇區(qū)的數(shù)據(jù),并對(duì)其合法性進(jìn)行判斷(扇區(qū)最后兩個(gè)字節(jié)是否為0

17、 x55AA或0 xAA55 ),如合法則跳轉(zhuǎn)執(zhí)行該扇區(qū)的第一條指令。所以硬盤(pán)的主引導(dǎo)區(qū)常常成為病毒攻擊的對(duì)象,從而被篡改甚至被破壞??梢龑?dǎo)標(biāo)志:0 x80為可引導(dǎo)分區(qū)類(lèi)型標(biāo)志;0表示未知;1為FAT12;4為FAT16;5為擴(kuò)展分區(qū)等等。CMOS中的硬盤(pán)信息在計(jì)算機(jī)的CMOS中也存儲(chǔ)了硬盤(pán)的信息,主要有硬盤(pán)類(lèi)型、容量、柱面數(shù)、磁頭數(shù)、每道扇區(qū)數(shù)、尋址方式等內(nèi)容,對(duì)硬盤(pán)參數(shù)加以說(shuō)明,以便計(jì)算機(jī)正確訪問(wèn)硬盤(pán)。當(dāng)CMOS因故掉電或發(fā)生錯(cuò)誤時(shí),硬盤(pán)設(shè)置可能會(huì)丟失或錯(cuò)誤,硬盤(pán)訪問(wèn)也就無(wú)法正確進(jìn)行。這種情況我們就必須重新設(shè)置硬盤(pán)參數(shù),如果事先已記下硬盤(pán)參數(shù)或者有某些防病毒軟件事先備份的CMOS信息,只需

18、手工恢復(fù)即可;否則也可使用BIOS設(shè)置(setup)中的“自動(dòng)檢測(cè)硬盤(pán)類(lèi)型”(HD type auto detection)的功能,一般也能得到正確的結(jié)果。硬盤(pán)故障大體上可以分為軟故障和硬故障兩大類(lèi),具體有硬盤(pán)操作系統(tǒng)被損壞、硬盤(pán)主引導(dǎo)區(qū)被破壞、 FAT表表被破壞、CMOS硬盤(pán)參數(shù)不正確、硬盤(pán)控制器與硬盤(pán)驅(qū)動(dòng)器未能正常連接、硬盤(pán)驅(qū)動(dòng)器或硬盤(pán)控制器硬件故障、主板故障等情況。比如:開(kāi)機(jī)自檢過(guò)程中,屏幕提示“Hard disk drive failure”或類(lèi)似信息,則可以判斷為硬盤(pán)驅(qū)動(dòng)器或硬盤(pán)控制器(提示“Hard drive controller failure”)硬件故障。開(kāi)機(jī)自檢過(guò)程中,屏幕

19、提示“Hard disk not present”或類(lèi)似信息,則可能是CMOS硬盤(pán)參數(shù)設(shè)置錯(cuò)誤或硬盤(pán)控制器與硬盤(pán)驅(qū)動(dòng)器連接不正確。開(kāi)機(jī)自檢過(guò)程中,屏幕提示“Missing operating system”、“Non OS” 、“Non system disk or disk error,replace disk and press a key to reboot”等類(lèi)似信息,則可能是硬盤(pán)主引導(dǎo)區(qū)分區(qū)表被破壞、操作系統(tǒng)未正確安裝或者CMOS硬盤(pán)參數(shù)設(shè)置錯(cuò)誤等。開(kāi)機(jī)用軟盤(pán)啟動(dòng)后無(wú)法進(jìn)入C盤(pán),可能是分區(qū)表被破壞 1. 硬盤(pán)結(jié)構(gòu)硬盤(pán)的內(nèi)部是由圓形金屬片堆疊起來(lái)的,每個(gè)盤(pán)片的兩面都有一個(gè)磁頭(Head

20、)負(fù)責(zé)讀寫(xiě)這個(gè)磁面(Side),在每個(gè)磁面上劃分了一圈一圈的同心圓,叫做柱面(Cylinder)對(duì)于軟盤(pán)通常稱(chēng)之為磁道,在每個(gè)柱面中又劃分了若干段,稱(chēng)之為扇區(qū)(Sector)。由于技術(shù)的發(fā)展,硬盤(pán)的密度越來(lái)越大,使得硬盤(pán)的實(shí)際盤(pán)片數(shù)越來(lái)越少,對(duì)磁盤(pán)操作的柱面、磁頭、扇區(qū)被硬盤(pán)控制器內(nèi)部轉(zhuǎn)換,已經(jīng)不是實(shí)際的柱面、磁頭、扇區(qū)了。由于最早時(shí)磁盤(pán)存取系統(tǒng)估計(jì)不足,傳輸數(shù)據(jù)時(shí)只給扇區(qū)留了6位,柱面留了10位,磁頭留了8位。也就是說(shuō),柱面最大只能為1023。但是大硬盤(pán)的柱面遠(yuǎn)大于這個(gè)數(shù),所以后來(lái)就采用將柱面數(shù)減少,將磁頭數(shù)增加的方式來(lái)滿(mǎn)足磁盤(pán)尋址的要求,對(duì)于實(shí)際地址的轉(zhuǎn)換在BIOS中進(jìn)行,這叫邏輯塊尋址方

21、式(Logical Block Addressing,LBA)硬盤(pán)中有關(guān)柱面、磁頭、扇區(qū)的數(shù)據(jù)都是以此為基準(zhǔn)的。2. 分區(qū)結(jié)構(gòu)眾多的文件數(shù)據(jù)存放在磁盤(pán)上,需要有組織,這就形成了文件系統(tǒng)。但是各個(gè)操作系統(tǒng)的文件系統(tǒng)都不盡相同,為了劃分管理文件系統(tǒng),在現(xiàn)在的PC機(jī)上都采用通用的分區(qū)結(jié)構(gòu)。分區(qū)機(jī)構(gòu)是這樣的:硬盤(pán)的以一個(gè)扇區(qū)(就是0柱面0磁頭1扇區(qū))叫主引導(dǎo)扇區(qū)(Main Boot Record,MBR),存放著引導(dǎo)程序和主分區(qū)表(Main Partition Table)和結(jié)束標(biāo)志55AA。一般稱(chēng)的分區(qū)表即是主分區(qū)表。一個(gè)分區(qū)表最多可包含四個(gè)分區(qū)表項(xiàng),每個(gè)分區(qū)表項(xiàng)中標(biāo)示著一個(gè)分區(qū)信息或一個(gè)擴(kuò)展分區(qū)表

22、的位置,而擴(kuò)展分區(qū)表中可能還有擴(kuò)展分區(qū)表,這就形成了一個(gè)鏈狀結(jié)構(gòu),可以記錄很多個(gè)分區(qū)。 C語(yǔ)言定義如下 typedef struct char bootcode0 x1be; /啟動(dòng)代碼 PartitionTable PT4; /分區(qū)表 word EndingFlag; /結(jié)束標(biāo)識(shí)MBR; 分區(qū)表項(xiàng)的如下: typedef struct byte BootFlag; /啟動(dòng)標(biāo)志 CHS StartCHS; /分區(qū)開(kāi)始的柱面、磁頭、扇區(qū) byte SystemID; /分區(qū)類(lèi)型 CHS EndCHS; /分區(qū)結(jié)束的柱面、磁頭、扇區(qū) dword RelativeSectors; /分區(qū)相對(duì)扇區(qū)數(shù),

23、指分區(qū)相對(duì)于記錄該分區(qū)的分區(qū)表的扇區(qū)位置之差 dword TotalSectors;/分區(qū)總扇區(qū)數(shù) PartitionTable; 其中CHS為一個(gè)柱面、磁頭、扇區(qū)的結(jié)構(gòu),定義如下: struct CHS byte Head; /磁頭 byte Sector:6; /扇區(qū) byte CyH2:2; /柱面的高兩位 byte CyL8; /柱面的低八位 word Cylinder() return (word(CyH2)*256+CyL8); /返回柱面值 void SetCylinder(word Cylinder) /設(shè)置柱面值 CyH2=(Cylinder8)&0 x3; CyL8=(Cy

24、linder&0 xff); ;其中分區(qū)類(lèi)型是對(duì)應(yīng)于各種文件系統(tǒng)統(tǒng)一編排的一個(gè)代碼。比如06H是大于32M的FAT16分區(qū)的標(biāo),05H是擴(kuò)展分區(qū)的標(biāo)志,等等。一般的,對(duì)于DOS/Windows3.x/Windows95/98的系統(tǒng)來(lái)說(shuō),第一個(gè)分區(qū)表項(xiàng)記錄著DOS主分區(qū)(C盤(pán))的信息,而且是可以啟動(dòng)的,第二個(gè)分區(qū)表項(xiàng)一般是擴(kuò)展分區(qū),在這個(gè)擴(kuò)展分區(qū)表項(xiàng)所指向的分區(qū)表中又是一個(gè)Dos主分區(qū)(D盤(pán))和一個(gè)擴(kuò)展分區(qū),依次類(lèi)推。而在絕大部分系統(tǒng)中Dos主分區(qū)(C盤(pán))是從0柱面1磁頭1扇區(qū)開(kāi)始的。(有些機(jī)器在這個(gè)位置有個(gè)小分區(qū),專(zhuān)門(mén)用來(lái)管理啟動(dòng)或機(jī)器設(shè)置,之后才是C盤(pán)的分區(qū)) 3. FAT文件系統(tǒng)FAT文件

25、系統(tǒng)(FAT12/FAT16/FAT32)是從DOS發(fā)展過(guò)來(lái)的一種文件系統(tǒng),其優(yōu)點(diǎn)是簡(jiǎn)單易用,并被多種操作系統(tǒng)支持。(目前支持FAT32的操作系統(tǒng)還不多)FAT文件系統(tǒng)名稱(chēng)后的數(shù)字是標(biāo)識(shí)文件中系統(tǒng)一個(gè)分配單元所需的位(bit)數(shù)。一個(gè)FAT12/16文件系統(tǒng)的結(jié)構(gòu)是這樣的: 引導(dǎo)扇區(qū) 第一文件分配表 第二文件分配表 根目錄 數(shù)據(jù)區(qū) (1).引導(dǎo)扇區(qū) 引導(dǎo)扇區(qū)是文件系統(tǒng)的第一個(gè)扇區(qū),其中包含分區(qū)重要的數(shù)據(jù)信息-BPB(BIOS Paramenter Block-磁盤(pán)參數(shù)表)。磁盤(pán)參數(shù)表中包含分區(qū)總大小、磁盤(pán)參數(shù)等重要信息。其C語(yǔ)言定義為: typedef struct word SectorBy

26、tes; /每扇區(qū)字節(jié)數(shù) byte SectorsPerCluster; /每簇扇區(qū)數(shù) word ReservedSectors; /保留扇區(qū)數(shù) byte NbrFat; /FAT的個(gè)數(shù) word RootEntry; /根目錄項(xiàng)數(shù) word TotalSectors; /分區(qū)總扇區(qū)數(shù)(分區(qū)小于32M時(shí)) byte Media; /分區(qū)介質(zhì)標(biāo)識(shí) word SectorsPerFAT; /每個(gè)FAT占的扇區(qū)數(shù) word SectorsPerTrack; /每道扇區(qū)數(shù) word Heads; /磁頭數(shù) dword HiddenSectors; /隱含扇區(qū)數(shù) dword BigTotalSector

27、s; /分區(qū)總扇區(qū)數(shù)(分區(qū)大于32M時(shí)) BPB_FAT16;其中保留扇區(qū)數(shù)為從分區(qū)開(kāi)始到第一個(gè)FAT表開(kāi)始中間的扇區(qū)數(shù)。隱含扇區(qū)數(shù)同分區(qū)表中的隱含扇區(qū)數(shù)含義相同。雖然存在FAT個(gè)數(shù)的定義,但現(xiàn)在的FAT12/16系統(tǒng)基本上沒(méi)有除2以外的值。因而一般不考慮其他情況。根目錄項(xiàng)數(shù)是指根目錄總共能容納下的目錄的項(xiàng)數(shù)。一個(gè)目錄項(xiàng)占32個(gè)字節(jié),所以一個(gè)扇區(qū)有512/32=16個(gè)目錄項(xiàng)。用這個(gè)值除以16就是根目錄所占的扇區(qū)數(shù)。分區(qū)總扇區(qū)數(shù)在分區(qū)大于32M時(shí)已經(jīng)超過(guò)65535,兩個(gè)字節(jié)已經(jīng)無(wú)法表示,因此在大于32M的分區(qū)中TotalSector總是等于零,而將實(shí)際的數(shù)放在BigTotalSectors中。分

28、區(qū)介質(zhì)標(biāo)識(shí)是確定BPB有效的標(biāo)志。它必須與FAT表中第一個(gè)字節(jié)的分區(qū)介質(zhì)標(biāo)識(shí)統(tǒng)一。硬盤(pán)的分區(qū)介質(zhì)標(biāo)識(shí)為0F8h,如果這個(gè)標(biāo)識(shí)不對(duì)或者與FAT不統(tǒng)一則將會(huì)出Invalid media type的錯(cuò)誤。SectorsPerFAT是每個(gè)FAT所占的扇區(qū)數(shù)。系統(tǒng)根據(jù)分區(qū)起始地址+保留扇區(qū)數(shù)+每個(gè)FAT所占扇區(qū)數(shù)*FAT個(gè)數(shù)+根目錄項(xiàng)數(shù)/16來(lái)確定數(shù)據(jù)區(qū)開(kāi)始的位置,然后由這個(gè)位置+簇號(hào)*每簇扇區(qū)數(shù)來(lái)最終確定數(shù)據(jù)在硬盤(pán)扇的具體位置。 (2)文件分配表文件分配表是文件在磁盤(pán)上分布的信息。FAT文件系統(tǒng)將數(shù)據(jù)區(qū)按每簇扇區(qū)數(shù)為單位劃分成一個(gè)一個(gè)單元,每個(gè)單元是文件分配的最小單位。這個(gè)單元就稱(chēng)為簇。一些大的文件可

29、能占用了很多簇,而且在磁盤(pán)上沒(méi)有連續(xù)存放。FAT表就是為了確定文件每個(gè)簇的連接關(guān)系而設(shè)的。FAT表的每一項(xiàng)都對(duì)應(yīng)著數(shù)據(jù)區(qū)的一個(gè)簇,F(xiàn)AT16的FAT表每一項(xiàng)占16位,也就是兩個(gè)字節(jié)。每一項(xiàng)的內(nèi)容表示其對(duì)應(yīng)簇的分配情況,0表示尚未分配;FFF0hFFF6h為備用;FFF7h表示壞簇,即該簇中磁盤(pán)有損壞;FFF8hFFFF表示文件結(jié)束;其他值則表示當(dāng)前簇的下一簇的簇號(hào)。FAT表的最前面兩項(xiàng)是不用的,因此第一個(gè)數(shù)據(jù)簇的簇號(hào)為2。FAT表第一個(gè)字節(jié)也是分區(qū)介質(zhì)類(lèi)型,和BPB中的一樣。因此用F8 FF FF可以作為硬盤(pán)FAT起始的標(biāo)志。絕大多數(shù)FAT系統(tǒng)有兩個(gè)FAT表,第二個(gè)FAT表又稱(chēng)為后備文件分配表

30、。系統(tǒng)內(nèi)部完成后備文件分配表與第一文件分配表的統(tǒng)一。本文討論的完全恢復(fù)是基于后備文件分配表沒(méi)有被破壞的情況下的恢復(fù),如果兩個(gè)文件分配表都被損壞,理論上就無(wú)法完全確定文件信息,因此無(wú)法完全恢復(fù)。 (3)根目錄FAT12/16的根目錄是單獨(dú)列出來(lái)的,在后備文件分配表和數(shù)據(jù)區(qū)之間。每個(gè)目錄項(xiàng)為32個(gè)字節(jié),記錄一個(gè)文件或目錄的信息。(長(zhǎng)文件名例外)文件修復(fù)的原理就是由目錄項(xiàng)中指示的起始簇號(hào)和數(shù)據(jù)區(qū)開(kāi)始位置來(lái)確定文件的位置,從而恢復(fù)小的文件。 4. FAT32文件系統(tǒng)FAT32文件系統(tǒng)與FAT12/16的差別較大,一個(gè)主要的差別就是將根目錄劃歸到數(shù)據(jù)區(qū)中了,在BPB中專(zhuān)門(mén)加了一項(xiàng)根目錄開(kāi)始簇號(hào)。這樣根目

31、錄的大小就不再受到限制,大大增加了根目錄的自由度。FAT32的BPB定義如下:typedef struct word BytesPerSector; /每扇區(qū)字節(jié)數(shù) byte SectorsPerCluster; /每簇扇區(qū)數(shù) word ReservedSectors; /保留扇區(qū)數(shù) byte NumberOfFATs; /FAT的個(gè)數(shù) word RootEntries; /根目錄項(xiàng)數(shù)(FAT32不用) word TotalSectors; /分區(qū)總扇區(qū)數(shù)(FAT32不用) byte MediaDescriptor; /分區(qū)介質(zhì)標(biāo)識(shí) word SectorsPerFAT; /每個(gè)FAT占的扇區(qū)

32、數(shù)(FAT32不用) word SectorsPerTrack; /每道扇區(qū)數(shù) word Heads; /磁頭數(shù) dword HiddenSectors; /隱含扇區(qū)數(shù) dword BigTotalSectors; /分區(qū)總扇區(qū)數(shù) dword BigSectorsPerFat; /每個(gè)FAT占的扇區(qū)數(shù) word ExtFlags; /擴(kuò)展標(biāo)志 word FS_Version; /文件系統(tǒng)版本 dword RootDirStartClus; /根目錄起始簇號(hào) word FSInfoSec; /指向包含BIGFATBOOTFSINFO結(jié)構(gòu)的扇區(qū) word BkUpBootSec; /后備引導(dǎo)區(qū)的位

33、置 byte Reserved12; /備用 BPB_FAT32;從上可以看出,F(xiàn)AT32的BPB是在FAT16BPB的基礎(chǔ)上加入了一些參數(shù),并停用了一些參數(shù)。每個(gè)FAT所占扇區(qū)數(shù)變?yōu)?個(gè)字節(jié),根目錄項(xiàng)數(shù)不再使用。FAT32與FAT12/16的另一不同點(diǎn)在于,F(xiàn)AT32既可以同時(shí)使用多個(gè)FAT表,也可以只使用其中的某一個(gè)FAT表。ExtFlags正是這個(gè)標(biāo)志。當(dāng)ExtFlags的第8位為0時(shí)表示同時(shí)使用每個(gè)FAT表,當(dāng)其為1時(shí)表示只使用其中的一個(gè)FAT表,這個(gè)FAT表的序號(hào)由ExtFlags的低4位給出。FS_Version文件系統(tǒng)版本現(xiàn)在都為0。FAT32將根目錄也視作一個(gè)目錄文件,使用一個(gè)

34、簇鏈(Cluster Chain),RootDirStartClus正是這個(gè)鏈的起始簇號(hào)。FAT32有個(gè)專(zhuān)門(mén)放BIGFATBOOTFSINFO結(jié)構(gòu)的扇區(qū),該結(jié)構(gòu)包含了剩余簇個(gè)數(shù),下一個(gè)空閑簇號(hào)等信息。這個(gè)扇區(qū)通常緊接著引導(dǎo)扇區(qū)。由于與恢復(fù)關(guān)系不大,本文不做討論。FAT32將引導(dǎo)扇區(qū)和文件系統(tǒng)信息扇區(qū)信息存了兩份,另一份的位置由BkUpBootSec指出。這樣由于偶然發(fā)生的損壞就很容易恢復(fù)。 5. 擴(kuò)展BIOS參數(shù)塊在BPB的后面是Extended BIOS Paramenter Block。EBPB的結(jié)構(gòu)如下:typedef struct /Extended BIOS Paramenter B

35、lock byte PhysicalDriveNumber; /物理硬盤(pán)號(hào) byte CurrentHead; /當(dāng)前磁頭 byte ExtBootRecSign; /擴(kuò)展引導(dǎo)記錄標(biāo)志 dword SerialNumber; /序列號(hào) char VolumeLabel11; /卷標(biāo) char FSID8; /文件系統(tǒng)標(biāo)識(shí) EBPB;其中物理硬盤(pán)號(hào)和當(dāng)前磁頭是系統(tǒng)運(yùn)行時(shí)使用的,硬盤(pán)上的值沒(méi)有什么實(shí)際意義。ExtBootRecSign一般為28h或29h。SerialNumber是格式化后生成的序列號(hào)。文件系統(tǒng)標(biāo)識(shí)指示了文件系統(tǒng)的類(lèi)型,即FAT12、 FAT16、 FAT32。6. 壓縮磁盤(pán)簡(jiǎn)介從

36、DOS6.0開(kāi)始有了壓縮磁盤(pán)的功能。DBLSPACE、DRVSPACE、DRVSPACE3是各個(gè)不同時(shí)期的磁盤(pán)壓縮系統(tǒng)。壓縮磁盤(pán)其實(shí)是個(gè)大文件,其內(nèi)部是個(gè)更為復(fù)雜的FAT系統(tǒng)。這個(gè)大文件包含了文件頭、MDFAT(Microsoft Drivespace FAT)、內(nèi)部BPB、內(nèi)部FAT、內(nèi)部根目錄及內(nèi)部數(shù)據(jù)區(qū),和分區(qū)非常相似。主要不同的是,它的FAT不直接對(duì)應(yīng)數(shù)據(jù)區(qū),而是對(duì)應(yīng)于MDFAT表,每一個(gè)MDFAT表項(xiàng)包含扇區(qū)起始位置信息和扇區(qū)的壓縮信息。這樣在存取一個(gè)文件時(shí)需要由目錄項(xiàng)確定起始簇,由起始簇表確定MDFAT表項(xiàng),再由MDFAT得到扇區(qū)位置,并由壓縮信息決定是否進(jìn)行壓縮解壓。根據(jù)FAT表

37、來(lái)確定下一個(gè)簇或者文件結(jié)束。但其中的扇區(qū)位置等信息都是相對(duì)于這個(gè)文件的邏輯地址,具體物理地址還要用外部的分區(qū)信息和外部FAT表決定。因此對(duì)于C盤(pán)被壓縮后的恢復(fù)是非常困難的。 7. ROM、PROM、EPROM、EEPROM、Flash ROM分別指什么? ROM指的是只讀存儲(chǔ)器,即Read-Only Memory。這是一種線(xiàn)路最簡(jiǎn)單半導(dǎo)體電路,通過(guò)掩模工藝,一次性制造,其中的代碼與數(shù)據(jù)將永久保存(除非壞掉),不能進(jìn)行修改。這玩意一般在大批量生產(chǎn)時(shí)才會(huì)被用的,優(yōu)點(diǎn)是成本低、非常低,但是其風(fēng)險(xiǎn)比較大,在產(chǎn)品設(shè)計(jì)時(shí),如果調(diào)試不徹底,很容易造成幾千片的費(fèi)片,行內(nèi)話(huà)叫掩砸了!PROM指的是可編程只讀存儲(chǔ)

38、器既Programmable Red-Only Memory。這樣的產(chǎn)品只允許寫(xiě)入一次,所以也被稱(chēng)為一次可編程只讀存儲(chǔ)器(One Time ProgarmmingROM,OTP-ROM)。PROM在出廠時(shí),存儲(chǔ)的內(nèi)容全為1,用戶(hù)可以根據(jù)需要將其中的某些單元寫(xiě)入數(shù)據(jù)0(部分的PROM在出廠時(shí)數(shù)據(jù)全為0,則用戶(hù)可以將其中的部分單元寫(xiě)入1),以實(shí)現(xiàn)對(duì)其編程的目的。PROM的典型產(chǎn)品是雙極性熔絲結(jié)構(gòu),如果我們想改寫(xiě)某些單元,則可以給這些單元通以足夠大的電流,并維持一定的時(shí)間,原先的熔絲即可熔斷,這樣就達(dá)到了改寫(xiě)某些位的效果。另外一類(lèi)經(jīng)典的PROM為使用肖特基二極管的PROM,出廠時(shí),其中的二極管處于反

39、向截止?fàn)顟B(tài),還是用大電流的方法將反相電壓加在肖特基二極管,造成其永久性擊穿即可。EPROM指的是可擦寫(xiě)可編程只讀存儲(chǔ)器,即Erasable Programmable Read-Only Memory。它的特點(diǎn)是具有可擦除功能,擦除后即可進(jìn)行再編程,但是缺點(diǎn)是擦除需要使用紫外線(xiàn)照射一定的時(shí)間。這一類(lèi)芯片特別容易識(shí)別,其封裝中包含有石英玻璃窗,一個(gè)編程后的EPROM芯片的石英玻璃窗一般使用黑色不干膠紙蓋住,以防止遭到陽(yáng)光直射。EEPROM指的是電可擦除可編程只讀存儲(chǔ)器,即Electrically Erasable Programmable Read-Only Memory。它的最大優(yōu)點(diǎn)是可直接用電

40、信號(hào)擦除,也可用電信號(hào)寫(xiě)入。EEPROM不能取代RAM的原應(yīng)是其工藝復(fù)雜,耗費(fèi)的門(mén)電路過(guò)多,且重編程時(shí)間比較長(zhǎng),同時(shí)其有效重編程次數(shù)也比較低。 Flash memory指的是閃存,所謂閃存,它也是一種非易失性的內(nèi)存,屬于EEPROM的改進(jìn)產(chǎn)品。它的最大特點(diǎn)是必須按塊(Block)擦除(每個(gè)區(qū)塊的大小不定,不同廠家的產(chǎn)品有不同的規(guī)格),而EEPROM則可以一次只擦除一個(gè)字節(jié)(Byte)。目前閃存被廣泛用在PC機(jī)的主板上,用來(lái)保存BIOS程序,便于進(jìn)行程序的升級(jí)。其另外一大應(yīng)用領(lǐng)域是用來(lái)作為硬盤(pán)的替代品,具有抗震、速度快、無(wú)噪聲、耗電低的優(yōu)點(diǎn),但是將其用來(lái)取代RAM就顯得不合適,因?yàn)镽AM需要能夠

41、按字節(jié)改寫(xiě),而Flash ROM做不到。 8. DOS(DOS兼容系統(tǒng)硬盤(pán)數(shù)據(jù))的構(gòu)成 主分區(qū)和擴(kuò)展分區(qū)結(jié)構(gòu)基本相似,以下以主分區(qū)為例。主引導(dǎo)記錄(MBR):MBR占一個(gè)扇區(qū),在CYL 0、SIDE 0 、SEC 1,由代碼區(qū)和分區(qū)表構(gòu)成。其中代碼區(qū)可以由FDISK/MBR重建。系統(tǒng)扇區(qū):CYL 0、SIDE 0 、SEC 1-CYL 0、SIDE 0 、SEC63,共62個(gè)扇區(qū) 引導(dǎo)區(qū)(BOOT):CYL 0、SIDE 1 、SEC 1 這是我們過(guò)去稱(chēng)的DOS引導(dǎo)區(qū)。也占一個(gè)扇區(qū)。隱藏扇區(qū):CYL 0、SIDE 0 、SEC 1,如果是FAT16那么占一個(gè)扇區(qū),如果是FAT32則由此占32個(gè)

42、扇區(qū)。 文件分配表:一般有兩個(gè)FAT表,F(xiàn)AT12、FAT16的第一FAT表一般均在0-1-2,F(xiàn)AT32的第一FAT表在0-1-33。FAT表是記錄文件占用扇區(qū)連接的地方,如果兩個(gè)FAT表都?jí)牧?,后果不堪設(shè)想。由于FAT表的長(zhǎng)度與當(dāng)前分區(qū)的大小有關(guān)所以FAT2的地址是需要計(jì)算的。根目錄區(qū):(ROOT)這里記錄了根目錄里的目錄文件項(xiàng)等, ROOT區(qū)跟在FAT2后面。 數(shù)據(jù)區(qū):跟在ROOT區(qū)后面,這才是數(shù)據(jù)內(nèi)容。 9. 主引導(dǎo)記錄簡(jiǎn)單說(shuō)明:主引導(dǎo)記錄是硬盤(pán)引導(dǎo)的起點(diǎn),關(guān)于代碼區(qū)不多說(shuō)了,其分區(qū)表,比較重要的是2個(gè)標(biāo)志,在偏移1BE處的80的標(biāo)記表示系統(tǒng)可引導(dǎo),且整個(gè)分區(qū)表只能有一個(gè)80標(biāo)記。另一

43、個(gè)就是結(jié)尾的55 AA標(biāo)記。用來(lái)表示主引導(dǎo)記錄是一個(gè)有效的記錄。其實(shí),無(wú)論MBR還是隱含扇區(qū)還是BOOT區(qū),都不重要,這些重建都比較容易。對(duì)數(shù)據(jù)恢復(fù)來(lái)說(shuō),能否成功的找回?cái)?shù)據(jù)文件是重要的。另外,由于FAT表記錄了文件在硬盤(pán)上占用扇區(qū)的鏈表,如果2個(gè)FAT表都完全損壞了。那么恢復(fù)文件,特別是占用多個(gè)不連續(xù)扇區(qū)文件就相當(dāng)困難了。基本思路是: 1、FAT2沒(méi)有損壞的情況,用FAT2覆蓋FAT1。 2、FAT2也已經(jīng)損壞的情況,我一般是只期待找回其中某些關(guān)鍵的文件了。我們最期待的是這些文件是連續(xù)的。如果不連續(xù)的話(huà),也并非沒(méi)有可能,但這往往還要知道文件的一些細(xì)節(jié),包括對(duì)一些文件本身的連接結(jié)構(gòu)有了解。如果F

44、AT2沒(méi)有完全破壞,是有一定用處的,另外,一般來(lái)說(shuō),F(xiàn)AT16的硬盤(pán)因?yàn)镕AT表靠前破壞的比較嚴(yán)重,一般兩個(gè)FAT表都?jí)牧?,小硬盤(pán)也很難恢復(fù)了。 電子硬盤(pán)文件管理 數(shù)據(jù)邏輯結(jié)構(gòu)根據(jù)Flash memory的特點(diǎn),將文件的管理格式分配如下文件信息區(qū)(File Message Area)FMA文件存儲(chǔ)鏈表區(qū)(File store Link Area)FLA文件數(shù)據(jù)區(qū)(File Data Area)FDA文件目錄區(qū)(File Directory Area)可選四個(gè)區(qū)的關(guān)系如下: 文件信息區(qū)文件信息區(qū)文件數(shù)據(jù)文件存儲(chǔ)鏈表區(qū)文件信息區(qū) 文件序號(hào) 1 字節(jié) 文件名 8 文件擴(kuò)展名 3 文件時(shí)間 3 文件大

45、小 4 文件存儲(chǔ)鏈表快 2 其他信息 n如下列信息 文件信息區(qū) 例存儲(chǔ)aaaaaaaa.txt 1 8 3 3 4 2 *01 aaaaaaaa txt 030802 0a0b0f0d 0a0b *根據(jù)oaob塊(注意硬盤(pán)管理為簇,這里是塊,每塊根據(jù)Flash的大小分為4k,8k,16k,32K,.) 0a0b快就是我的文件數(shù)據(jù)鏈表區(qū).根據(jù)下圖0cod(0000h)0d0f(0001h)1011(0002h)0a0b塊 datadatadata 鏈表快 數(shù)據(jù)塊 0c0d 0d0f 1011根據(jù)文件信息塊的0a0b查找鏈表塊,由鏈表快查找數(shù)據(jù)塊.鏈表快為循序存儲(chǔ),你還可以進(jìn)行鏈?zhǔn)酱鎯?chǔ)附錄資料:不

46、需要的可以自行刪除 libxml2應(yīng)用實(shí)例Libxml2 是一個(gè)xml的c語(yǔ)言版的解析器,本來(lái)是為Gnome項(xiàng)目開(kāi)發(fā)的工具,是一個(gè)基于MIT License的免費(fèi)開(kāi)源軟件。它除了支持c語(yǔ)言版以外,還支持c+、PHP、Pascal、Ruby、Tcl等語(yǔ)言的綁定,能在Windows、Linux、Solaris、MacOsX等平臺(tái)上運(yùn)行。功能還是相當(dāng)強(qiáng)大的,相信滿(mǎn)足一般用戶(hù)需求沒(méi)有任何問(wèn)題。二、 Libxml2安裝:一般如果在安裝系統(tǒng)的時(shí)候選中了所有開(kāi)發(fā)庫(kù)和開(kāi)發(fā)工具的話(huà)(Fedora Core系列下),應(yīng)該不用安裝,下面介紹一下手動(dòng)安裝: 1) 從xmlsoft站點(diǎn)或ftp()站點(diǎn)下載libxml壓

47、縮包(libxml2-xxxx.tar.gz)2) 對(duì)壓縮包進(jìn)行解壓縮 tar xvzf libxml2-xxxx.tar.gz3) 進(jìn)入解壓縮后的文件夾中運(yùn)行 ./configure -prefix /home/user/myxml/xmlinst(此處為待安裝的路徑)或者直接使用 ./configure make make install 4) 添加路徑 export PATH=/home/user/myxml/xmlinst/bin:$PATH 說(shuō)明:為了結(jié)構(gòu)清晰,最好將libxml2不安裝在解壓目錄中。安裝完成后就可以使用簡(jiǎn)單的代碼解析XML文件,包括本地和遠(yuǎn)程的文件,但是在編碼上有一

48、些問(wèn)題。Libxml默認(rèn)只支持UTF8的編碼,無(wú)論輸入輸出都是UTF-8,所以如果你解析完一個(gè)XML得到的結(jié)果都是UTF8的,如果需要輸出GB2312或者其它編碼,需要ICONV來(lái)做轉(zhuǎn)碼(生成UTF8編碼的文件也可以用它做),如果系統(tǒng)中沒(méi)有安裝iconv的話(huà),需要安裝libiconv。 1) 下載libiconv壓縮包(例如libiconv-1.11.tar.gz) 2) 對(duì)壓縮包進(jìn)行解壓縮tar xvzf libiconv-1.11.tar.gz 3) 進(jìn)入解壓縮后的文件夾中運(yùn)行 ./configure make make install三、關(guān)于XML:在開(kāi)始研究 Libxml2 庫(kù)之前,先

49、了解一下XML的相關(guān)基礎(chǔ)。XML 是一種基于文本的格式,它可用來(lái)創(chuàng)建能夠通過(guò)各種語(yǔ)言和平臺(tái)訪問(wèn)的結(jié)構(gòu)化數(shù)據(jù)。它包括一系列類(lèi)似 HTML 的標(biāo)記,并以樹(shù)型結(jié)構(gòu)來(lái)對(duì)這些標(biāo)記進(jìn)行排列。例如,可參見(jiàn)清單 1 中介紹的簡(jiǎn)單文檔。為了更清楚地顯示 XML 的一般概念,下面是一個(gè)簡(jiǎn)化的XML文件。清單 1. 一個(gè)簡(jiǎn)單的 XML 文件 root delete 10清單 1 中的第一行是 XML 聲明,它告訴負(fù)責(zé)處理 XML 的應(yīng)用程序,即解析器,將要處理的 XML 的版本。大部分的文件使用版本 1.0 編寫(xiě),但也有少量的版本 1.1 的文件。它還定義了所使用的編碼。大部分文件使用 UTF-8,但是,XML 設(shè)

50、計(jì)用來(lái)集成各種語(yǔ)言中的數(shù)據(jù),包括那些不使用英語(yǔ)字母的語(yǔ)言。接下來(lái)出現(xiàn)的是元素。一個(gè)元素以開(kāi)始標(biāo)記 開(kāi)始(如 ),并以結(jié)束標(biāo)記 結(jié)束(如 ),其中使用斜線(xiàn) (/) 來(lái)區(qū)別于開(kāi)始標(biāo)記。元素是 Node 的一種類(lèi)型。XML 文檔對(duì)象模型 (DOM) 定義了幾種不同的 Nodes 類(lèi)型,包括:Elements(如 files 或者 age)Attributes(如 units)Text(如 root 或者 10)元素可以具有子節(jié)點(diǎn)。例如,age 元素有一個(gè)子元素,即文本節(jié)點(diǎn) 10。XML 解析器可以利用這種父子結(jié)構(gòu)來(lái)遍歷文檔,甚至修改文檔的結(jié)構(gòu)或內(nèi)容。LibXML2 是這樣的解析器中的其中一種,并且文

51、中的示例應(yīng)用程序正是使用這種結(jié)構(gòu)來(lái)實(shí)現(xiàn)該目的。對(duì)于各種不同的環(huán)境,有許多不同的解析器和庫(kù)。LibXML2 是用于 UNIX 環(huán)境的解析器和庫(kù)中最好的一種,并且經(jīng)過(guò)擴(kuò)展,它提供了對(duì)幾種腳本語(yǔ)言的支持,如 Perl 和 Python。四、Libxml2中的數(shù)據(jù)類(lèi)型和函數(shù)一個(gè)函數(shù)庫(kù)中可能有幾百種數(shù)據(jù)類(lèi)型以及幾千個(gè)函數(shù),但是記住大師的話(huà),90%的功能都是由30%的內(nèi)容提供的。對(duì)于libxml2,我認(rèn)為搞懂以下的數(shù)據(jù)類(lèi)型和函數(shù)就足夠了。1)內(nèi)部字符類(lèi)型xmlCharxmlChar是Libxml2中的字符類(lèi)型,庫(kù)中所有字符、字符串都是基于這個(gè)數(shù)據(jù)類(lèi)型。事實(shí)上它的定義是:xmlstring.htypedef

52、 unsigned char xmlChar;使用unsigned char作為內(nèi)部字符格式是考慮到它能很好適應(yīng)UTF-8編碼,而UTF-8編碼正是libxml2的內(nèi)部編碼,其它格式的編碼要轉(zhuǎn)換為這個(gè)編碼才能在libxml2中使用。還經(jīng)??梢钥吹绞褂脁mlChar*作為字符串類(lèi)型,很多函數(shù)會(huì)返回一個(gè)動(dòng)態(tài)分配內(nèi)存的xmlChar*變量,使用這樣的函數(shù)時(shí)記得要手動(dòng)刪除內(nèi)存。2) xmlChar相關(guān)函數(shù)如同標(biāo)準(zhǔn)c中的char類(lèi)型一樣,xmlChar也有動(dòng)態(tài)內(nèi)存分配、字符串操作等相關(guān)函數(shù)。例如xmlMalloc是動(dòng)態(tài)分配內(nèi)存的函數(shù);xmlFree是配套的釋放內(nèi)存函數(shù);xmlStrcmp是字符串比較函數(shù)

53、等等?;旧蟲(chóng)mlChar字符串相關(guān)函數(shù)都在xmlstring.h中定義;而動(dòng)態(tài)內(nèi)存分配函數(shù)在xmlmemory.h中定義。3)xmlChar*與其它類(lèi)型之間的轉(zhuǎn)換另外要注意,因?yàn)榭偸且趚mlChar*和char*之間進(jìn)行類(lèi)型轉(zhuǎn)換,所以定義了一個(gè)宏BAD_CAST,其定義如下:xmlstring.h#define BAD_CAST (xmlChar *)原則上來(lái)說(shuō),unsigned char和char之間進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換是沒(méi)有問(wèn)題的。4)文檔類(lèi)型xmlDoc、指針xmlDocPtrxmlDoc是一個(gè)struct,保存了一個(gè)xml的相關(guān)信息,例如文件名、文檔類(lèi)型、子節(jié)點(diǎn)等等;xmlDocPtr

54、等于xmlDoc*,它搞成這個(gè)樣子總讓人以為是智能指針,其實(shí)不是,要手動(dòng)刪除的。xmlNewDoc函數(shù)創(chuàng)建一個(gè)新的文檔指針。xmlParseFile函數(shù)以默認(rèn)方式讀入一個(gè)UTF-8格式的文檔,并返回文檔指針。xmlReadFile函數(shù)讀入一個(gè)帶有某種編碼的xml文檔,并返回文檔指針;細(xì)節(jié)見(jiàn)libxml2參考手冊(cè)。xmlFreeDoc釋放文檔指針。特別注意,當(dāng)你調(diào)用xmlFreeDoc時(shí),該文檔所有包含的節(jié)點(diǎn)內(nèi)存都被釋放,所以一般來(lái)說(shuō)不需要手動(dòng)調(diào)用xmlFreeNode或者xmlFreeNodeList來(lái)釋放動(dòng)態(tài)分配的節(jié)點(diǎn)內(nèi)存,除非你把該節(jié)點(diǎn)從文檔中移除了。一般來(lái)說(shuō),一個(gè)文檔中所有節(jié)點(diǎn)都應(yīng)該動(dòng)態(tài)

55、分配,然后加入文檔,最后調(diào)用xmlFreeDoc一次釋放所有節(jié)點(diǎn)申請(qǐng)的動(dòng)態(tài)內(nèi)存,這也是為什么我們很少看見(jiàn)xmlNodeFree的原因。xmlSaveFile將文檔以默認(rèn)方式存入一個(gè)文件。xmlSaveFormatFileEnc可將文檔以某種編碼/格式存入一個(gè)文件中。5)節(jié)點(diǎn)類(lèi)型xmlNode、指針xmlNodePtr節(jié)點(diǎn)應(yīng)該是xml中最重要的元素了,xmlNode代表了xml文檔中的一個(gè)節(jié)點(diǎn),實(shí)現(xiàn)為一個(gè)struct,內(nèi)容很豐富:tree.htypedef struct _xmlNode xmlNode;typedef xmlNode *xmlNodePtr;struct _xmlNode vo

56、id *_private;/* application data */ xmlElementType type; /* type number, must be second ! */ const xmlChar *name; /* the name of the node, or the entity */ struct _xmlNode *children;/* parent-childs link */ struct _xmlNode *last; /* last child link */ struct _xmlNode *parent;/* child-parent link */

57、struct _xmlNode *next; /* next sibling link*/ struct _xmlNode *prev; /* previous sibling link*/ struct _xmlDoc*doc;/* the containing document */ /* End of common part */ xmlNs *ns; /* pointer to the associated namespace */ xmlChar *content; /* the content */ struct _xmlAttr *properties;/* properties

58、 list */ xmlNs *nsDef; /* namespace definitions on this node */ void *psvi;/* for type/PSVI informations */ unsigned short line; /* line number */ unsigned short extra;/* extra data for XPath/XSLT */;可以看到,節(jié)點(diǎn)之間是以鏈表和樹(shù)兩種方式同時(shí)組織起來(lái)的,next和prev指針可以組成鏈表,而parent和children可以組織為樹(shù)。同時(shí)還有以下重要元素:節(jié)點(diǎn)中的文字內(nèi)容:content;節(jié)點(diǎn)所屬

59、文檔:doc;節(jié)點(diǎn)名字:name;節(jié)點(diǎn)的namespace:ns;節(jié)點(diǎn)屬性列表:properties;Xml文檔的操作其根本原理就是在節(jié)點(diǎn)之間移動(dòng)、查詢(xún)節(jié)點(diǎn)的各項(xiàng)信息,并進(jìn)行增加、刪除、修改的操作。xmlDocSetRootElement函數(shù)可以將一個(gè)節(jié)點(diǎn)設(shè)置為某個(gè)文檔的根節(jié)點(diǎn),這是將文檔與節(jié)點(diǎn)連接起來(lái)的重要手段,當(dāng)有了根結(jié)點(diǎn)以后,所有子節(jié)點(diǎn)就可以依次連接上根節(jié)點(diǎn),從而組織成為一個(gè)xml樹(shù)。6)節(jié)點(diǎn)集合類(lèi)型xmlNodeSet、指針xmlNodeSetPtr節(jié)點(diǎn)集合代表一個(gè)由節(jié)點(diǎn)組成的變量,節(jié)點(diǎn)集合只作為Xpath的查詢(xún)結(jié)果而出現(xiàn)(XPATH的介紹見(jiàn)后面),因此被定義在xpath.h中,其定義

60、如下:/* A node-set (an unordered collection of nodes without duplicates).*/typedef struct _xmlNodeSet xmlNodeSet;typedef xmlNodeSet *xmlNodeSetPtr;struct _xmlNodeSet int nodeNr; /* number of nodes in the set */ int nodeMax; /* size of the array as allocated */ xmlNodePtr *nodeTab;/* array of nodes in

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論