.硬盘结构介绍
1.硬盘参数解疑
到目前为止人们常说硬盘参数还是古老CHS(Cylinder/Head/Sector)参数那么为什么要使用这些参数它们意义是什么?它们取值范围是什么?
很久以前(longlongago...)硬盘容量还非常小时候人们采用和软盘类似结构生产硬盘也就是硬盘盘片每条磁道都具有相同扇区数由此产生了所谓3D参数(DiskGeometry)即磁头数(Heads)柱面数(Cylinders)扇区数(Sectors)以及相应寻址方式
其中:
磁头数(Heads)表示硬盘总共有几个磁头也就是有几面盘片最大为255(用8个 2进制位存储);
柱面数(Cylinders)表示硬盘每面盘片上有几条磁道最大为1023(用10个 2进制位存储);
扇区数(Sectors)表示每条磁道上有几个扇区最大为63(用6个 2进制位存储)
每个扇区般是512个字节理论上讲这不是必须但好象没有取别值
所以磁盘最大容量为:
255*1023*63*512/1048576=8024GB(1M=1048576Bytes)或硬盘厂商常用单位:
255*1023*63*512/1000000=8414GB(1M=1000000Bytes)
在CHS寻址方式中磁头柱面扇区取值范围分别为0到Heads-10到Cylinders-11到Sectors(注意是从1开始)
2.基本Int13H介绍
BIOSInt13H是BIOS提供磁盘基本输入输出中断它可以完成磁盘(包括硬盘和软盘)复位读写校验定位诊断格式化等功能它使用就是CHS寻址方式因此最大识能访问8GB左右硬盘(本文中如不作特殊介绍说明均以1M=1048576字节为单位)
3.现代硬盘结构介绍
在老式硬盘中由于每个磁道扇区数相等所以外道记录密度要远低于内道因此会浪费很多磁盘空间(和软盘样)为了解决这问题进步提高硬盘容量人们改用等密度结构生产硬盘也就是说外圈磁道扇区比内圈磁道多采用这种结构后硬盘不再具有实际3D参数寻址方式也改为线性寻址即以扇区为单位进行寻址
为了和使用3D寻址老软件Software兼容(如使用BIOSInt13H接口软件Software)在硬盘控制器内部安装了个地址翻译器由它负责将老式3D参数翻译成新线性参数这也是为什么现在硬盘3D参数可以有多种选择原因(区别工作模式对应区别3D参数如LBALARGENORMAL)
4.扩展Int13H介绍
虽然现代硬盘都已经采用了线性寻址但是由于基本Int13H制约使用BIOSInt13H接口如DOS等还只能访问8G以内硬盘空间为了打破这限制Microsoft等几家公司制定了扩展Int13H标准(ExtendedInt13H)采用线性寻址方式存取硬盘所以突破了8G限制而且还加入了对可拆卸介质(如活动硬盘)支持
2.BootSector结构介绍
1.BootSector组成
BootSector也就是硬盘第个扇区它由MBR(MasterBootRecord)DPT(DiskPartitionTable)和BootRecordID 3部分组成
MBR又称作主引导记录占用BootSector前446个字节(0to0x1BD)存放系统主引导(它负责从活动分区中装载并运行系统引导)
DPT即主分区表占用64个字节(0x1BEto0x1FD)记录了磁盘基本分区信息主分区表分为 4个分区项每项16字节分别记录了每个主分区信息(因此最多可以有 4个主分区)
BootRecordID即引导区标记占用两个字节(0x1FEand0x1FF)对于合法引导区它等于0xAA55这是判别引导区是否合法标志
BootSector具体结构如下图所示:
Off0000H
Off01BDH
Off01BEH
Off01CDH
Off01CEH
Off01DDH
Off01DEH
Off01EDH
Off01EEH
Off01FDH
Off01FEH
Off01FFH
MasterBootRecord
主引导记录(446字节)
分区信息1
分区信息2
分区信息3
分区信息4
校验字0xAA55
2.分区表结构介绍
分区表由 4个分区项构成每项结构如下:
BYTEState :分区状态0=未激活0x80=激活(注意此项)
BYTEStartHead :分区起始磁头号
WORDStartSC :分区起始扇区和柱面号底字节低6位为扇区号高2位为柱面号第910位高字节为柱面号低8位
BYTEType :分区类型如0x0B=FAT320x83=Linux等00表示此项未用(注1)
BYTEEndHead :分区结束磁头号
WORDEndSC :分区结束扇区和柱面号定义同前
DWORDRelative :在线性寻址方式下分区相对扇区地址(对于基本分区即为绝对地址)
DWORDSectors :分区大小(总扇区数)
注意:在DOS/Windows系统下基本分区必须以柱面为单位划分(Sectors*Heads个扇区)如对于CHS为764/255/63硬盘分区最小尺寸为255*63*512/1048576=7.844MB
3.扩展分区介绍
由于主分区表中只能分 4个分区无法满足需求因此设计了种扩展分区格式基本上说扩展分区信息是以链表形式存放但也有些特别地方
首先主分区表中要有个基本扩展分区项所有扩展分区都隶属于它也就是说其他所有扩展分区空间都必须包括在这个基本扩展分区中对于DOS/Windows来说扩展分区类型为0x05
除基本扩展分区以外其他所有扩展分区则以链表形式级联存放后个扩展分区数据项记录在前个扩展分区分区表中但两个扩展分区空间并不重叠
扩展分区类似于个完整硬盘必须进步分区才能使用但每个扩展分区中只能存在个其他分区此分区在DOS/Windows环境中即为逻辑盘因此每个扩展分区分区表(同样存储在扩展分区第个扇区中)中最多只能有两个分区数据项(包括下个扩展分区数据项)
扩展分区和逻辑盘关系请参考注1
第 2部分技术资料
第章扩展Int13H技术资料
.介绍
设计扩展Int13H接口目是为了扩展BIOS功能使其支持多于1024柱面硬盘以及可移动介质锁定解锁及弹出等功能
2.数据结构
1.数据类型约定
BYTE 1字节整型( 8位)
WORD 2字节整型(16位)
DWORD4字节整型(32位)
QWORD8字节整型(64位)
2.磁盘地址数据包DiskAddressPacket(DAP)
DAP是基于绝对扇区地址因此利用DAPInt13H可以轻松地逾越1024柱面限制它根本就不需要CHS概念
DAP结构如下:
structDiskAddressPacket
{
BYTEPacketSize; //数据包尺寸(16字节)
BYTEReserved; //0
WORDBlockCount; //要传输数据块个数(以扇区为单位)
DWORDBufferAddr; //传输缓冲地址(segment:off)
QWORDBlockNum; //磁盘起始绝对块地址
};
PacketSize保存了DAP结构尺寸以便将来对其进行扩充在目前使用扩展Int13H版本中PacketSize恒等于16如果它小于16扩展Int13H将返回码(AH=01CF=1)BlockCount对于输入来说是需要传输数据块总数对于输出来说是实际传输数据块个数BlockCount=0表示不传输任何数据块
BufferAddr是传输数据缓冲区32位地址(段地址:偏移量)数据缓冲区必须位于常规内存以内(1M)
BlockNum表示是从磁盘开始算起绝对块地址(以扇区为单位)和分区无关第个块地址为0般来说BlockNum和CHS地址关系是:
BlockNum=(cylinder*NumberOfHeads+head)*SectorsPerTrack+sector-1;
其中cylinderheadsector是CHS地址NumberOfHeads是磁盘磁头数SectorsPerTrack是磁盘每磁道扇区数
也就是说BlockNum是沿着扇区->磁道->柱面顺序记数这顺序是由磁盘控制器虚拟磁盘表面数据块实际排列顺序可能和此区别(如为了提高磁盘速度而设置间隔因子将会打乱扇区排列顺序)
3.驱动器参数数据包DriveParametersPacket
驱动器参数数据包是在扩展Int13H取得驱动器参数子功能中使用数据包格式如下:
structDriveParametersPacket
{
WORDInfoSize; //数据包尺寸(26字节)
WORDFlags; //信息标志
DWORDCylinders; //磁盘柱面数
DWORDHeads; //磁盘磁头数
DWORDSectorsPerTrack; //每磁道扇区数
QWORDSectors; //磁盘总扇区数
WORDSectorSize; //扇区尺寸(以字节为单位)
};
信息标志用于返回磁盘附加信息每位定义如下:0位:
0=可能发生DMA边界
1=DMA边界将被透明处理
如果这位置1表示BIOS将自动处理DMA边界也就是说代码09H永远也不会出现.
1位:
0=未提供CHS信息
1=CHS信息合法
如果块设备传统CHS几何信息不适当话该位将置0.
2位:
0=驱动器不可移动
1=驱动器可移动
3位:表示该驱动器是否支持写入时校验.
4位:
0=驱动器不具备介质更换检测线
1=驱动器具备介质更换检测线
5位:
0=驱动器不可锁定
1=驱动器可以锁定
要存取驱动器号大于0x80可移动驱动器该位必须置1(某些驱动器号为0到0x7F设备也需要置位)
6位:
0=CHS值是当前存储介质值(仅对于可移动介质)如果驱动器中有存储介质CHS值将被返回.
1=CHS值是驱动器支持最大值(此时驱动器中没有介质).
7-15位:保留必须置0.
3.接口规范标准
1.寄存器约定
在扩展Int13H中般使用如下寄存器约定:
ds:si>磁盘地址数据包(diskaddresspacket)
dl>驱动器号
ah>功能代码/返回码
在基本Int13H中0-0x7F的间驱动器号代表可移动驱动器0x80-0xFF的间驱动器号代表固定驱动器但在扩展Int13H中0x80-0xFF的间还包括些新出现可移动驱动器比如活动硬盘等这些驱动器支持先进锁定解锁等功能
ah返回码除了标准Int13H规定基本码以外又增加了以下码:
B0h驱动器中介质未被锁定
B1h驱动器中介质已经锁定
B2h介质是可移动
B3h介质正在被使用
B4h锁定记数溢出
B5h合法弹出请求失败
2.API子集介绍
1.x版扩展Int13H中规定了两个主要API子集
第个子集提供了访问大硬盘所必须功能包括检查扩展In13H是否存在(41h)扩展读(42h)扩展写(43h)校验扇区(44h)扩展定位(47h)和取得驱动器参数(48h)
第 2个子集提供了对软件Software控制驱动器锁定和弹出支持包括检查扩展Int13H是否存在(41h)锁定/解锁驱动器(45h)弹出驱动器(46h)取得驱动器参数(48h)取得扩展驱动器改变状态(49h)15h
如果使用了规范标准中不支持功能BIOS将返回码ah=01hCF=1
3.API详解
1)检验扩展功能是否存在
入口:
AH=41h
BX=55AAh
DL=驱动器号
返回:
CF=0
AH=扩展功能主版本号
AL=内部使用
BX=AA55h
CX=API子集支持位图
CF=1
AH=码01h无效命令
这个检验对特定驱动器是否存在扩展功能如果进位标志置1则此驱动器不支持扩展功能如果进位标志为0同时BX=AA55h则存在扩展功能此时CX0位表示是否支持第个子集1位表示是否支持第 2个子集.
对于1.x版扩展Int13H来说主版本号AH=1AL是副版本号但这仅限于BIOS内部使用任何软件Software不得检查AL值
2)扩展读
入口:
AH=42h
DL=驱动器号
DS:DI=磁盘地址数据包(DiskAddressPacket)
返回:
CF=0AH=0成功
CF=1AH=码
这个将磁盘上数据读入内存如果出现DAPBlockCount项中则记录了出错前实际读取数据块个数
3)扩展写
入口:
AH=43h
AL
0位=0关闭写校验
1打开写校验
1-7位保留置0
DL=驱动器号
DS:DI=磁盘地址数据包(DAP)
返回:
CF=0AH=0成功
CF=1AH=码
这个将内存中数据写入磁盘如果打开了写校验选项但BIOS不支持则会返回码AH=01hCF=1功能48h可以检测BIOS是否支持写校验
如果出现DAPBlockCount项中则记录了出错前实际写入数据块个数
4)校验扇区
入口:
AH=44h
DL=驱动器号
DS:DI=磁盘地址数据包(DiskAddressPacket)
返回:
CF=0AH=0成功
CF=1AH=码
这个校验磁盘数据但并不将数据读入内存.如果出现DAPBlockCount项中则记录了出错前实际校验数据块个数
5)锁定/解锁驱动器
入口:
AH=45h
AL
=0锁定驱动器
=1驱动器解锁
=02返回锁定/解锁状态
=03h-FFh-保留
DL=驱动器号
返回:
CF=0AH=0成功
CF=1AH=码
这个用来缩定指定驱动器中介质.
所有标号大于等于0x80可移动驱动器必须支持这个功能如果在支持可移动驱动器控制功能子集固定驱动器上使用这个功能将会成功返回
驱动器必须支持最大255次锁定在所有锁定被解锁的前不能在物理上将驱动器解锁解锁个未锁定驱动器,将返回码AH=B0h如果锁定个已锁定了255次驱动器将返回码AH=B4h
锁定个没有介质驱动器是合法
6)弹出可移动驱动器中介质
入口:
AH=46h
AL=0保留
DL=驱动器号
返回:
CF=0AH=0成功
CF=1AH=码
这个用来弹出指定可移动驱动器中介质.
所有标号大于等于0x80可移动驱动器必须支持这个功能如果在支持可移动驱动器控制功能子集固定驱动器上使用这个功能将会返回码AH=B2h(介质不可移动)如果试图弹出个被锁定介质将返回码AH=B1h(介质被锁定)
如果试图弹出个没有介质驱动器则返回码Ah=31h(驱动器中没有介质)
如果试图弹出个未锁定可移动驱动器中介质Int13h会Int15h(AH=52h)来检查弹出请求能否执行如果弹出请求被拒绝则返回码(同Int15h)如果弹出请求被接受,但出现了其他则返回码AH=B5h
7)扩展定位
入口:
AH=47h
DL=驱动器号
DS:DI=磁盘地址数据包(DiskAddressPacket)
返回:
CF=0AH=0成功
CF=1AH=码
这个将磁头定位到指定扇区
8)取得驱动器参数
入口:
AH=48h
DL=驱动器号
DS:DI=返回数据缓冲区地址
返回:
CF=0AH=0成功
CF=1AH=码
这个返回指定驱动器参数
9)取得扩展驱动器介质更换检测线状态
入口:
AH=49h
DL=驱动器号
返回:
CF=0AH=0介质未更换
CF=1AH=06h介质可能已更换
这个返回指定驱动器介质更换状态.
这个和Int13hAH=16h子功能相同只是允许任何驱动器标号如果对台支持可移动介质功能子集固定驱动器使用此功能,则永远返回CF=0AH=0
简单地将可移动介质锁定再解锁就可以激活检测线而无须真正更换介质
10)Int15h可移动介质弹出支持
入口:
AH=52h
DL=驱动器号
返回:
CF=0AH=0弹出请求可能可以执行
CF=1AH=码B1h或B3h弹出请求不能执行
这个是由Int13hAH=46h弹出介质功能内部使用
最新评论