一、硬碟的物理結構:
硬碟儲存資料是根據電、磁轉換原理實現的。硬碟由一個或幾個表面鍍有磁性物質的金屬或玻璃等物質碟片以及碟片兩面所安裝的磁頭和相應的控制電路組成(圖1),其中碟片和磁頭密封在無塵的金屬殼中。
硬碟工作時,碟片以設計轉速高速旋轉,設定在碟片表面的磁頭則在電路控制下徑向移動到指定位置然後將資料存放區或讀取出來。當系統向硬碟寫入資料時,磁頭中“寫資料”電流產生磁場使碟片表面磁性物質狀態發生改變,並在寫電流磁場消失後仍能保持,這樣資料就儲存下來了;當系統從硬碟中讀資料時,磁頭經過碟片指定地區,碟片表面磁場使磁頭產生感應電流或線圈阻抗產生變化,經相關電路處理後還原成資料。因此只要能將碟片表面處理得更平滑、磁頭設計得更精密以及盡量提高碟片旋轉速度,就能造出容量更大、讀寫資料速度更快的硬碟。這是因為碟片表面處理越平、轉速越快就能越使磁頭離碟片表面越近,提高讀、寫靈敏度和速度;磁頭設計越小越精密就能使磁頭在碟片上佔用空間越小,使磁頭在一張碟片上建立更多的磁軌以儲存更多的資料。
二、硬碟的邏輯結構。
硬碟由很多碟片(platter)組成,每個碟片的每個面都有一個讀寫磁頭。如果有N個碟片。就有2N個面,對應2N個磁頭(Heads),從0、1、2開始編號。每個碟片被劃分成若干個同心圓磁軌(邏輯上的,是不可見的。)每個碟片的劃分規則通常是一樣的。這樣每個碟片的半徑均為固定值R的同心圓再邏輯上形成了一個以電機主軸為軸的柱面(Cylinders),從外至裡編號為0、1、2……每個碟片上的每個磁軌又被劃分為幾十個扇區(Sector),通常的容量是512byte,並按照一定規則編號為1、2、3……形成Cylinders×Heads×Sector個扇區。這三個參數即是硬碟的物理參數。我們下面的很多實踐需要深刻理解這三個參數的意義。
三、磁碟引導原理。
3.1 MBR(master boot record)扇區:
電腦在按下power鍵以後,開始執行主板bios程式。進行完一系列檢測和配置以後。開始按bios中設定的系統引導順序引導系統。假定現在是硬碟。Bios執行完自己的程式後如何把執行權交給硬碟呢。交給硬碟後又執行儲存在哪裡的程式呢。其實,稱為mbr的一段代碼起著舉足輕重的作用。MBR(master boot record),即主引導記錄,有時也稱主開機磁區。位於整個硬碟的0柱面0磁頭1扇區(可以看作是硬碟的第一個扇區),bios在執行自己固有的程式以後就會jump到mbr中的第一條指令。將系統的控制權交由mbr來執行。在總共512byte的主引導記錄中,MBR的引導程式佔了其中的前446個位元組(位移0H~位移1BDH),隨後的64個位元組(位移1BEH~位移1FDH)為DPT(Disk
PartitionTable,硬碟分區表),最後的兩個位元組“55 AA”(位移1FEH~位移1FFH)是分區有效結束標誌。
MBR不隨作業系統的不同而不同,意即不同的作業系統可能會存在相同的MBR,即使不同,MBR也不會夾帶作業系統的性質。具有公用引導的特性。
我們來分析一段mbr。下面是用winhex查看的一塊希捷120GB硬碟的mbr。
你的硬碟的MBR引導代碼可能並非這樣。不過即使不同,所執行的功能大體是一樣的。這是wowocock關於磁碟mbr的反編譯,已加了詳細的注釋,感興趣可以細細研究一下。
我們看DPT部分。作業系統為了便於使用者對磁碟的管理。加入了磁碟分割的概念。即將一塊磁碟邏輯劃分為幾塊。磁碟分割數目的多少只受限於C~Z的英文字母的數目,在DPT共64個位元組中如何表示多個分區的屬性呢?microsoft通過連結的方法解決了這個問題。在DPT共64個位元組中,以16個位元組為分區表項單位描述一個分區的屬性。也就是說,第一個分區表項描述一個分區的屬性,一般為基本分區。第二個分區表項描述除基本分區外的其餘空間,一般而言,就是我們所說的擴充分區。這部分的大體說明見表1。
| 表1 圖2分區表第一欄位 |
| 位元組位移 |
欄位長度 |
值 |
欄位名和定義 |
| 0x01BE |
BYTE |
0x80 |
引導指示符(Boot Indicator) 指明該分區是否是使用中的磁碟分割。 |
| 0x01BF |
BYTE |
0x01 |
開始磁頭(Starting Head) |
| 0x01C0 |
6位 |
0x01 |
開始扇區(Starting Sector) 只用了0~5位。後面的兩位(第6位和第7位)被開始柱面欄位所使用 |
| 0x01C1 |
10位 |
0x00 |
開始柱面(Starting Cylinder) 除了開始扇區欄位的最後兩位外,還使用了1位來組成該柱面值。開始柱面是一個10位元,最大值為1023 |
| 0x01C2 |
BYTE |
0x07 |
系統ID(System ID) 定義了分區的類型,詳細定義,請參閱圖4 |
| 0x01C3 |
BYTE |
0xFE |
結束磁頭(Ending Head) |
| 0x01C4 |
6位 |
0xFF |
結束扇區(Ending Sector) 只使用了0~5位。最後兩位(第6、7位)被結束柱面欄位所使用 |
| 0x01C5 |
10位 |
0x7B |
結束柱面(Ending Cylinder) 除了結束扇區欄位最後的兩位外,還使用了1位,以組成該柱面值。結束柱面是一個10位的數,最大值為1023 |
| 0x01C6 |
DWORD |
0x0000003F |
相對扇區數(Relative Sectors) 從該磁碟的開始到該分區的開始的位移量,以扇區來計算 |
| 0x01CA |
DWORD |
0x00DAA83D |
總扇區數(Total Sectors) 該分區中的扇區總數 |
註:上表中的超過1位元組的資料都以實際資料顯示,就是按高位到地位的方式顯示。儲存時是按低位到高位儲存的。兩者表現不同,請仔細看清楚。以後出現的表,圖均同。
也可以在winhex中看到這些參數的意義:
說明: 每個分區表項佔用16個位元組,假定位移地址從0開始。3的分區表項3。分區表項4同分區表項3。
1、0H位移為使用中的磁碟分割是否標誌,只能選00H和80H。80H為活動,00H為非活動。其餘值對microsoft而言為非法值。
2、重新說明一下(這個非常重要):大於1個位元組的數被以低位元組在前的儲存格式格式(little endian format)或稱反位元組順序儲存下來。低位元組在前的格式是一種儲存數的方法,這樣,最低位的位元組最先出現在十六進位數符號中。例如,相對扇區數欄位的值0x3F000000的低位元組在前表示為0x0000003F。這個低位元組在前的格式數的十進位數為63。
3、系統在分區時,各分區都不允許跨柱面,即均以柱面為單位,這就是通常所說的分區粒度。有時候我們分區是輸入分區的大小為7000M,分出來卻是6997M,就是這個原因。 位移2H和位移6H的扇區和柱面參數中,扇區佔6位(bit),柱面佔10位(bit),以位移6H為例,其低6位用作扇區數的二進位表示。其高兩位做柱面數10位中的高兩位,位移7H組成的8位做柱面數10位中的低8位。由此可知,實際上用這種方式表示的分區容量是有限的,柱面和磁頭從0開始編號,扇區從1開始編號,所以最多隻能表示1024個柱面×63個扇區×256個磁頭×512byte=8455716864byte。即通常的8.4GB(實際上應該是7.8GB左右)限制。實際上磁頭數通常只用到255個(由組合語言的定址寄存器決定),即使把這3個位元組按線性定址,依然力不從心。
在後來的作業系統中,超過8.4GB的分區其實已經不通過C/H/S的方式定址了。而是通過位移CH~位移FH共4個位元組32位線性扇區地址來表示分區所佔用的扇區總數。可知通過4個位元組可以表示2^32個扇區,即2TB=2048GB,目前對於大多數電腦而言,這已經是個天文數字了。在未超過8.4GB的分區上,C/H/S的表示方法和線性扇區的表示方法所表示的分區大小是一致的。也就是說,兩種表示方法是協調的。即使不協調,也以線性定址為準。(可能在某些系統中會提示出錯)。超過8.4GB的分區結束C/H/S一般填充為FEH
FFH FFH。即C/H/S所能表示的最大值。有時候也會用柱面對1024的模來填充。不過這幾個位元組是什麼其實都無關緊要了。
雖然現在的系統均採用線性定址的方式來處理分區的大小。但不可跨柱面的原則依然沒變。本分區的扇區總數加上與前一分區之間的保留扇區數目依然必須是柱面容量的整數倍。(保留扇區中的第一個扇區就是存放分區表的MBR或虛擬MBR的扇區,分區的扇區總數線上性表示方式上是不計入保留扇區的。如果是第一個分區,保留扇區是本分區前的所有扇區。
附:分區表類型標誌4
3.2 擴充分區:
擴充分區中的每個邏輯磁碟機都存在一個類似於MBR的擴充引導記錄( Extended Boot Record, EBR),也有人稱之為虛擬mbr或擴充mbr,意思是一樣的。擴充引導記錄包括一個擴充分區表和該扇區的標籤。擴充引導記錄將記錄只包含擴充分區中每個邏輯磁碟機的第一個柱面的第一面的資訊。一個邏輯磁碟機中的開機磁區一般位於相對扇區32或63。但是,如果磁碟上沒有擴充分區,那麼就不會有擴充引導記錄和邏輯磁碟機。第一個邏輯磁碟機的擴充分區表中的第一項指向它自身的開機磁區。第二項指向下一個邏輯磁碟機的EBR。如果不存在進一步的邏輯磁碟機,第二項就不會使用,而且被記錄成一系列零。如果有附加的邏輯磁碟機,那麼第二個邏輯磁碟機的擴充分區表的第一項會指向它本身的開機磁區。第二個邏輯磁碟機的擴充分區表的第二項指向下一個邏輯磁碟機的EBR。擴充分區表的第三項和第四項永遠都不會被使用。
通過一幅4分區的磁碟結構圖可以看到磁碟的大致組織形式。5:
關於擴充分區,6所示,擴充分區中邏輯磁碟機的擴充引導記錄是一個串連表。該圖顯示了一個擴充分區上的三個邏輯磁碟機,說明了前面的邏輯磁碟機和最後一個邏輯磁碟機之間在擴充分區表中的差異。
除了擴充分區上最後一個邏輯磁碟機外,表2中所描述的擴充分區表的格式在每個邏輯磁碟機中都是重複的:第一個項標識了邏輯磁碟機本身的開機磁區,第二個項標識了下一個邏輯磁碟機的EBR。最後一個邏輯磁碟機的擴充分區表只會列出它本身的分區項。最後一個擴充分區表的第二個項到第四個項被使用。
表2 擴充分區表項的內容 |
| 擴充分區表項 |
分區表項的內容 |
| 第一個項 |
包括資料的開始地址在內的與擴充分區中當前邏輯磁碟機有關的資訊 |
| 第二個項 |
有關擴充分區中的下一個邏輯磁碟機的資訊,包括包含下一個邏輯磁碟機的EBR的扇區的地址。如果不存在進一步的邏輯磁碟機的話,該欄位不會被使用 |
| 第三個項 |
未用 |
| 第四個項 |
未用 |
擴充分區表項中的相對扇區數欄位所顯示的是從擴充分區開始到邏輯磁碟機中第一個扇區的位移的位元組數。總扇區數欄位中的數是指組成該邏輯磁碟機的扇區數目。總扇區數欄位的值等於從擴充分區表項所定義的開機磁區到邏輯磁碟機末尾的扇區數。
有時候在磁碟的末尾會有剩餘空間,剩餘空間是什麼呢?我們前面說到,分區是以1柱面的容量為分區粒度的,那麼如果磁碟總空間不是整數個柱面的話,不夠一個柱面的剩下的空間就是剩餘空間了,這部分空間並不參與分區,所以一般無法利用。照道理說,磁碟的物理模式決定了磁碟的總容量就應該是整數個柱面的容量,為什麼會有不夠一個柱面的空間呢。在我的理解看來,本來現在的磁碟為了更大的利用空間,一般在物理上並不是按照外圍的扇區大於裡圈的扇區這種管理方式,只是為了與作業系統相容而抽象出來CHS。可能其實際空間容量不一定正好為整數個柱面的容量吧。