参数.docx
《参数.docx》由会员分享,可在线阅读,更多相关《参数.docx(16页珍藏版)》请在冰豆网上搜索。
参数
一.硬盘结构简介
1.硬盘参数释疑
到目前为止,人们常说的硬盘参数还是古老的CHS(Cylinder/Head/Sector)参数.那么为什么要使用这些参数,它们的意义是什么?
它们的取值范围是什么?
很久以前,硬盘的容量还非常小的时候,人们采用与软盘类似的结构生产硬盘.也就是硬盘盘片的每一条磁道都具有相同的扇区数.由此产生了所谓的3D参
数(DiskGeometry).既磁头数(Heads),柱面数(Cylinders),扇区数(Sectors),以及相应的寻址方式.
其中:
磁头数(Heads)表示硬盘总共有几个磁头,也就是有几面盘片,最大为255(用8个二进制位存储);
柱面数(Cylinders)表示硬盘每一面盘片上有几条磁道,最大为1023
(用10个二进制位存储);
扇区数(Sectors)表示每一条磁道上有几个扇区,最大为63(用6
个二进制位存储).
每个扇区一般是512个字节,理论上讲这不是必须的,但好象没有取
别的值的.
所以磁盘最大容量为:
255*1023*63*512/1048576=8024GB(1M=1048576Bytes)
或硬盘厂商常用的单位:
255*1023*63*512/1000000=8414GB(1M=1000000Bytes)
在CHS寻址方式中,磁头,柱面,扇区的取值范围分别为0到Heads-1,
0到Cylinders-1,1到Sectors(注意是从1开始).
2.基本Int13H调用简介
BIOSInt13H调用是BIOS提供的磁盘基本输入输出中断调用,它可以
完成磁盘(包括硬盘和软盘)的复位,读写,校验,定位,诊断,格式化等功能.
它使用的就是CHS寻址方式,因此最大识能访问8GB左右的硬盘(本文中
如不作特殊说明,均以1M=1048576字节为单位).
3.现代硬盘结构简介
在老式硬盘中,由于每个磁道的扇区数相等,所以外道的记录密度要远低
于内道,因此会浪费很多磁盘空间(与软盘一样).为了解决这一问题,进一
步提高硬盘容量,人们改用等密度结构生产硬盘.也就是说,外圈磁道的扇区
比内圈磁道多.采用这种结构后,硬盘不再具有实际的3D参数,寻址方式也改
为线性寻址,即以扇区为单位进行寻址.
为了与使用3D寻址的老软件兼容(如使用BIOSInt13H接口的软件),在硬
盘控制器内部安装了一个地址翻译器,由它负责将老式3D参数翻译成新的线性
参数.这也是为什么现在硬盘的3D参数可以有多种选择的原因(不同的工作模
式,对应不同的3D参数,如LBA,LARGE,NORMAL).
4.扩展Int13H简介
虽然现代硬盘都已经采用了线性寻址,但是由于基本Int13H的制约,使
用BIOSInt13H接口的程序,如DOS等还只能访问8G以内的硬盘空间.
为了打破这一限制,Microsoft等几家公司制定了扩展Int13H标准
(ExtendedInt13H),采用线性寻址方式存取硬盘,所以突破了8G的限制,
而且还加入了对可拆卸介质(如活动硬盘)的支持.
二.BootSector结构简介
1.BootSector的组成
BootSector也就是硬盘的第一个扇区,它由MBR(MasterBootRecord),
DPT(DiskPartitionTable)和BootRecordID 三部分组成.
MBR又称作主引导记录占用BootSector的前446个字节(0to0x1BD),
存放系统主引导程序(它负责从活动分区中装载并运行系统引导程序).
DPT即主分区表占用64个字节(0x1BEto0x1FD),记录了磁盘的基本分区
信息.主分区表分为四个分区项,每项16字节,分别记录了每个主分区的信息
(因此最多可以有四个主分区).
BootRecordID即引导区标记占用两个字节(0x1FEand0x1FF),对于合法
引导区,它等于0xAA55,这是判别引导区是否合法的标志.
BootSector的具体结构如下图所示(参见NightOwl大侠的文章):
下面还有喔(39%) │结束←│↑/↓/PgUp/PgDn移动│?
辅助说明│
0000¦------------------------------------------------¦
¦ ¦
¦ ¦
¦ MasterBootRecord ¦
¦ ¦
¦ ¦
¦ 主引导记录(446字节) ¦
¦ ¦
¦ ¦
¦ ¦
01BD ¦ ¦
01BE¦------------------------------------------------¦
¦ ¦
01CD ¦ 分区信息 1(16字节) ¦
01CE¦------------------------------------------------¦
¦ ¦
01DD ¦ 分区信息 2(16字节) ¦
01DE¦------------------------------------------------¦
¦ ¦
01ED ¦ 分区信息 3(16字节) ¦
01EE¦------------------------------------------------¦
¦ ¦
01FD ¦ 分区信息 4(16字节) ¦
¦------------------------------------------------¦
¦01FE ¦01FF ¦
¦ 55 ¦ AA ¦
¦------------------------------------------------¦
2.分区表结构简介
分区表由四个分区项构成,每一项的结构如下:
BYTEState :
分区状态,0=未激活,0x80=激活(注意此项)
BYTEStartHead :
分区起始磁头号
WORDStartSC :
分区起始扇区和柱面号,底字节的低6位为扇区号,
高2位为柱面号的第9,10位,高字节为柱面号的低8位
BYTEType :
分区类型,如0x0B=FAT32,0x83=Linux等,
00表示此项未用,07=NTFS
BYTEEndHead :
分区结束磁头号
WORDEndSC :
分区结束扇区和柱面号,定义同前
DWORDRelative :
在线性寻址方式下的分区相对扇区地址
(对于基本分区即为绝对地址)
DWORDSectors :
分区大小(总扇区数)
注意:
在DOS/Windows系统下,基本分区必须以柱面为单位划分
(Sectors*Heads个扇区),如对于CHS为764/255/63的硬盘,分区的
最小尺寸为 255*63*512/1048576=7.844MB.
3.扩展分区简介
由于主分区表中只能分四个分区,无法满足需求,因此设计了一种扩展
分区格式.基本上说,扩展分区的信息是以链表形式存放的,但也有一些特
别的地方.
首先,主分区表中要有一个基本扩展分区项,所有扩展分区都隶属于它,
也就是说其他所有扩展分区的空间都必须包括在这个基本扩展分区中.对于
DOS/Windows来说,扩展分区的类型为0x05.
除基本扩展分区以外的其他所有扩展分区则以链表的形式级联存放,后
一个扩展分区的数据项记录在前一个扩展分区的分区表中,但两个扩展分区
的空间并不重叠.
扩展分区类似于一个完整的硬盘,必须进一步分区才能使用.但每个扩
展分区中只能存在一个其他分区.此分区在DOS/Windows环境中即为逻辑盘.
因此每一个扩展分区的分区表(同样存储在扩展分区的第一个扇区中)中最多
只能有两个分区数据项(包括下一个扩展分区的数据项).
扩展分区和逻辑盘的示意图如下:
¦-----------------------¦ --------
¦主扩展分区(/dev/hda2)¦ ^
¦-----------------------¦ ¦
¦ 扩 展 ¦ 分区项1 ¦--\ ¦
¦ ¦------------¦ ¦ ¦
¦ 分区表 ¦ 分区项2¦--+--\ ¦
¦-----------------------¦ ¦¦ ¦
¦ ¦ ¦¦ ¦
¦逻辑盘1(/dev/hda5) ¦<-/¦ ¦
¦ ¦ ¦ ¦
¦-----------------------¦ ¦ 主
¦ 扩展分区2 ¦<----/
¦-----------------------¦ 扩
¦ 扩 展 ¦ 分区项1 ¦-- ¦ ¦------------¦ ¦ 展
¦ 分区表 ¦ 分区项2¦--+-- ¦-----------------------¦¦ ¦ 分
¦ ¦ ¦¦
¦逻辑盘2(/dev/hda6) ¦<-/¦ 区
¦ ¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ 扩展分区3 ¦<----/ ¦
¦-----------------------¦ ¦
¦ 扩 展 ¦ 分区项1 ¦--\ ¦
¦ ¦------------¦ ¦ ¦
¦ 分区表 ¦ 分区项2¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ ¦ ¦ ¦
¦逻辑盘3(/dev/hda7) ¦<-/ ¦
¦ ¦ ¦
¦-----------------------¦ ---------
¦ 扩 展 ¦ 分区项1 ¦-- ¦ ¦------------¦ ¦ 展
¦ 分区表 ¦ 分区项2¦--+-- ¦-----------------------¦¦ ¦ 分
¦ ¦ ¦¦
¦逻辑盘2(/dev/hda6) ¦<-/¦ 区
¦ ¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ 扩展分区3 ¦<----/ ¦
¦-----------------------¦ ¦
¦ 扩 展 ¦ 分区项1 ¦--\ ¦
¦ ¦------------¦ ¦ ¦
¦ 分区表 ¦ 分区项2¦ ¦ ¦
¦-----------------------¦ ¦ ¦
¦ ¦ ¦ ¦
¦逻辑盘3(/dev/hda7) ¦<-/ ¦
¦ ¦ ¦
¦-----------------------¦ ---------
(未完待续)
标 题:
HardDisk,Partition,Boot,OSLoader专题
(2)
三.系统启动过程简介
系统启动过程主要由一下几步组成(以硬盘启动为例):
1.开机:
-)
2.BIOS加电自检(PowerOnSelfTest--POST)
内存地址为0ffff:
0000
3.将硬盘第一个扇区(0头0道1扇区,也就是BootSector)
读入内存地址0000:
7c00处.
4.检查(WORD)0000:
7dfe是否等于0xaa55,若不等于
则转去尝试其他启动介质,如果没有其他启动介质则显示
"NoROMBASIC"然后死机.
5.跳转到0000:
7c00处执行MBR中的程序.
6.MBR首先将自己复制到0000:
0600处,然后继续执行.
7.在主分区表中搜索标志为活动的分区.如果发现没有活动
分区或有不止一个活动分区,则转停止.
8.将活动分区的第一个扇区读入内存地址0000:
7c00处.
9.检查(WORD)0000:
7dfe是否等于0xaa55,若不等于则
显示"MissingOperatingSystem"然后停止,或尝试
软盘启动.
10.跳转到0000:
7c00处继续执行特定系统的启动程序.
11.启动系统...
以上步骤中2,3,4,5步是由BIOS的引导程序完成.6,7,8,9,10
步由MBR中的引导程序完成.
一般多系统引导程序(如SmartFDISK,BootStar,PQBoot等)
都是将标准主引导记录替换成自己的引导程序,在运行系统启动程序
之前让用户选择要启动的分区.
而某些系统自带的多系统引导程序(如lilo,NTLoader等)
则可以将自己的引导程序放在系统所处分区的第一个扇区中,在Linux
中即为SuperBlock(其实SuperBlock是两个扇区).
注:
以上各步骤中使用的是标准MBR,其他多系统引导程序的引导
过程与此不同.
标 题:
Harddisk,Partition,Boot,OSLoader专题(3)
第二部分技术资料
第一章扩展Int13H技术资料
一.简介
设计扩展Int13H接口的目的是为了扩展BIOS的功能,使其支持
多于1024柱面的硬盘,以及可移动介质的琐定,解锁及弹出等功能.
二.数据结构
1.数据类型约定
BYTE 1字节整型( 8位)
WORD 2字节整型(16位)
DWORD 4字节整型(32位)
QWORD 8字节整型(64位)
2.磁盘地址数据包DiskAddressPacket(DAP)
DAP是基于绝对扇区地址的,因此利用DAP,Int13H可以轻松地逾
越1024柱面的限制,因为它根本就不需要CHS的概念.
DAP的结构如下:
structDiskAddressPacket
{
BYTEPacketSize; //数据包尺寸(16字节)
BYTEReserved; //==0
WORDBlockCount; //要传输的数据块个数(以扇区为单位)
DWORDBufferAddr; //传输缓冲地址(segment:
offset)
QWORDBlockNum; //磁盘起始绝对块地址
};
PacketSize保存了DAP结构的尺寸,以便将来对其进行扩充.在
目前使用的扩展Int13H版本中PacketSize恒等于16.如果它小于
16,扩展Int13H将返回错误码(AH=01,CF=1).
BlockCount对于输入来说是需要传输的数据块总数,对于输出来说
是实际传输的数据块个数.BlockCount=0表示不传输任何数据块.
BufferAddr是传输数据缓冲区的32位地址(段地址:
偏移量).数据
缓冲区必须位于常规内存以内(1M).
BlockNum表示的是从磁盘开始算起的绝对块地址(以扇区为单位),
与分区无关.第一个块地址为0.一般来说,BlockNum与CHS地址的关系
是:
BlockNum=cylinder*NumberOfHeads+
head*SectorsPerTrack+
sector-1;
其中cylinder,head,sector是CHS地址,NumberOfHeads是磁盘
的磁头数,SectorsPerTrack是磁盘每磁道的扇区数.
也就是说BlockNum是沿着扇区->磁道->柱面的顺序记数的.这一顺
序是由磁盘控制器虚拟的,磁盘表面数据块的实际排列顺序可能与此不同
(如为了提高磁盘速度而设置的间隔因子将会打乱扇区的排列顺序).
3.驱动器参数数据包DriveParametersPacket
驱动器参数数据包是在扩展Int13H的取得驱动器参数子功能调用中
使用的数据包.格式如下:
structDriveParametersPacket
{