硬盘容量限制变化历史
20080421
草木瓜 转载
原文出处http://www.cuan.cn/blogs/WebPostDetail.aspx?accountname=admin&PostGuid=e94d0f2cf6d54e2784c5822bc1ff0211
这篇文章历史性,体系性内容都很翔实,由原作者表示由衷的感谢。
对于大部分拥有硬盘的用户来说,特别对于那些正在准备升级到大硬盘但是却不打算升级系统的其它部分的用户,它们首先考虑的是自己的系统是否支持这么大容量的硬盘。这个问题同硬盘结构、BIOS和操作系统息息相关--归根到底这些问题的出现是由于当时的人们由于条件所限制而缺乏长远考虑的结果。在当时这样的设计根本没有问题,但是随着技术的进一步发展这些问题就曝露了出来,而且影响颇广。
好在这些问题都已经被通过不同的方式解决了。本章节将会同大家一起来谈谈容量限制的问题。下面的容量限制分别采用两种方式表示,前面的一种采用的是1GB=1000MB和1MB=1000KB的换算,而后面的容量采用的是1GB=1024MB和1MB=1024KB的换算。
528MB/504MB容量限制
这并不是历史上第一个硬盘容量限制问题,但是它是第一个引起人们广泛关注的容量限制问题。这之前硬盘的容量限制问题也一再的出现过,但是因为PC用户非常的少,所以很多人并不知道这些问题,这里我们做一个简短的回顾:
10.4 MB容量限制:这个问题出现在最早的IBM PC/XT上,这种设备使用了一种专门设计的硬盘,它有312个柱面(cylinders)、4个磁头和17个扇区,这样算来它的最大容量只能为10MB,这种容量限制来自于硬盘。 16MB FAT12容量限制:第一种用于硬盘的FAT格式是12bit的,它最多能容纳4086个大小为4096字节的簇,因此总容量为16,736,256字节,也就是大约16MB。 32MB DOS 3容量限制: 为了解决16 MB容量限制,DOS 3.x开始支持FAT16文件系统,不过由于这种文件系统只能允许16384个容量为=2048字节的簇,所以它就造成了32MB的容量限制问题,不过由于多分区的概念的引入,硬盘的容量并没有因此受到太大的限制,只是每个分区的容量不能超过32MB。 128MB DOS 4容量限制:DOS 4.x开始支持65526个容量为2048字节的簇,所以其容量上限提升到了128MB
可以看到上面的这些容量限制的问题大都是由于MS-DOS系统所引起的,这之后的DOS 5允许每个簇的最大容量为8192字节,因此最大分区容量限制为512 MB,不过这个容量限制并没有引起人们的广泛关注,因为在这之前由于BIOS和IDE规范所引起的504MB容量限制首先曝露了出来(大约是1994年左右)。如下表所示:
标准
用于柱面的Bit
用于磁头的Bit
用于扇区的Bit
用于定义整个结构的Bit
IDE/ATA
16
4
8
28
BIOS Int 13h
10
8
6
24
最小定义
10
4
6
20
可以看到IDE/ATA标准和Int 13h组织的标准非常的不一致,因此当分别符合这两个标准的设备配合使用的时候,只能遵循其中的最小规范。下面我们把bit所代表的容量换算了出来:
Standard
最大柱面数
最大磁头数
最大扇区数
最大容量
IDE/ATA
65,536
16
256
128 GB
BIOS Int 13h
1,024
256
63
7.88 GB
最小定义
1,024
16
63
504 MB
对于上面的数字是这样算出来的:1024x16x63x512/1024x1024=504MB,如果不除以1024x1024而是除以1000000的话得到的数字是528MB--按照不同的换算方法,得到的容量不同但是其实指的是一个意思。
2.11/1.97GB容量限制
前面的504MB容量障碍的成因之一是BIOS无法支持超过1024柱面,不过现在的BIOS系统都能支持超过1024柱面。不过当时的部分BIOS系统虽然却只能支持不超过4095个柱面,这是因为它采用了12bit来表示柱面,这样所支持的最大容量就是4096 x 16 x 63 x 512字节了,也就是1.97GB。这个问题是在1996年左右浮现出来的,可以通过软件的方法来解决。
2.11/2GB容量限制
这个容量限制注意的人们会更多一些,它也是由于文件系统的定义造成的分区容量限制,同BIOS没有什么关系。从DOS 6和Windows 3.x以后开始支持FAT16文件系统,如果在这些系统使用容量超过2GB的硬盘必须对于硬盘进行分区,而且每个分区的容量不会超过2GB。
FAT16最大只能支持65536个32KB容量的簇,那么也就意味着每个分区不能超过2GB的容量。估计现在没有用户还会遇到这个问题了,因为只有DOS、Window 3.x和Windows 95第一版会有这个问题,升级到更高版本的支持FAT32或者NTFS文件系统的操作系统(Windows 95 OEM SR2、Windows 98、Windows ME、Windows 2000和Windows XP都支持FAT32,其中后两者都支持NTFS文件系统)就没有这个问题了。
3.26/3.04GB容量限制
这种容量限制的影响范围也非常的小,只是在一些特殊的机型中才出现过,它的出现是由于BIOS无法正确的识别超过6322桌面而造成的--如果用户试图设置高于6322的柱面,系统将会挂起。这个容量限制是这样计算的:6322柱面 x 16头 x 63 扇区 x 512 字节=3GB
Phoenix BIOS容量限制
这是一个比较特别的容量限制,而且范围也非常的小,只是Phoenix BIOS 4.03和4.04这两个版本上出现的问题。它其实只是BIOS设计的一个对于硬盘容量计算错误的bug,基于这两个版本BIOS推出主板的主板厂商有的矫正的这个问题,有的则没有,因此也不是一个绝对的情况,不过这里还是告诉大家,万一有用户遇到一些不能解释的问题,或许这是一个启发。
这个问题比较怪异,如果用户把IDE设备的磁头数目设置为16,而扇区设置为63,那么柱面设置为6349一下不会有任何问题,也就是说硬盘容量不能超过3.05 GB;如果把柱面数目设置为6350-8322之间,程序将会死锁;如果柱面设置为8323-14671之间,那么系统可以正常的工作,但是硬盘的容量无法正常的显示。不过以后版本的BIOS都修正了这个问题。
4.22/3.94GB容量障碍
在解决了504MB容量限制之后,业界对于通过BIOS结构转换(geometry translation)来解决这个问题驾轻就熟。这种方法主要是把硬盘的柱面数除以转换系数来把IDE/ATA的柱面数限制在BIOS能转换的范围之内(也就是1024之内),当然为了保证正确识别硬盘容量在IDE/ATA磁头数目乘以同一个系数(因为BIOS支持的磁头数是256),从而实现对于超过BIOS Int13h规范的硬盘的正确支持。不过这样依然会存在一个3.94GB的容量限制。
下面的表格所表示的是如何让一个符合BIOS int13h规范的BIOS正确的支持容量为6.4GB的硬盘:
柱面数目
磁头数目
扇区
容量
IDE/ATA 限制
65,536
16
256
137 GB
硬盘逻辑结构
12,496
16
63
6.45 GB
BIOS转换系数
除以16
乘以16
--
--
BIOS转换后的结构
781
256
63
6..45 GB
BIOS Int 13h 限制
1,024
256
63
7.88 GB
这款6.4GB的硬盘的逻辑结构为12496柱面、16磁头和63扇区,但是BIOS int13h规范最大只能支持1024个柱面,因此通过除以16使得柱面数目低于1024,而磁头数目乘以16这样的方式,既不会影响硬盘的总容量却巧妙的解决了IDE/ATA和int 13h之间不统一的问题。不过,部分BIOS无法正常的支持256逻辑磁头的转换,所以人们变通了一下,把转换系数改为了15:
柱面数目
磁头数目
扇区
容量
IDE/ATA 限制
65,536
16
256
137 GB
硬盘逻辑结构
12,496
16
63
6.45 GB
BIOS转换系数
除以15
乘以15
--
--
BIOS转换后的结构
833
240
63
6..45 GB
BIOS Int 13h 限制
1,024
256
63
7.88 GB
可以看到当转换系数改为15之后,依然可以满足BIOS柱面要求,而磁头数目只有240。
7.93/7.38GB容量限制
这个容量限制主要是由于接口的限制所形成的,因为这个。不过,在部分系统上由于Int13h接口的限制它的最大容量只有7.38 GB。
其实这个容量限制的成因前面已经提到了,虽然Int13h接口规范支持1024柱面、256磁头和63个512字节的柱面,不过DOS和部分版本的Windows无法转换256逻辑磁头,因此只有使用15做为转换系数,这样最大的磁头数目只能是240,因此这个容量限制为:
1024 x 240 x 63 x 512= 7,927,234,560字节
解决这个问题只有通过Int13h扩展方案。
8.46/7.88GB容量限制
这个容量限制更加通俗的称为8GB容量限制,估计很多看到这篇文章的朋友都经历过这次容量限制。起因还是因为Int 13h规范,它仅仅使用10bit来定义柱面数(最大1024),使用8bit定义磁头数目(最大256),使用6bit定义扇区数目(最大64,但是因为不使用0,所以最大是63),每个扇区的容量是512字节,那么最大的容量为8,455,716,864,这个容量限制是无法通过逻辑结构转换来避免的。
这个时候显然必须要对于Int13接口规范进行修改了,Int 13扩展规范则解决了这个问题。因为操作系统也是通过Int 13h来访问硬盘的,所以实现对于Int13扩展接口规范的支持也需要操作系统的支持,DOS 6.22及其以前的版本、Windows NT 3.5都不支持Int13h扩展,因此使用这些系统无法支持8.4GB以上的硬盘。
32/29.8GB容量限制
微软在1999年宣布Windows 95将不支持容量超过32GB的硬盘,不过Windows 98以及Windows Me都对于32GB以上的硬盘提供了很好的支持,其主要的原因是Windows 95中的Scandisk在保护模式下对于容量超过32GB的硬盘进行磁盘扫描的时候,对于967363以后的柱面全部柱面都报错,显然这仅仅是一个软件错误,但是微软宣布Windows 95不支持超过32GB容量的硬盘,显然是不希望用户再使用这个“古老”的系统了。
33.8GB/32GB容量限制
其实这个容量显示是我们通常所说的32GB容量限制,它的起因还是BIOS。部分版本的Award BIOS无法识别超过65535个柱面,最大只能支持16个逻辑磁头和63个扇区,这样最大支持支持32GB左右的容量。这个问题出现在1999年左右,这之后的产品已经很好的解决了这个问题。
其实为了解决8GB容量限制的问题,人们做了比较长远的打算,开始使用LBA来代替原来的使用柱面、磁头、扇区定位的方式,因此对于出现这个32GB容量限制的问题非常的令人费解。
137/128GB容量限制
这个容量限制是由LBA形成的,LBA通过一个28bit的地址定义了268435456个扇区,每个扇区的容量为512字节,这样LBA最大可以支持137438953472字节的容量,以1000字节=1GB来换算的话,就是大约137GB容量。在BIOS中引入LBA模式时可以计算到这个容量限制为137GB,不过那个时候的硬盘容量只有几个GB,137GB只是一个笑话而已,然后硬盘容量的发展速度的确超乎了人们了想像,目前200GB的容量的硬盘已经在市场上销售了。
那么这些大容量硬盘是如何得到正确的支持的呢?Technical Committee T13组织通过一个48bit的地址来定义了更多的扇区,不出意外的相当长的时间里这个解决方案都不会遇到容量障碍的问题(144155188 GB)。不过由于,现在的用于PC的Windows操作系统都是32bit的,这样就带来了一个2200 GB的容量限制,如果最近几年我们使用的操作系统不能过渡到64bit的话,我们很快就会遇到这个容量限制的。