📄 硬盘结构.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 + -