?? 硬盤結(jié)構(gòu)簡介.txt
字號:
硬盤結(jié)構(gòu)簡介
作者:未知 來源:未知 加入時間:2003-7-12
硬盤結(jié)構(gòu)簡介
第一部分 簡 介
1,1
一. 硬盤結(jié)構(gòu)簡介
1. 硬盤參數(shù)釋疑
到目前為止, 人們常說的硬盤參數(shù)還是古老的 CHS(Cylinder/Head/Sector)
參數(shù). 那么為什么要使用這些參數(shù),它們的意義是什么?它們的取值范圍是什么?
很久以前, 硬盤的容量還非常小的時候,人們采用與軟盤類似的結(jié)構(gòu)生產(chǎn)硬
盤. 也就是硬盤盤片的每一條磁道都具有相同的扇區(qū)數(shù).由此產(chǎn)生了所謂的3D參
數(shù) (Disk Geometry). 既磁頭數(shù)(Heads), 柱面數(shù)(Cylinders),扇區(qū)數(shù)(Sectors),
以及相應(yīng)的尋址方式.
其中:
磁頭數(shù)(Heads)表示硬盤總共有幾個磁頭,也就是有幾面盤片, 最大
為 255 (用 8 個二進(jìn)制位存儲);
柱面數(shù)(Cylinders) 表示硬盤每一面盤片上有幾條磁道,最大為 1023
(用 10 個二進(jìn)制位存儲);
扇區(qū)數(shù)(Sectors) 表示每一條磁道上有幾個扇區(qū), 最大為 63(用 6
個二進(jìn)制位存儲).
每個扇區(qū)一般是 512個字節(jié), 理論上講這不是必須的,但好象沒有取
別的值的.
所以磁盤最大容量為:
255 * 1023 * 63 * 512 / 1048576 = 8024 GB ( 1M =1048576 Bytes )
或硬盤廠商常用的單位:
255 * 1023 * 63 * 512 / 1000000 = 8414 GB ( 1M =1000000 Bytes )
在 CHS 尋址方式中, 磁頭, 柱面, 扇區(qū)的取值范圍分別為 0到 Heads - 1,
0 到 Cylinders - 1, 1 到 Sectors (注意是從 1 開始).
2. 基本 Int 13H 調(diào)用簡介
BIOS Int 13H 調(diào)用是 BIOS提供的磁盤基本輸入輸出中斷調(diào)用, 它可以
完成磁盤(包括硬盤和軟盤)的復(fù)位, 讀寫, 校驗(yàn), 定位, 診斷,格式化等功能.
它使用的就是 CHS 尋址方式, 因此最大識能訪問 8 GB 左右的硬盤 (本文中
如不作特殊說明, 均以 1M = 1048576 字節(jié)為單位).
3. 現(xiàn)代硬盤結(jié)構(gòu)簡介
在老式硬盤中, 由于每個磁道的扇區(qū)數(shù)相等,所以外道的記錄密度要遠(yuǎn)低
于內(nèi)道, 因此會浪費(fèi)很多磁盤空間 (與軟盤一樣). 為了解決這一問題,進(jìn)一
步提高硬盤容量, 人們改用等密度結(jié)構(gòu)生產(chǎn)硬盤. 也就是說,外圈磁道的扇區(qū)
比內(nèi)圈磁道多. 采用這種結(jié)構(gòu)后, 硬盤不再具有實(shí)際的3D參數(shù),尋址方式也改
為線性尋址, 即以扇區(qū)為單位進(jìn)行尋址.
為了與使用3D尋址的老軟件兼容 (如使用BIOSInt13H接口的軟件), 在硬
盤控制器內(nèi)部安裝了一個地址翻譯器,由它負(fù)責(zé)將老式3D參數(shù)翻譯成新的線性
參數(shù). 這也是為什么現(xiàn)在硬盤的3D參數(shù)可以有多種選擇的原因(不同的工作模
式, 對應(yīng)不同的3D參數(shù), 如 LBA, LARGE, NORMAL).
4. 擴(kuò)展 Int 13H 簡介
雖然現(xiàn)代硬盤都已經(jīng)采用了線性尋址, 但是由于基本 Int13H 的制約, 使
用 BIOS Int 13H 接口的程序, 如 DOS 等還只能訪問 8 G以內(nèi)的硬盤空間.
為了打破這一限制, Microsoft 等幾家公司制定了擴(kuò)展 Int 13H 標(biāo)準(zhǔn)
(Extended Int13H), 采用線性尋址方式存取硬盤, 所以突破了 8 G的限制,
而且還加入了對可拆卸介質(zhì) (如活動硬盤) 的支持.
二. Boot Sector 結(jié)構(gòu)簡介
1. Boot Sector 的組成
Boot Sector 也就是硬盤的第一個扇區(qū), 它由 MBR (MasterBoot Record),
DPT (Disk Partition Table) 和 Boot Record ID 三部分組成.
MBR 又稱作主引導(dǎo)記錄占用 Boot Sector 的前 446 個字節(jié)( 0 to 0x1BD ),
存放系統(tǒng)主引導(dǎo)程序 (它負(fù)責(zé)從活動分區(qū)中裝載并運(yùn)行系統(tǒng)引導(dǎo)程序).
DPT 即主分區(qū)表占用 64 個字節(jié) (0x1BE to 0x1FD),記錄了磁盤的基本分區(qū)
信息. 主分區(qū)表分為四個分區(qū)項, 每項 16 字節(jié),分別記錄了每個主分區(qū)的信息
(因此最多可以有四個主分區(qū)).
Boot Record ID 即引導(dǎo)區(qū)標(biāo)記占用兩個字節(jié) (0x1FE and0x1FF), 對于合法
引導(dǎo)區(qū), 它等于 0xAA55, 這是判別引導(dǎo)區(qū)是否合法的標(biāo)志.
Boot Sector 的具體結(jié)構(gòu)如下圖所示 (參見 NightOwl大俠的文章):
下面還有喔 (39%) │ 結(jié)束 ← <q> │ ↑/↓/PgUp/PgDn 移動│ ? 輔助說明 │
0000 ¦------------------------------------------------¦
¦ ¦
¦ ¦
¦ Master Boot Record ¦
¦ ¦
¦ ¦
¦ 主引導(dǎo)記錄(446字節(jié)) ¦
¦ ¦
¦ ¦
¦ ¦
01BD ¦ ¦
01BE ¦------------------------------------------------¦
¦ ¦
01CD ¦ 分區(qū)信息 1(16字節(jié)) ¦
01CE ¦------------------------------------------------¦
¦ ¦
01DD ¦ 分區(qū)信息 2(16字節(jié)) ¦
01DE ¦------------------------------------------------¦
¦ ¦
01ED ¦ 分區(qū)信息 3(16字節(jié)) ¦
01EE ¦------------------------------------------------¦
¦ ¦
01FD ¦ 分區(qū)信息 4(16字節(jié)) ¦
¦------------------------------------------------¦
¦ 01FE ¦01FF ¦
¦ 55 ¦ AA ¦
¦------------------------------------------------¦
2. 分區(qū)表結(jié)構(gòu)簡介
分區(qū)表由四個分區(qū)項構(gòu)成, 每一項的結(jié)構(gòu)如下:
BYTE State : 分區(qū)狀態(tài), 0 =未激活, 0x80 = 激活 (注意此項)
BYTE StartHead : 分區(qū)起始磁頭號
WORD StartSC : 分區(qū)起始扇區(qū)和柱面號,底字節(jié)的低6位為扇區(qū)號,
高2位為柱面號的第 9,10 位, 高字節(jié)為柱面號的低 8 位
BYTE Type : 分區(qū)類型, 如0x0B = FAT32, 0x83 = Linux 等,
00 表示此項未用,07 = NTFS
BYTE EndHead : 分區(qū)結(jié)束磁頭號
WORD EndSC :分區(qū)結(jié)束扇區(qū)和柱面號, 定義同前
DWORD Relative :在線性尋址方式下的分區(qū)相對扇區(qū)地址
(對于基本分區(qū)即為絕對地址)
DWORD Sectors : 分區(qū)大小 (總扇區(qū)數(shù))
注意: 在 DOS / Windows 系統(tǒng)下,基本分區(qū)必須以柱面為單位劃分
( Sectors * Heads 個扇區(qū)), 如對于 CHS 為 764/255/63 的硬盤,分區(qū)的
最小尺寸為 255 * 63 * 512 / 1048576 = 7.844 MB.
3. 擴(kuò)展分區(qū)簡介
由于主分區(qū)表中只能分四個分區(qū), 無法滿足需求,因此設(shè)計了一種擴(kuò)展
分區(qū)格式. 基本上說, 擴(kuò)展分區(qū)的信息是以鏈表形式存放的,但也有一些特
別的地方.
首先, 主分區(qū)表中要有一個基本擴(kuò)展分區(qū)項,所有擴(kuò)展分區(qū)都隸屬于它,
也就是說其他所有擴(kuò)展分區(qū)的空間都必須包括在這個基本擴(kuò)展分區(qū)中.對于
DOS / Windows 來說, 擴(kuò)展分區(qū)的類型為 0x05.
除基本擴(kuò)展分區(qū)以外的其他所有擴(kuò)展分區(qū)則以鏈表的形式級聯(lián)存放, 后
一個擴(kuò)展分區(qū)的數(shù)據(jù)項記錄在前一個擴(kuò)展分區(qū)的分區(qū)表中,但兩個擴(kuò)展分區(qū)
的空間并不重疊.
擴(kuò)展分區(qū)類似于一個完整的硬盤, 必須進(jìn)一步分區(qū)才能使用.但每個擴(kuò)
展分區(qū)中只能存在一個其他分區(qū). 此分區(qū)在 DOS/Windows環(huán)境中即為邏輯盤.
因此每一個擴(kuò)展分區(qū)的分區(qū)表(同樣存儲在擴(kuò)展分區(qū)的第一個扇區(qū)中)中最多
只能有兩個分區(qū)數(shù)據(jù)項(包括下一個擴(kuò)展分區(qū)的數(shù)據(jù)項).
擴(kuò)展分區(qū)和邏輯盤的示意圖如下:
¦-----------------------¦ --------
¦ 主擴(kuò)展分區(qū)(/dev/hda2) ¦ ^
¦-----------------------¦ ¦
¦ 擴(kuò) 展 ¦ 分區(qū)項1 ¦--\ ¦
¦ ¦------------¦ ¦ ¦
¦ 分區(qū)表 ¦ 分區(qū)項 2 ¦--+--\ ¦
¦-----------------------¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦
¦ 邏輯盤 1 (/dev/hda5) ¦<-/ ¦ ¦
¦ ¦ ¦ ¦
¦-----------------------¦ ¦ 主
¦ 擴(kuò)展分區(qū) 2 ¦<----/
¦-----------------------¦ 擴(kuò)
¦ 擴(kuò) 展 ¦ 分區(qū)項1 ¦-- ¦ ¦------------¦ ¦ 展
¦ 分區(qū)表 ¦ 分區(qū)項 2 ¦--+-- ¦-----------------------¦ ¦ ¦ 分
¦ ¦ ¦ ¦
¦ 邏輯盤 2 (/dev/hda6) ¦<-/ ¦ 區(qū)
¦ ¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ 擴(kuò)展分區(qū) 3 ¦<----/ ¦
¦-----------------------¦ ¦
¦ 擴(kuò) 展 ¦ 分區(qū)項1 ¦--\ ¦
¦ ¦------------¦ ¦ ¦
¦ 分區(qū)表 ¦ 分區(qū)項 2 ¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ ¦ ¦ ¦
¦ 邏輯盤 3 (/dev/hda7) ¦<-/ ¦
¦ ¦ ¦
¦-----------------------¦ ---------
¦ 擴(kuò) 展 ¦ 分區(qū)項1 ¦-- ¦ ¦------------¦ ¦ 展
¦ 分區(qū)表 ¦ 分區(qū)項 2 ¦--+-- ¦-----------------------¦ ¦ ¦ 分
¦ ¦ ¦ ¦
¦ 邏輯盤 2 (/dev/hda6) ¦<-/ ¦ 區(qū)
¦ ¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ 擴(kuò)展分區(qū) 3 ¦<----/ ¦
¦-----------------------¦ ¦
¦ 擴(kuò) 展 ¦ 分區(qū)項1 ¦--\ ¦
¦ ¦------------¦ ¦ ¦
¦ 分區(qū)表 ¦ 分區(qū)項 2 ¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ ¦ ¦ ¦
¦ 邏輯盤 3 (/dev/hda7) ¦<-/ ¦
¦ ¦ ¦
¦-----------------------¦ ---------
(未完 待續(xù))
標(biāo) 題: HardDisk,Partition,Boot,OSLoader專題(2)
三. 系統(tǒng)啟動過程簡介
系統(tǒng)啟動過程主要由一下幾步組成(以硬盤啟動為例):
1. 開機(jī) :-)
2. BIOS 加電自檢 ( Power On Self Test -- POST )
內(nèi)存地址為 0ffff:0000
3. 將硬盤第一個扇區(qū) (0頭0道1扇區(qū), 也就是BootSector)
讀入內(nèi)存地址 0000:7c00 處.
4. 檢查 (WORD) 0000:7dfe 是否等于 0xaa55,若不等于
則轉(zhuǎn)去嘗試其他啟動介質(zhì),如果沒有其他啟動介質(zhì)則顯示
"No ROM BASIC" 然后死機(jī).
5. 跳轉(zhuǎn)到 0000:7c00 處執(zhí)行 MBR 中的程序.
6. MBR 首先將自己復(fù)制到 0000:0600 處,然后繼續(xù)執(zhí)行.
7. 在主分區(qū)表中搜索標(biāo)志為活動的分區(qū).如果發(fā)現(xiàn)沒有活動
分區(qū)或有不止一個活動分區(qū), 則轉(zhuǎn)停止.
8. 將活動分區(qū)的第一個扇區(qū)讀入內(nèi)存地址 0000:7c00處.
9. 檢查 (WORD) 0000:7dfe 是否等于 0xaa55,若不等于則
顯示 "Missing Operating System" 然后停止,或嘗試
軟盤啟動.
10. 跳轉(zhuǎn)到 0000:7c00處繼續(xù)執(zhí)行特定系統(tǒng)的啟動程序.
11. 啟動系統(tǒng) ...
以上步驟中 2,3,4,5 步是由 BIOS 的引導(dǎo)程序完成.6,7,8,9,10
步由MBR中的引導(dǎo)程序完成.
一般多系統(tǒng)引導(dǎo)程序 (如 SmartFDISK, BootStar, PQBoot等)
都是將標(biāo)準(zhǔn)主引導(dǎo)記錄替換成自己的引導(dǎo)程序, 在運(yùn)行系統(tǒng)啟動程序
之前讓用戶選擇要啟動的分區(qū).
而某些系統(tǒng)自帶的多系統(tǒng)引導(dǎo)程序 (如 lilo, NT Loader等)
則可以將自己的引導(dǎo)程序放在系統(tǒng)所處分區(qū)的第一個扇區(qū)中, 在 Linux
中即為 SuperBlock (其實(shí) SuperBlock 是兩個扇區(qū)).
注: 以上各步驟中使用的是標(biāo)準(zhǔn) MBR,其他多系統(tǒng)引導(dǎo)程序的引導(dǎo)
過程與此不同.
標(biāo) 題: Harddisk,Partition,Boot,OSLoader專題(3)
第二部分 技術(shù)資料
第一章 擴(kuò)展 Int13H 技術(shù)資料
一. 簡介
設(shè)計擴(kuò)展 Int13H 接口的目的是為了擴(kuò)展 BIOS 的功能,使其支持
多于1024柱面的硬盤, 以及可移動介質(zhì)的瑣定, 解鎖及彈出等功能.
二. 數(shù)據(jù)結(jié)構(gòu)
1. 數(shù)據(jù)類型約定
BYTE 1 字節(jié)整型 ( 8 位 )
WORD 2 字節(jié)整型 ( 16 位 )
DWORD 4 字節(jié)整型 ( 32 位 )
QWORD 8 字節(jié)整型 ( 64 位 )
2. 磁盤地址數(shù)據(jù)包 Disk Address Packet (DAP)
DAP 是基于絕對扇區(qū)地址的, 因此利用 DAP, Int13H可以輕松地逾
越 1024 柱面的限制, 因?yàn)樗揪筒恍枰?CHS 的概念.
DAP 的結(jié)構(gòu)如下:
struct DiskAddressPacket
{
BYTE PacketSize; //數(shù)據(jù)包尺寸(16字節(jié))
BYTE Reserved; //==0
WORD BlockCount; //要傳輸?shù)臄?shù)據(jù)塊個數(shù)(以扇區(qū)為單位)
DWORD BufferAddr; //傳輸緩沖地址(segment:offset)
QWORD BlockNum; //磁盤起始絕對塊地址
};
PacketSize 保存了 DAP 結(jié)構(gòu)的尺寸,以便將來對其進(jìn)行擴(kuò)充. 在
目前使用的擴(kuò)展 Int13H 版本中 PacketSize 恒等于 16. 如果它小于
BlockCount 對于輸入來說是需要傳輸?shù)臄?shù)據(jù)塊總數(shù),對于輸出來說
是實(shí)際傳輸?shù)臄?shù)據(jù)塊個數(shù). BlockCount = 0 表示不傳輸任何數(shù)據(jù)塊.
BufferAddr 是傳輸數(shù)據(jù)緩沖區(qū)的 32 位地址(段地址:偏移量). 數(shù)據(jù)
緩沖區(qū)必須位于常規(guī)內(nèi)存以內(nèi)(1M).
BlockNum表示的是從磁盤開始算起的絕對塊地址(以扇區(qū)為單位),
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
減小字號
Ctrl + -