?? 硬盤(pán)結(jié)構(gòu)簡(jiǎn)介.txt
字號(hào):
與分區(qū)無(wú)關(guān). 第一個(gè)塊地址為 0. 一般來(lái)說(shuō), BlockNum 與 CHS地址的關(guān)系
是:
BlockNum = cylinder * NumberOfHeads +
head *SectorsPerTrack +
sector - 1;
其中 cylinder, head, sector 是 CHS 地址,NumberOfHeads 是磁盤(pán)
的磁頭數(shù), SectorsPerTrack 是磁盤(pán)每磁道的扇區(qū)數(shù).
也就是說(shuō) BlockNum 是沿著 扇區(qū)->磁道->柱面的順序記數(shù)的. 這一順
序是由磁盤(pán)控制器虛擬的,磁盤(pán)表面數(shù)據(jù)塊的實(shí)際排列順序可能與此不同
(如為了提高磁盤(pán)速度而設(shè)置的間隔因子將會(huì)打亂扇區(qū)的排列順序).
3. 驅(qū)動(dòng)器參數(shù)數(shù)據(jù)包 Drive Parameters Packet
驅(qū)動(dòng)器參數(shù)數(shù)據(jù)包是在擴(kuò)展 Int13H的取得驅(qū)動(dòng)器參數(shù)子功能調(diào)用中
使用的數(shù)據(jù)包. 格式如下:
struct DriveParametersPacket
{
WORD InfoSize; // 數(shù)據(jù)包尺寸 (26 字節(jié))
WORD Flags; // 信息標(biāo)志
DWORD Cylinders; // 磁盤(pán)柱面數(shù)
DWORD Heads; // 磁盤(pán)磁頭數(shù)
DWORD SectorsPerTrack; //每磁道扇區(qū)數(shù)
QWORD Sectors; // 磁盤(pán)總扇區(qū)數(shù)
WORD SectorSize; // 扇區(qū)尺寸 (以字節(jié)為單位)
};
信息標(biāo)志用于返回磁盤(pán)的附加信息, 每一位的定義如下:
0 位:
0 = 可能發(fā)生 DMA 邊界錯(cuò)誤
1 = DMA 邊界錯(cuò)誤將被透明處理
如果這位置 1, 表示 BIOS 將自動(dòng)處理 DMA邊界錯(cuò)誤, 也就是說(shuō)
錯(cuò)誤代碼 09H 永遠(yuǎn)也不會(huì)出現(xiàn).
1 位:
0 = 未提供 CHS 信息
1 = CHS 信息合法
如果塊設(shè)備的傳統(tǒng) CHS幾何信息不適當(dāng)?shù)脑?huà), 該位將置 0.
2 位:
0 = 驅(qū)動(dòng)器不可移動(dòng)
1 = 驅(qū)動(dòng)器可移動(dòng)
3 位: 表示該驅(qū)動(dòng)器是否支持寫(xiě)入時(shí)校驗(yàn).
4 位:
0 = 驅(qū)動(dòng)器不具備介質(zhì)更換檢測(cè)線(xiàn)
1 = 驅(qū)動(dòng)器具備介質(zhì)更換檢測(cè)線(xiàn)
5 位:
0 = 驅(qū)動(dòng)器不可鎖定
1 = 驅(qū)動(dòng)器可以鎖定
要存取驅(qū)動(dòng)器號(hào)大于 0x80 的可移動(dòng)驅(qū)動(dòng)器,該位必須置 1
(某些驅(qū)動(dòng)器號(hào)為 0 到 0x7F的設(shè)備也需要置位)
6 位:
0 = CHS 值是當(dāng)前存儲(chǔ)介質(zhì)的值(僅對(duì)于可移動(dòng)介質(zhì)), 如果
驅(qū)動(dòng)器中有存儲(chǔ)介質(zhì), CHS 值將被返回.
1 = CHS 值是驅(qū)動(dòng)器支持的最大值(此時(shí)驅(qū)動(dòng)器中沒(méi)有介質(zhì)).
7 - 15 位: 保留, 必須置 0.
(未完 待續(xù))
標(biāo) 題: HardDisk,Partition,Boot,OSLoader專(zhuān)題(4)
三. 接口規(guī)范
1. 寄存器約定
在擴(kuò)展 Int13H 調(diào)用中一般使用如下寄存器約定:
DS:SI ==> 磁盤(pán)地址數(shù)據(jù)包( disk address packet)
dl ==> 驅(qū)動(dòng)器號(hào)
ah ==> 功能代碼 / 返回碼
在基本 Int13H 調(diào)用中, 0 - 0x7F之間的驅(qū)動(dòng)器號(hào)代表可移動(dòng)驅(qū)動(dòng)器
0x80 - 0xFF 之間的驅(qū)動(dòng)器號(hào)代表固定驅(qū)動(dòng)器. 但在擴(kuò)展 Int13H調(diào)用中
0x80 - 0xFF 之間還包括一些新出現(xiàn)的可移動(dòng)驅(qū)動(dòng)器, 比如活動(dòng)硬盤(pán)等.
這些驅(qū)動(dòng)器支持先進(jìn)的鎖定,解鎖等功能.
ah 返回的錯(cuò)誤碼除了標(biāo)準(zhǔn) Int13H調(diào)用規(guī)定的基本錯(cuò)誤碼以外,又增加
了以下錯(cuò)誤碼:
B0h 驅(qū)動(dòng)器中的介質(zhì)未被鎖定
B1h 驅(qū)動(dòng)器中的介質(zhì)已經(jīng)鎖定
B2h 介質(zhì)是可移動(dòng)的
B3h 介質(zhì)正在被使用
B4h 鎖定記數(shù)溢出
B5h 合法的彈出請(qǐng)求失敗
2. API 子集介紹
1.x 版的擴(kuò)展 Int13H 調(diào)用中規(guī)定了兩個(gè)主要的 API 子集.
第一個(gè)子集提供了訪(fǎng)問(wèn)大硬盤(pán)所必須的功能, 包括 檢查擴(kuò)展In13H
是否存在( 41h ), 擴(kuò)展讀( 42h ), 擴(kuò)展寫(xiě)( 43h ), 校驗(yàn)扇區(qū)( 44h ),
擴(kuò)展定位( 47h ) 和 取得驅(qū)動(dòng)器參數(shù)( 48h ).
第二個(gè)子集提供了對(duì)軟件控制驅(qū)動(dòng)器鎖定和彈出的支持, 包括檢查擴(kuò)展
Int13H 是否存在( 41h ), 鎖定/解鎖驅(qū)動(dòng)器( 45h ), 彈出驅(qū)動(dòng)器( 46h),
取得驅(qū)動(dòng)器參數(shù)( 48h ), 取得擴(kuò)展驅(qū)動(dòng)器改變狀態(tài)( 49h ), int 15h.
如果使用了調(diào)用規(guī)范中不支持的功能, BIOS 將返回錯(cuò)誤碼 ah =01h,
CF = 1.
3. API 詳解
1) 檢驗(yàn)擴(kuò)展功能是否存在
入口:
AH = 41h
BX = 55AAh
DL = 驅(qū)動(dòng)器號(hào)
返回:
CF = 0
AH = 擴(kuò)展功能的主版本號(hào)
AL = 內(nèi)部使用
BX = AA55h
CX = API 子集支持位圖
CF = 1
AH = 錯(cuò)誤碼 01h, 無(wú)效命令
這個(gè)調(diào)用檢驗(yàn)對(duì)特定的驅(qū)動(dòng)器是否存在擴(kuò)展功能.如果進(jìn)位標(biāo)志置 1
則此驅(qū)動(dòng)器不支持?jǐn)U展功能. 如果進(jìn)位標(biāo)志為 0, 同時(shí) BX = AA55h, 則
存在擴(kuò)展功能. 此時(shí) CX 的 0 位表示是否支持第一個(gè)子集,1位表示是否
支持第二個(gè)子集.
對(duì)于 1.x 版的擴(kuò)展 Int13H 來(lái)說(shuō), 主版本號(hào) AH = 1. AL是副版本號(hào),
但這僅限于 BIOS 內(nèi)部使用, 任何軟件不得檢查 AL 的值.
2) 擴(kuò)展讀
入口:
AH = 42h
DL = 驅(qū)動(dòng)器號(hào)
DS:SI = 磁盤(pán)地址數(shù)據(jù)包(Disk Address Packet)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 錯(cuò)誤碼
這個(gè)調(diào)用將磁盤(pán)上的數(shù)據(jù)讀入內(nèi)存. 如果出現(xiàn)錯(cuò)誤, DAP 的BlockCount
項(xiàng)中則記錄了出錯(cuò)前實(shí)際讀取的數(shù)據(jù)塊個(gè)數(shù).
3) 擴(kuò)展寫(xiě)
入口:
AH = 43h
AL
0 位 = 0 關(guān)閉寫(xiě)校驗(yàn)
1 打開(kāi)寫(xiě)校驗(yàn)
1 - 7 位保留, 置 0
DL = 驅(qū)動(dòng)器號(hào)
DS:SI = 磁盤(pán)地址數(shù)據(jù)包(DAP)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 錯(cuò)誤碼
這個(gè)調(diào)用將內(nèi)存中的數(shù)據(jù)寫(xiě)入磁盤(pán). 如果打開(kāi)了寫(xiě)校驗(yàn)選項(xiàng),但 BIOS
不支持, 則會(huì)返回錯(cuò)誤碼 AH = 01h, CF = 1. 功能 48h可以檢測(cè)BIOS是否
支持寫(xiě)校驗(yàn).
如果出現(xiàn)錯(cuò)誤, DAP 的 BlockCount項(xiàng)中則記錄了出錯(cuò)前實(shí)際寫(xiě)入的數(shù)
據(jù)塊個(gè)數(shù).
4) 校驗(yàn)扇區(qū)
入口:
AH = 44h
DL = 驅(qū)動(dòng)器號(hào)
DS:SI = 磁盤(pán)地址數(shù)據(jù)包(Disk Address Packet)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 錯(cuò)誤碼
這個(gè)調(diào)用校驗(yàn)磁盤(pán)數(shù)據(jù),但并不將數(shù)據(jù)讀入內(nèi)存.如果出現(xiàn)錯(cuò)誤, DAP 的
BlockCount 項(xiàng)中則記錄了出錯(cuò)前實(shí)際校驗(yàn)的數(shù)據(jù)塊個(gè)數(shù).
(未完 待續(xù))
標(biāo) 題: HardDisk,Partition,Boot,OSLoader專(zhuān)題(5)
5) 鎖定/解鎖驅(qū)動(dòng)器
入口:
AH = 45h
AL
= 0 鎖定驅(qū)動(dòng)器
= 1 驅(qū)動(dòng)器解鎖
= 02 返回鎖定/解鎖狀態(tài)
= 03h-FFh - 保留
DL = 驅(qū)動(dòng)器號(hào)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 錯(cuò)誤碼
這個(gè)調(diào)用用來(lái)縮定指定驅(qū)動(dòng)器中的介質(zhì).
所有標(biāo)號(hào)大于等于 0x80 的可移動(dòng)驅(qū)動(dòng)器必須支持這個(gè)功能.如果
在支持可移動(dòng)驅(qū)動(dòng)器控制功能子集的固定驅(qū)動(dòng)器上使用這個(gè)功能調(diào)用,將
會(huì)成功返回.
驅(qū)動(dòng)器必須支持最大255次鎖定, 在所有鎖定被解鎖之前,不能在物理上
將驅(qū)動(dòng)器解鎖. 解鎖一個(gè)未鎖定的驅(qū)動(dòng)器,將返回錯(cuò)誤碼 AH= B0h.如果鎖定一
個(gè)已鎖定了255次的驅(qū)動(dòng)器, 將返回錯(cuò)誤碼 AH = B4h.
鎖定一個(gè)沒(méi)有介質(zhì)的驅(qū)動(dòng)器是合法的.
6) 彈出可移動(dòng)驅(qū)動(dòng)器中的介質(zhì)
入口:
AH = 46h
AL = 0 保留
DL = 驅(qū)動(dòng)器號(hào)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 錯(cuò)誤碼
這個(gè)調(diào)用用來(lái)彈出指定的可移動(dòng)驅(qū)動(dòng)器中的介質(zhì).
所有標(biāo)號(hào)大于等于 0x80 的可移動(dòng)驅(qū)動(dòng)器必須支持這個(gè)功能.如果
在支持可移動(dòng)驅(qū)動(dòng)器控制功能子集的固定驅(qū)動(dòng)器上使用這個(gè)功能調(diào)用,將
會(huì)返回錯(cuò)誤碼 AH = B2h (介質(zhì)不可移動(dòng)).如果試圖彈出一個(gè)被鎖定的介質(zhì)
將返回錯(cuò)誤碼 AH = B1h (介質(zhì)被鎖定).
如果試圖彈出一個(gè)沒(méi)有介質(zhì)的驅(qū)動(dòng)器, 則返回錯(cuò)誤碼 Ah =31h (驅(qū)動(dòng)器
中沒(méi)有介質(zhì)).
如果試圖彈出一個(gè)未鎖定的可移動(dòng)驅(qū)動(dòng)器中的介質(zhì),Int13h會(huì)調(diào)用 Int15h
(AH = 52h) 來(lái)檢查彈出請(qǐng)求能否執(zhí)行.如果彈出請(qǐng)求被拒絕則返回錯(cuò)誤碼(同
Int15h). 如果彈出請(qǐng)求被接受,但出現(xiàn)了其他錯(cuò)誤, 則返回錯(cuò)誤碼 AH =B5h.
7) 擴(kuò)展定位
入口:
AH = 47h
DL = 驅(qū)動(dòng)器號(hào)
DS:SI = 磁盤(pán)地址數(shù)據(jù)包(Disk Address Packet)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 錯(cuò)誤碼
這個(gè)調(diào)用將磁頭定位到指定扇區(qū).
8) 取得驅(qū)動(dòng)器參數(shù)
入口:
AH = 48h
DL = 驅(qū)動(dòng)器號(hào)
DS:SI = 返回?cái)?shù)據(jù)緩沖區(qū)地址
返回:
CF = 0, AH = 0 成功
DS:SI 驅(qū)動(dòng)器參數(shù)數(shù)據(jù)包地址,(參見(jiàn)前面的文章)
CF = 1, AH = 錯(cuò)誤碼
這個(gè)調(diào)用返回指定驅(qū)動(dòng)器的參數(shù).
9) 取得擴(kuò)展驅(qū)動(dòng)器介質(zhì)更換檢測(cè)線(xiàn)狀態(tài)
入口:
AH = 49h
DL = 驅(qū)動(dòng)器號(hào)
返回:
CF = 0, AH = 0 介質(zhì)未更換
CF = 1, AH = 06h 介質(zhì)可能已更換
這個(gè)調(diào)用返回指定驅(qū)動(dòng)器的介質(zhì)更換狀態(tài).
這個(gè)調(diào)用與 Int13h AH = 16h 子功能調(diào)用相同,只是允許任何驅(qū)動(dòng)器
標(biāo)號(hào).如果對(duì)一臺(tái)支持可移動(dòng)介質(zhì)功能子集的固定驅(qū)動(dòng)器使用此功能,則永遠(yuǎn)
返回 CF = 0, AH = 0.
簡(jiǎn)單地將可移動(dòng)介質(zhì)鎖定再解鎖就可以激活檢測(cè)線(xiàn),而無(wú)須真正更換介質(zhì).
10) Int 15h 可移動(dòng)介質(zhì)彈出支持
入口:
AH = 52h
DL = 驅(qū)動(dòng)器號(hào)
返回:
CF = 0, AH = 0 彈出請(qǐng)求可能可以執(zhí)行
CF = 1, AH = 錯(cuò)誤碼 B1h 或 B3h 彈出請(qǐng)求不能執(zhí)行
這個(gè)調(diào)用是由 Int13h AH=46h彈出介質(zhì)功能調(diào)用內(nèi)部使用的
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -