硬盘的寻址模式.docx
- 文档编号:3783366
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:20
- 大小:802.69KB
硬盘的寻址模式.docx
《硬盘的寻址模式.docx》由会员分享,可在线阅读,更多相关《硬盘的寻址模式.docx(20页珍藏版)》请在冰豆网上搜索。
硬盘的寻址模式
1硬盘寻址与容量解决
对于大部分拥有硬盘的用户来说,特别对于那些正在准备升级到大硬盘但是却不打算升级系统的其它部分的用户,它们首先考虑的是自己的系统是否支持这么大容量的硬盘。
这个问题同硬盘结构、BIOS和操作系统息息相关--归根到底这些问题的出现是由于当时的人们由于条件所限制而缺乏长远考虑的结果。
在当时这样的设计根本没有问题,但是随着技术的进一步发展这些问题就曝露了出来,而且影响颇广。
好在这些问题都已经被通过不同的方式解决了。
本章节将会同大家一起来谈谈容量限制的问题。
下面的容量限制分别采用两种方式表示,前面的一种采用的是1GB=1000MB和1MB=1000KB的换算,而后面的容量采用的是1GB=1024MB和1MB=1024KB的换算。
528MB/504MB容量限制
这并不是历史上第一个硬盘容量限制问题,但是它是第一个引起人们广泛关注的容量限制问题。
这之前硬盘的容量限制问题也一再的出现过,但是因为PC用户非常的少,所以很多人并不知道这些问题,这里我们做一个简短的回顾:
∙10.4MB容量限制:
这个问题出现在最早的IBMPC/XT上,这种设备使用了一种专门设计的硬盘,它有312个柱面(cylinders)、4个磁头和17个扇区,这样算来它的最大容量只能为10MB,这种容量限制来自于硬盘。
∙16MBFAT12容量限制:
第一种用于硬盘的FAT格式是12bit的,它最多能容纳4086个大小为4096字节的簇,因此总容量为16,736,256字节,也就是大约16MB。
∙32MBDOS3容量限制:
为了解决16MB容量限制,DOS3.x开始支持FAT16文件系统,不过由于这种文件系统只能允许16384个容量为=2048字节的簇,所以它就造成了32MB的容量限制问题,不过由于多分区的概念的引入,硬盘的容量并没有因此受到太大的限制,只是每个分区的容量不能超过32MB。
∙128MBDOS4容量限制:
DOS4.x开始支持65526个容量为2048字节的簇,所以其容量上限提升到了128MB
可以看到上面的这些容量限制的问题大都是由于MS-DOS系统所引起的,这之后的DOS5允许每个簇的最大容量为8192字节,因此最大分区容量限制为512MB,不过这个容量限制并没有引起人们的广泛关注,因为在这之前由于BIOS和IDE规范所引起的504MB容量限制首先曝露了出来(大约是1994年左右)。
如下表所示:
标准
用于柱面的Bit
用于磁头的Bit
用于扇区的Bit
用于定义整个结构的Bit
IDE/ATA
16
4
8
28
BIOSInt13h
10
8
6
24
最小定义
10
4
6
20
可以看到IDE/ATA标准和Int13h组织的标准非常的不一致,因此当分别符合这两个标准的设备配合使用的时候,只能遵循其中的最小规范。
下面我们把bit所代表的容量换算了出来:
Standard
最大柱面数
最大磁头数
最大扇区数
最大容量
IDE/ATA
65,536
16
256
128GB
BIOSInt13h
1,024
256
63
7.88GB
最小定义
1,024
16
63
504MB
对于上面的数字是这样算出来的:
1024x16x63x512/1024x1024=504MB,如果不除以1024x1024而是除以1000000的话得到的数字是528MB--按照不同的换算方法,得到的容量不同但是其实指的是一个意思。
2.11/1.97GB容量限制
前面的504MB容量障碍的成因之一是BIOS无法支持超过1024柱面,不过现在的BIOS系统都能支持超过1024柱面。
不过当时的部分BIOS系统虽然却只能支持不超过4095个柱面,这是因为它采用了12bit来表示柱面,这样所支持的最大容量就是4096x16x63x512字节了,也就是1.97GB。
这个问题是在1996年左右浮现出来的,可以通过软件的方法来解决。
2.11/2GB容量限制
这个容量限制注意的人们会更多一些,它也是由于文件系统的定义造成的分区容量限制,同BIOS没有什么关系。
从DOS6和Windows3.x以后开始支持FAT16文件系统,如果在这些系统使用容量超过2GB的硬盘必须对于硬盘进行分区,而且每个分区的容量不会超过2GB。
FAT16最大只能支持65536个32KB容量的簇,那么也就意味着每个分区不能超过2GB的容量。
估计现在没有用户还会遇到这个问题了,因为只有DOS、Window3.x和Windows95第一版会有这个问题,升级到更高版本的支持FAT32或者NTFS文件系统的操作系统(Windows95OEMSR2、Windows98、WindowsME、Windows2000和WindowsXP都支持FAT32,其中后两者都支持NTFS文件系统)就没有这个问题了。
3.26/3.04GB容量限制
这种容量限制的影响范围也非常的小,只是在一些特殊的机型中才出现过,它的出现是由于BIOS无法正确的识别超过6322桌面而造成的--如果用户试图设置高于6322的柱面,系统将会挂起。
这个容量限制是这样计算的:
6322柱面x16头x63扇区x512字节=3GB
PhoenixBIOS容量限制
这是一个比较特别的容量限制,而且范围也非常的小,只是PhoenixBIOS4.03和4.04这两个版本上出现的问题。
它其实只是BIOS设计的一个对于硬盘容量计算错误的bug,基于这两个版本BIOS推出主板的主板厂商有的矫正的这个问题,有的则没有,因此也不是一个绝对的情况,不过这里还是告诉大家,万一有用户遇到一些不能解释的问题,或许这是一个启发。
这个问题比较怪异,如果用户把IDE设备的磁头数目设置为16,而扇区设置为63,那么柱面设置为6349一下不会有任何问题,也就是说硬盘容量不能超过3.05GB;如果把柱面数目设置为6350-8322之间,程序将会死锁;如果柱面设置为8323-14671之间,那么系统可以正常的工作,但是硬盘的容量无法正常的显示。
不过以后版本的BIOS都修正了这个问题。
4.22/3.94GB容量障碍
在解决了504MB容量限制之后,业界对于通过BIOS结构转换(geometrytranslation)来解决这个问题驾轻就熟。
这种方法主要是把硬盘的柱面数除以转换系数来把IDE/ATA的柱面数限制在BIOS能转换的范围之内(也就是1024之内),当然为了保证正确识别硬盘容量在IDE/ATA磁头数目乘以同一个系数(因为BIOS支持的磁头数是256),从而实现对于超过BIOSInt13h规范的硬盘的正确支持。
不过这样依然会存在一个3.94GB的容量限制。
下面的表格所表示的是如何让一个符合BIOSint13h规范的BIOS正确的支持容量为6.4GB的硬盘:
柱面数目
磁头数目
扇区
容量
IDE/ATA限制
65,536
16
256
137GB
硬盘逻辑结构
12,496
16
63
6.45GB
BIOS转换系数
除以16
乘以16
--
--
BIOS转换后的结构
781
256
63
6..45GB
BIOSInt13h限制
1,024
256
63
7.88GB
这款6.4GB的硬盘的逻辑结构为12496柱面、16磁头和63扇区,但是BIOSint13h规范最大只能支持1024个柱面,因此通过除以16使得柱面数目低于1024,而磁头数目乘以16这样的方式,既不会影响硬盘的总容量却巧妙的解决了IDE/ATA和int13h之间不统一的问题。
不过,部分BIOS无法正常的支持256逻辑磁头的转换,所以人们变通了一下,把转换系数改为了15:
柱面数目
磁头数目
扇区
容量
IDE/ATA限制
65,536
16
256
137GB
硬盘逻辑结构
12,496
16
63
6.45GB
BIOS转换系数
除以15
乘以15
--
--
BIOS转换后的结构
833
240
63
6..45GB
BIOSInt13h限制
1,024
256
63
7.88GB
可以看到当转换系数改为15之后,依然可以满足BIOS柱面要求,而磁头数目只有240。
7.93/7.38GB容量限制
这个容量限制主要是由于接口的限制所形成的,因为这个。
不过,在部分系统上由于Int13h接口的限制它的最大容量只有7.38GB。
其实这个容量限制的成因前面已经提到了,虽然Int13h接口规范支持1024柱面、256磁头和63个512字节的柱面,不过DOS和部分版本的Windows无法转换256逻辑磁头,因此只有使用15做为转换系数,这样最大的磁头数目只能是240,因此这个容量限制为:
1024x240x63x512=7,927,234,560字节
解决这个问题只有通过Int13h扩展方案。
8.46/7.88GB容量限制
这个容量限制更加通俗的称为8GB容量限制,估计很多看到这篇文章的朋友都经历过这次容量限制。
起因还是因为Int13h规范,它仅仅使用10bit来定义柱面数(最大1024),使用8bit定义磁头数目(最大256),使用6bit定义扇区数目(最大64,但是因为不使用0,所以最大是63),每个扇区的容量是512字节,那么最大的容量为8,455,716,864,这个容量限制是无法通过逻辑结构转换来避免的。
这个时候显然必须要对于Int13接口规范进行修改了,Int13扩展规范则解决了这个问题。
因为操作系统也是通过Int13h来访问硬盘的,所以实现对于Int13扩展接口规范的支持也需要操作系统的支持,DOS6.22及其以前的版本、WindowsNT3.5都不支持Int13h扩展,因此使用这些系统无法支持8.4GB以上的硬盘。
32/29.8GB容量限制
微软在1999年宣布Windows95将不支持容量超过32GB的硬盘,不过Windows98以及WindowsMe都对于32GB以上的硬盘提供了很好的支持,其主要的原因是Windows95中的Scandisk在保护模式下对于容量超过32GB的硬盘进行磁盘扫描的时候,对于967363以后的柱面全部柱面都报错,显然这仅仅是一个软件错误,但是微软宣布Windows95不支持超过32GB容量的硬盘,显然是不希望用户再使用这个“古老”的系统了。
33.8GB/32GB容量限制
其实这个容量显示是我们通常所说的32GB容量限制,它的起因还是BIOS。
部分版本的AwardBIOS无法识别超过65535个柱面,最大只能支持16个逻辑磁头和63个扇区,这样最大支持支持32GB左右的容量。
这个问题出现在1999年左右,这之后的产品已经很好的解决了这个问题。
其实为了解决8GB容量限制的问题,人们做了比较长远的打算,开始使用LBA来代替原来的使用柱面、磁头、扇区定位的方式,因此对于出现这个32GB容量限制的问题非常的令人费解。
137/128GB容量限制
这个容量限制是由LBA形成的,LBA通过一个28bit的地址定义了268435456个扇区,每个扇区的容量为512字节,这样LBA最大可以支持137********2字节的容量,以1000字节=1GB来换算的话,就是大约137GB容量。
在BIOS中引入LBA模式时可以计算到这个容量限制为137GB,不过那个时候的硬盘容量只有几个GB,137GB只是一个笑话而已,然后硬盘容量的发展速度的确超乎了人们了想像,目前200GB的容量的硬盘已经在市场上销售了。
那么这些大容量硬盘是如何得到正确的支持的呢?
TechnicalCommitteeT13组织通过一个48bit的地址来定义了更多的扇区,不出意外的相当长的时间里这个解决方案都不会遇到容量障碍的问题(144155188GB)。
不过由于,现在的用于PC的Windows操作系统都是32bit的,这样就带来了一个2200GB的容量限制,如果最近几年我们使用的操作系统不能过渡到64bit的话,我们很快就会遇到这个容量限制的。
硬盘结构
硬盘有很多盘片组成,每个盘片的每个面都有一个读写磁头。
如果有N个盘片。
就有2N个面,对应2N个磁头(Heads),从0、1、2开始编号。
每个盘片的半径均为固定值R的同心圆再逻辑上形成了一个以电机主轴为轴的柱面(Cylinders),从外至里编号为0、1、2……。
每个盘片上的每个磁道又被划分为几十个扇区(Sector),通常的容量是512byte,并按照一定规则编号为1、2、3……形成Cylinders×Heads×Sector个扇区。
主引导扇区
主引导扇区位于整个硬盘的0柱面0磁头1扇区{(柱面,磁头,扇区)|(0,0,1)},bios在执行自己固有的程序以后就会jump到MBR中的第一条指令。
将系统的控制权交由mbr来执行。
主引导扇区主要由三部分组成:
主引导记录MBR(MasterBootRecord或者MainBootRecord)、硬盘分区表DPT(DiskPartitionTable)和结束标志字三大部分组成。
对于硬盘而言,一个扇区可能的字节数为128×2n(n=0,1,2,3)。
大多情况下,取n=2,即一个扇区(sector)的大小为512字节。
在总共512byte的主引导记录中,MBR的引导程序占了其中的前446个字节(偏移0H~偏移1BDH),随后的64个字节(偏移1BEH~偏移1FDH)为DPT(DiskPartitionTable,硬盘分区表),最后的两个字节“55AA”(偏移1FEH~偏移1FFH)是分区有效结束标志。
主引导记录MBR(masterbootrecord)
主引导记录中包含了硬盘的一系列参数和一段引导程序。
其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序。
MBR是由分区程序(如Fdisk)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而能够实现多系统引导。
硬盘分区表DPT(DiskPartitionTable)
硬盘分区表占据MBR扇区的64个字节(偏移01BEH--偏移01FDH),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。
具体每个字节的定义可以参见硬盘分区结构信息。
分区文件系统标志:
分区未用:
0x00H.
扩展分区:
0x05H,0x0FH.
FAT16分区:
0x06H.
FAT32分区:
0x0BH,0x1BH,0x0CH,0x1CH.
NTFS分区:
0x07H.
分区表项有几个字节比较重要,下面分别阐述之:
1、(1,2,3)字节
磁头号由
(1)字节8位表示,其范围为(0--28-1),也即(0磁头--254磁头)。
扇区号由
(2)字节低6位表示,其范围为(0--26-1),由于扇区号从1开始,所以其范围是(1扇区--63扇区)。
柱面号由
(2)字节高2位+(3)字节,共10位表示,其范围为(0--210-1),也即(0柱面--1023柱面)。
当柱面号超过1023时,这10位依然表示成1023,需要注意。
(5,6,7)字节含义同上。
2、(8,9,10,11)字节
如果是主分区表,则这4个字节表示该分区起始逻辑扇区号与逻辑0扇区(0柱面,0磁头,1扇区)之差。
如果非主分区表,
则这4个字节要么表示该分区起始逻辑扇区号与扩展分区起始逻辑扇区号之差,要么为63。
详细情况在后面有所阐述。
注意:
1、扇区上的字节是按左边低位,右边高位的顺序排列的。
所以在取值时,需要把字节再反一下,让高位字节在左边,低位字节在右边,
这一点在读取逻辑起始扇区号和分区大小时需要注意。
举个例子:
第一项的逻辑起始扇区为(3F000000),转换为十进制前要先反一下字
节顺序,为(0000003F)然后在转换为十进制,即63.同理分区大小为(3F047D00),先反为(007D043F)再转换为十进制,
即8193087。
2、逻辑扇区号与(柱面,磁头,扇区)的相互转换:
令L=逻辑扇区号,C=柱面号,H=磁头号,S=扇区号。
每道扇区数=63
每柱面磁头数=255
每柱面扇区数=每道扇区数*每柱面磁头数
=63×255
=16065
柱面号下标从0开始。
磁头号[0--254],扇区号[1--63]。
逻辑扇区号下标也从0开始。
(柱面,磁头,扇区)转换成逻辑扇区号的公式为:
L=C×16065+H×63+S-1;
比如(1柱面,1磁头,1扇区),其逻辑扇区号为:
L=1×16065+1×63+1-1
=16128
逻辑扇区号转换成(柱面,磁头,扇区)公式为:
C=L/16065
H=(L%16065)/63
S=(L%16065)%63+1
比如逻辑扇区号16127:
C=16127/16065=1
H=(16127%16065)/63=0
S=(16127%16065)%63+1=63
即(1柱面,0磁头,63扇区)
3、分区表上有四项,每一项表示一个分区,所以一个分区表最多只能表示4个分区。
主分
区表上的4项用来表示主分区和扩展分区的信息。
因为扩展分区最多只能有一个,所以硬盘
最多可以有四个主分区或者三个主分区,一个扩展分区。
余下的分区表是表示逻辑分区的。
这里有必要阐述一点:
逻辑区都是位于扩展分区里面的,并且逻辑分区的个数没有限制。
4、分区表所在扇区通常在(0磁头,1扇区),而该分区的开始扇区通常位于(1磁头,1扇区),中间隔了63个隐藏扇区。
三.分区表链的查找
分区表链实际上相当于一个单向链表结构。
第一个分区表,也即主分区表,可以有一项描述扩展分区。
而这一项就相当于指针,指向扩展分区。
然后我们根据该指针来到扩展分区起始柱面的0头1扇区,找到第二个分区表。
对于该分区表,通常情况下:
第一项描述了扩展分区中第一个分区的信息,第二项描述下一个分区,而这第二项就相当于指向第二个分区的指针,第三项,第四项一般均为0。
我们可以根据该指针来到扩展分区中第二个分区起始柱面的0头1扇区,找到第三个分区表。
以此类推,只到最后一个分区表。
而最后一个分区表只有第一项有信息,余下三项均为0.相当于其指针为空.所以只要找到了一个分区表就可以推导找出其后面所有分区表。
不过该分区表前面的分区表就不好推导出来了。
但令人高兴的是这个链表的头节点,也即主分区表的位置是固定的位于(0柱面,0磁头,1扇区)处,我们可以很轻易的找到它,然后把剩下的所有分区表一一找到。
以笔者的硬盘为例:
一个主分区(C盘),一个扩展分区.扩展分区中有两个逻辑分区(D盘,E盘)其分区表链示意图如下:
图一分区表链示意图
(一).读取(0柱面,0磁头,1扇区)处C盘的主分区表:
[800101000BFE7FFD3F0000003F047D00]
[000041FE0FFEFFFF7E047D001F2CB400]
[00000000000000000000000000000000]
[00000000000000000000000000000000]
第一项:
(80)(010100)(0B)(FE7FFD)(3F000000)(3F047D00)
描述的是C盘的情况。
1.(80):
表示C盘为活动分区。
即系统会从C盘启动。
2.(010100):
表示C盘的起始扇区为(0柱面,0磁头,1扇区)。
3.(0B):
表示C盘的文件系统为FAT32。
4.(FE7FFD):
(FE)16=(254)10(7F)16=(01111111)2(FD)16=(11111101)2
磁头号:
(254)10;
扇区号:
(111111)2=(63)10.
柱面号:
(0111111101)2=(509)10
故C盘结束扇区为(509柱面,254磁头,63扇区)。
5.(3F000000):
反向,(0000003F)16=(63)10,为C盘起始逻辑扇区号与逻辑0扇区号之差。
表示C盘前面已有63个扇区,这63个扇区为系统隐藏扇区。
6.(3F047D00):
反向,(007D043F)16=(8193087)10。
表明C盘有8193087个扇区。
即(0柱面,1磁头,1扇区)至(509柱面,254磁头,63扇区)
共有8193087个扇区。
第二项:
(00)(0041FE)(0F)(FEFFFF)(7E047D00)(1F2CB400)
描述的是扩展分区的情况。
1.(00):
表示该分区不是活动分区。
2.(0041FE):
(00)16=(0)10 (41)16=(01000001)2(FE)16=(11111110)2
磁头号:
(0)10;
扇区号:
(000001)2=
(1)10.
柱面号:
(0111111110)2=(510)10
所以扩展分区的起始扇区为(510柱面,0磁头,1扇区)。
3.(0F):
表示该分区为扩展分区。
4.(FEFFFF):
(FE)16=(254)10(FF)16=(11111111)2(FF)16=(11111111)2;
磁头号:
(254)10;
扇区号:
(111111)2=(63)10.
柱面号:
(1111111111)2=(1023)10
但这是不准确的,因为当柱面号的真实值超过1023时,表示柱面号的10位也依然是1023。
5.(7E047D00):
反向,(007D047E)16=(8193150)10.表示扩展分区的起始扇区号为8193150,即(510柱面,0磁头,1扇区)。
这是真实准确的,
我一般都用这一项来定位分区起点。
6.(1F2CB400):
反向,(00B42C1F)16=(11807775)10.表示扩展分区共有11807775个扇区。
通过上面得到的起点和分区的大小,
可以推导出扩展分区的结束位置:
8193150+11807775=20000925号扇区,即(1244柱面,254磁头,63扇区)。
二.查找D盘分区表 根据上面的信息,第二个分区表,也即D盘分区表在(510柱面,0磁头,1扇区)处。
读取该扇区,得到分区表如下:
[000141FE0BFEFF7B3F000000BFA35D00]
[0000C17C05FEFFFF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 硬盘 寻址 模式