?? 硬盤結構.htm
字號:
<BR> &brvbar; 擴 展 &brvbar; 分區項1 &brvbar;-- &brvbar;
&brvbar;------------&brvbar; &brvbar; 展
<BR> &brvbar; 分區表 &brvbar; 分區項 2
&brvbar;--+-- &brvbar;-----------------------&brvbar;
&brvbar; &brvbar; 分 <BR> &brvbar;
&brvbar; &brvbar; &brvbar; <BR> &brvbar; 邏輯盤 2
(/dev/hda6) &brvbar;<-/ &brvbar; 區
<BR> &brvbar; &brvbar; &brvbar;
&brvbar;
<BR> &brvbar;-----------------------&brvbar;
&brvbar; &brvbar; <BR> &brvbar; 擴展分區 3
&brvbar;<----/ &brvbar;
<BR> &brvbar;-----------------------&brvbar;
&brvbar;
<BR> &brvbar; 擴 展 &brvbar; 分區項1 &brvbar;--\
&brvbar; <BR> &brvbar;
&brvbar;------------&brvbar; &brvbar;
&brvbar; <BR> &brvbar; 分區表 &brvbar; 分區項 2
&brvbar; &brvbar; &brvbar;
<BR> &brvbar;-----------------------&brvbar; &brvbar;
&brvbar; <BR> &brvbar;
&brvbar; &brvbar; &brvbar; <BR> &brvbar;
邏輯盤 3 (/dev/hda7) &brvbar;<-/ &brvbar;
<BR> &brvbar; &brvbar; &brvbar;
<BR> &brvbar;-----------------------&brvbar; ---------
<BR><BR><BR>(未完 待續) <BR><BR>標 題:
HardDisk,Partition,Boot,OSLoader專題(2) <BR><BR>三. 系統啟動過程簡介
<BR><BR> 系統啟動過程主要由一下幾步組成(以硬盤啟動為例): <BR><BR> 1. 開機 :-) <BR> 2.
BIOS 加電自檢 ( Power On Self Test -- POST ) <BR> 內存地址為 0ffff:0000
<BR> 3. 將硬盤第一個扇區 (0頭0道1扇區, 也就是BootSector) <BR> 讀入內存地址 0000:7c00
處. <BR> 4. 檢查 (WORD) 0000:7dfe 是否等于 0xaa55,若不等于
<BR> 則轉去嘗試其他啟動介質,如果沒有其他啟動介質則顯示 <BR> "No ROM BASIC" 然后死機.
<BR> 5. 跳轉到 0000:7c00 處執行 MBR 中的程序. <BR> 6. MBR 首先將自己復制到 0000:0600
處,然后繼續執行. <BR> 7. 在主分區表中搜索標志為活動的分區.如果發現沒有活動 <BR> 分區或有不止一個活動分區,
則轉停止. <BR> 8. 將活動分區的第一個扇區讀入內存地址 0000:7c00處. <BR> 9. 檢查 (WORD)
0000:7dfe 是否等于 0xaa55,若不等于則 <BR> 顯示 "Missing Operating System"
然后停止,或嘗試 <BR> 軟盤啟動. <BR> 10. 跳轉到 0000:7c00處繼續執行特定系統的啟動程序.
<BR> 11. 啟動系統 ... <BR><BR> 以上步驟中 2,3,4,5 步是由 BIOS
的引導程序完成.6,7,8,9,10 <BR>步由MBR中的引導程序完成. <BR><BR> 一般多系統引導程序 (如
SmartFDISK, BootStar, PQBoot等) <BR>都是將標準主引導記錄替換成自己的引導程序, 在運行系統啟動程序
<BR>之前讓用戶選擇要啟動的分區. <BR> 而某些系統自帶的多系統引導程序 (如 lilo, NT Loader等)
<BR>則可以將自己的引導程序放在系統所處分區的第一個扇區中, 在 Linux <BR>中即為 SuperBlock (其實
SuperBlock 是兩個扇區). <BR><BR> 注: 以上各步驟中使用的是標準 MBR,其他多系統引導程序的引導
<BR>過程與此不同. <BR><BR><BR>標 題: Harddisk,Partition,Boot,OSLoader專題(3)
<BR><BR> 第二部分 技術資料 <BR>第一章 擴展 Int13H 技術資料 <BR><BR>一. 簡介 <BR> 設計擴展
Int13H 接口的目的是為了擴展 BIOS 的功能,使其支持 <BR>多于1024柱面的硬盤, 以及可移動介質的瑣定,
解鎖及彈出等功能. <BR><BR>二. 數據結構 <BR><BR>1. 數據類型約定 <BR> BYTE 1 字節整型 ( 8 位
) <BR> WORD 2 字節整型 ( 16 位 ) <BR> DWORD 4 字節整型 ( 32 位 )
<BR> QWORD 8 字節整型 ( 64 位 ) <BR><BR>2. 磁盤地址數據包 Disk Address Packet
(DAP) <BR> DAP 是基于絕對扇區地址的, 因此利用 DAP, Int13H可以輕松地逾 <BR>越 1024 柱面的限制,
因為它根本就不需要 CHS 的概念. <BR> DAP 的結構如下: <BR><BR> struct
DiskAddressPacket <BR> { <BR> BYTE PacketSize; //數據包尺寸(16字節)
<BR> BYTE Reserved; //==0 <BR> WORD
BlockCount; //要傳輸的數據塊個數(以扇區為單位) <BR> DWORD
BufferAddr; //傳輸緩沖地址(segment:offset) <BR> QWORD
BlockNum; //磁盤起始絕對塊地址 <BR> }; <BR><BR> PacketSize 保存了 DAP
結構的尺寸,以便將來對其進行擴充. 在 <BR>目前使用的擴展 Int13H 版本中 PacketSize 恒等于 16. 如果它小于
<BR>16, 擴展 Int13H 將返回錯誤碼( AH=01, CF=1 ). <BR> BlockCount
對于輸入來說是需要傳輸的數據塊總數,對于輸出來說 <BR>是實際傳輸的數據塊個數. BlockCount = 0 表示不傳輸任何數據塊.
<BR> BufferAddr 是傳輸數據緩沖區的 32 位地址(段地址:偏移量). 數據
<BR>緩沖區必須位于常規內存以內(1M). <BR> BlockNum表示的是從磁盤開始算起的絕對塊地址(以扇區為單位),
<BR>與分區無關. 第一個塊地址為 0. 一般來說, BlockNum 與 CHS地址的關系 <BR>是:
<BR> BlockNum = cylinder * NumberOfHeads + <BR> head
*SectorsPerTrack + <BR> sector - 1; <BR><BR> 其中 cylinder,
head, sector 是 CHS 地址,NumberOfHeads 是磁盤 <BR>的磁頭數, SectorsPerTrack
是磁盤每磁道的扇區數. <BR> 也就是說 BlockNum 是沿著 扇區->磁道->柱面的順序記數的. 這一順
<BR>序是由磁盤控制器虛擬的,磁盤表面數據塊的實際排列順序可能與此不同
<BR>(如為了提高磁盤速度而設置的間隔因子將會打亂扇區的排列順序). <BR><BR>3. 驅動器參數數據包 Drive
Parameters Packet <BR> 驅動器參數數據包是在擴展 Int13H的取得驅動器參數子功能調用中 <BR>使用的數據包.
格式如下: <BR> struct DriveParametersPacket <BR> { <BR> WORD
InfoSize; // 數據包尺寸 (26 字節) <BR> WORD Flags; // 信息標志
<BR> DWORD Cylinders; // 磁盤柱面數 <BR> DWORD Heads; //
磁盤磁頭數 <BR> DWORD SectorsPerTrack; //每磁道扇區數 <BR> QWORD
Sectors; // 磁盤總扇區數 <BR> WORD SectorSize; // 扇區尺寸 (以字節為單位)
<BR> }; <BR> 信息標志用于返回磁盤的附加信息, 每一位的定義如下: <BR><BR> 0 位: <BR> 0 =
可能發生 DMA 邊界錯誤 <BR> 1 = DMA 邊界錯誤將被透明處理 <BR> 如果這位置 1, 表示 BIOS
將自動處理 DMA邊界錯誤, 也就是說 <BR> 錯誤代碼 09H 永遠也不會出現. <BR><BR> 1 位:
<BR> 0 = 未提供 CHS 信息 <BR> 1 = CHS 信息合法 <BR> 如果塊設備的傳統
CHS幾何信息不適當的話, 該位將置 0. <BR><BR> 2 位: <BR> 0 = 驅動器不可移動 <BR> 1 =
驅動器可移動 <BR><BR> 3 位: 表示該驅動器是否支持寫入時校驗. <BR><BR> 4 位: <BR> 0 =
驅動器不具備介質更換檢測線 <BR> 1 = 驅動器具備介質更換檢測線 <BR><BR> 5 位: <BR> 0 =
驅動器不可鎖定 <BR> 1 = 驅動器可以鎖定 <BR> 要存取驅動器號大于 0x80 的可移動驅動器,該位必須置 1
<BR> (某些驅動器號為 0 到 0x7F的設備也需要置位) <BR> 6 位: <BR> 0 = CHS
值是當前存儲介質的值(僅對于可移動介質), 如果 <BR> 驅動器中有存儲介質, CHS 值將被返回. <BR> 1 =
CHS 值是驅動器支持的最大值(此時驅動器中沒有介質). <BR><BR> 7 - 15 位: 保留, 必須置 0.
<BR><BR>(未完 待續) <BR><BR>標 題: HardDisk,Partition,Boot,OSLoader專題(4)
<BR><BR>三. 接口規范 <BR><BR>1. 寄存器約定 <BR> 在擴展 Int13H 調用中一般使用如下寄存器約定:
<BR><BR> DS:SI ==> 磁盤地址數據包( disk address packet)
<BR> dl ==> 驅動器號 <BR> ah ==> 功能代碼 / 返回碼 <BR><BR> 在基本
Int13H 調用中, 0 - 0x7F之間的驅動器號代表可移動驅動器 <BR>0x80 - 0xFF 之間的驅動器號代表固定驅動器.
但在擴展 Int13H調用中 <BR>0x80 - 0xFF 之間還包括一些新出現的可移動驅動器, 比如活動硬盤等.
<BR>這些驅動器支持先進的鎖定,解鎖等功能. <BR> ah 返回的錯誤碼除了標準 Int13H調用規定的基本錯誤碼以外,又增加
<BR>了以下錯誤碼: <BR><BR> B0h 驅動器中的介質未被鎖定 <BR><BR> B1h 驅動器中的介質已經鎖定
<BR><BR> B2h 介質是可移動的 <BR><BR> B3h 介質正在被使用 <BR><BR> B4h 鎖定記數溢出
<BR><BR> B5h 合法的彈出請求失敗 <BR><BR>2. API 子集介紹 <BR> 1.x 版的擴展 Int13H
調用中規定了兩個主要的 API 子集. <BR><BR> 第一個子集提供了訪問大硬盤所必須的功能, 包括 檢查擴展In13H
<BR>是否存在( 41h ), 擴展讀( 42h ), 擴展寫( 43h ), 校驗扇區( 44h ), <BR>擴展定位( 47h
) 和 取得驅動器參數( 48h ). <BR> 第二個子集提供了對軟件控制驅動器鎖定和彈出的支持, 包括檢查擴展 <BR>Int13H
是否存在( 41h ), 鎖定/解鎖驅動器( 45h ), 彈出驅動器( 46h), <BR>取得驅動器參數( 48h ),
取得擴展驅動器改變狀態( 49h ), int 15h. <BR> 如果使用了調用規范中不支持的功能, BIOS 將返回錯誤碼 ah
=01h, <BR>CF = 1. <BR><BR>3. API 詳解 <BR><BR>1) 檢驗擴展功能是否存在 <BR>入口:
<BR> AH = 41h <BR> BX = 55AAh <BR> DL = 驅動器號 <BR><BR>返回: <BR> CF
= 0 <BR> AH = 擴展功能的主版本號 <BR> AL = 內部使用 <BR> BX = AA55h
<BR> CX = API 子集支持位圖 <BR> CF = 1 <BR> AH = 錯誤碼 01h, 無效命令
<BR><BR> 這個調用檢驗對特定的驅動器是否存在擴展功能.如果進位標志置 1 <BR>則此驅動器不支持擴展功能. 如果進位標志為
0, 同時 BX = AA55h, 則 <BR>存在擴展功能. 此時 CX 的 0 位表示是否支持第一個子集,1位表示是否
<BR>支持第二個子集. <BR> 對于 1.x 版的擴展 Int13H 來說, 主版本號 AH = 1. AL是副版本號,
<BR>但這僅限于 BIOS 內部使用, 任何軟件不得檢查 AL 的值. <BR><BR>2) 擴展讀 <BR>入口: <BR> AH
= 42h <BR> DL = 驅動器號 <BR> DS:SI = 磁盤地址數據包(Disk Address Packet)
<BR><BR>返回: <BR> CF = 0, AH = 0 成功 <BR> CF = 1, AH = 錯誤碼
<BR><BR> 這個調用將磁盤上的數據讀入內存. 如果出現錯誤, DAP 的BlockCount
<BR>項中則記錄了出錯前實際讀取的數據塊個數. <BR><BR>3) 擴展寫 <BR>入口: <BR> AH = 43h
<BR> AL <BR> 0 位 = 0 關閉寫校驗 <BR> 1 打開寫校驗 <BR> 1 - 7 位保留, 置
0 <BR> DL = 驅動器號 <BR> DS:SI = 磁盤地址數據包(DAP) <BR>返回: <BR> CF = 0,
AH = 0 成功 <BR> CF = 1, AH = 錯誤碼 <BR><BR> 這個調用將內存中的數據寫入磁盤.
如果打開了寫校驗選項,但 BIOS <BR>不支持, 則會返回錯誤碼 AH = 01h, CF = 1. 功能
48h可以檢測BIOS是否 <BR>支持寫校驗. <BR> 如果出現錯誤, DAP 的
BlockCount項中則記錄了出錯前實際寫入的數 <BR>據塊個數. <BR><BR>4) 校驗扇區 <BR>入口: <BR> AH
= 44h <BR> DL = 驅動器號 <BR> DS:SI = 磁盤地址數據包(Disk Address Packet)
<BR><BR>返回: <BR> CF = 0, AH = 0 成功 <BR> CF = 1, AH = 錯誤碼
<BR><BR> 這個調用校驗磁盤數據,但并不將數據讀入內存.如果出現錯誤, DAP 的 <BR>BlockCount
項中則記錄了出錯前實際校驗的數據塊個數. <BR><BR>(未完 待續) <BR><BR>標 題:
HardDisk,Partition,Boot,OSLoader專題(5) <BR><BR>5) 鎖定/解鎖驅動器 <BR>入口:
<BR> AH = 45h <BR> AL <BR> = 0 鎖定驅動器 <BR> = 1 驅動器解鎖
<BR> = 02 返回鎖定/解鎖狀態 <BR> = 03h-FFh - 保留 <BR> DL = 驅動器號
<BR><BR>返回: <BR> CF = 0, AH = 0 成功 <BR> CF = 1, AH = 錯誤碼
<BR><BR> 這個調用用來縮定指定驅動器中的介質. <BR> 所有標號大于等于 0x80 的可移動驅動器必須支持這個功能.如果
<BR>在支持可移動驅動器控制功能子集的固定驅動器上使用這個功能調用,將 <BR>會成功返回.
<BR> 驅動器必須支持最大255次鎖定, 在所有鎖定被解鎖之前,不能在物理上 <BR>將驅動器解鎖.
解鎖一個未鎖定的驅動器,將返回錯誤碼 AH= B0h.如果鎖定一 <BR>個已鎖定了255次的驅動器, 將返回錯誤碼 AH = B4h.
<BR> 鎖定一個沒有介質的驅動器是合法的. <BR><BR>6) 彈出可移動驅動器中的介質 <BR>入口: <BR> AH =
46h <BR> AL = 0 保留 <BR> DL = 驅動器號 <BR><BR>返回: <BR> CF = 0, AH = 0
成功 <BR> CF = 1, AH = 錯誤碼 <BR><BR> 這個調用用來彈出指定的可移動驅動器中的介質.
<BR> 所有標號大于等于 0x80 的可移動驅動器必須支持這個功能.如果
<BR>在支持可移動驅動器控制功能子集的固定驅動器上使用這個功能調用,將 <BR>會返回錯誤碼 AH = B2h
(介質不可移動).如果試圖彈出一個被鎖定的介質 <BR>將返回錯誤碼 AH = B1h (介質被鎖定).
<BR> 如果試圖彈出一個沒有介質的驅動器, 則返回錯誤碼 Ah =31h (驅動器 <BR>中沒有介質).
<BR> 如果試圖彈出一個未鎖定的可移動驅動器中的介質,Int13h會調用 Int15h <BR>(AH = 52h)
來檢查彈出請求能否執行.如果彈出請求被拒絕則返回錯誤碼(同 <BR>Int15h). 如果彈出請求被接受,但出現了其他錯誤,
則返回錯誤碼 AH =B5h. <BR><BR>7) 擴展定位 <BR>入口: <BR> AH = 47h <BR> DL =
驅動器號 <BR> DS:SI = 磁盤地址數據包(Disk Address Packet) <BR><BR>返回: <BR> CF
= 0, AH = 0 成功 <BR> CF = 1, AH = 錯誤碼 <BR><BR> 這個調用將磁頭定位到指定扇區.
<BR><BR>8) 取得驅動器參數 <BR>入口: <BR> AH = 48h <BR> DL = 驅動器號
<BR> DS:SI = 返回數據緩沖區地址 <BR><BR>返回: <BR> CF = 0, AH = 0 成功
<BR> DS:SI 驅動器參數數據包地址,(參見前面的文章) <BR> CF = 1, AH = 錯誤碼
<BR><BR> 這個調用返回指定驅動器的參數. <BR><BR>9) 取得擴展驅動器介質更換檢測線狀態 <BR>入口:
<BR> AH = 49h <BR> DL = 驅動器號 <BR><BR>返回: <BR> CF = 0, AH =
0 介質未更換 <BR> CF = 1, AH = 06h 介質可能已更換 <BR><BR> 這個調用返回指定驅動器的介質更換狀態.
<BR> 這個調用與 Int13h AH = 16h 子功能調用相同,只是允許任何驅動器
<BR>標號.如果對一臺支持可移動介質功能子集的固定驅動器使用此功能,則永遠 <BR>返回 CF = 0, AH = 0.
<BR> 簡單地將可移動介質鎖定再解鎖就可以激活檢測線,而無須真正更換介質. <BR><BR>10) Int 15h
可移動介質彈出支持 <BR>入口: <BR> AH = 52h <BR> DL = 驅動器號 <BR>返回: <BR> CF =
0, AH = 0 彈出請求可能可以執行 <BR> CF = 1, AH = 錯誤碼 B1h 或 B3h 彈出請求不能執行
<BR><BR> 這個調用是由 Int13h
AH=46h彈出介質功能調用內部使用的 <BR><BR><BR><BR> <BR><BR><BR><BR><IMG
border=0 height=1 src="硬盤結構.files/down_info.htm"
width=1><BR><BR></TD></TR>
<TR>
<TD bgColor=#cccccc height=1 width="100%"></TD></TR>
<TR>
<TD width="100%"><BR><B>相關文章</B>:
<P><B>相關軟件</B>:</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 width=760>
<TBODY>
<TR>
<TD height=23><IMG border=0 height=24 src="硬盤結構.files/bottom.gif"
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -