细说IDE硬盘的容量限制 (转载)

一、引论

IDE硬盘的容量限制对PC业者来说已不是什么新闻,再加上当今市场上不断推出大容量IDE硬盘,用户购买、安装后却发现不能使用全部的硬盘空间(机器BIOS或操作系统不支持)。本文拟详细地谈谈这个问题,并给出具体的解决办法。

二、简要分析

为了了解这个问题出现的原因,我们首先要看看过去,因为今天磁盘驱动器的I/O结构是建立在早先的DOS-BIOS (磁盘操作系统-基本I/O系统)的分层结构上,见下图:

应用程序
|
|<- DOS功能调用
|
文件管理器
|
|<- INT 13中断读写
|
BIOS磁盘服务例程
|
|<- ATA界面
|
ATA(IDE)硬盘界面

应用程序以有名字的文件为对象来处理数据。比方说,当一个字处理程序要保存文档时,这个文档就以某个文件名被存储起来。如果以后字处理程序要读这个文档,还是要通过以前存储的文件名来调入有关的数据。
文件管理器负责文件及其在磁盘上存储位置之间的映射关系,还要通过磁盘读写中断INT13执行读写命令来存储、调入文件。当新文件被保存时,文件管理器决定它在当前目录里的存储位置,在FAT(文件分配表)中为这个新文件添加文件目录项,并把文件写入磁盘。当读文件时,文件管理器在FAT中找到文件在磁盘上的位置,接着就调入文件。
中断13服务例程实际上与操作系统无关,所以它上面的应用程序层和文件管理器层可以属于不同的操作系统,如MAC、DOS、LINUX。
BIOS的磁盘服务例程负责把Int 13的读写请求转化为ATA界面对硬盘的请求,并执行数据I/O传输的物理动作。
下面我们来进一步看看ATA界面和Int 13 界面层。

三、ATA 界面

在介绍ATA界面前,简单说说硬盘的结构:硬盘分为一定数量的柱面(以硬盘中心为圆心的同心圆磁迹),每个柱面都需要磁头来读写数据。另外,硬盘上的数据都是以每扇区512字节的格式存储的,所有的数据传输都是以扇区(柱面被等分的园弧磁迹)为单位的。

ATA界面是寄存器驱动式的并口总线。要传输数据,BIOS 首先往ATA里特定的寄存器写入数据的开始地址和数据传输的长度,再把有关的命令(读或写)往特定的寄存器里发送以触发数据传输的动作。

如今的硬盘一般都支持逻辑块寻址(LBA)和柱面磁头扇区寻址((CHS),拿曾经流行过的CHS寻址方式来说,数据传输的开始地址是写到4个8位寄存器里的,分别是:

柱面低位寄存器
柱面高位寄存器
扇区寄存器
设备/磁头寄存器
从上面可以知道,柱面地址是16位(占用柱面低位寄存器,柱面高位寄存器)。扇区地址是8位,在扇区寄存器里(第一个扇区是1扇区,而不是0扇区)。而磁头地址是4位(没有完全占用8位),在设备/磁头寄存器的低4位。

因此,柱面的最大数是65,536(2的十六次方) ,磁头的最大数是16(2的四次方),扇区的最大数是255(2的八次方-1)。所以,能寻址的最大扇区数是267,386,880 (65,536x16x255)。一扇区又是512字节,也就是说如果以CHS寻址方式,IDE硬盘的最大容量为136.9 GB。

如果以LBA寻址方式,上述28位可用的寄存器空间(16+8+4)被看作一个完整的LBA地址,因为包括位0(不象CHS里扇区不能从0计),能寻址的扇区数是268,435,456 (65,536x16x256),这时IDE硬盘的最大容量为137.4 GB。

四、Int 13 界面

和ATA一样,Int 13界面也是寄存器驱动式的。它的高层即文件管理器层发布数据读写命令和有关的参数给中央处理器,然后导致中断13的发生,激活BIOS的磁盘服务来执行数据传输。数据的开始地址被写到3个8位寄存器里,分别是:

柱面低位寄存器
柱面高位/扇区寄存器
磁头寄存器
其中,柱面地址是10位(占用柱面低位寄存器和柱面高位/扇区寄存器的高2位),扇区地址是柱面/扇区寄存器里低6位。磁头寄存器里的是8位磁头数。

因此,柱面的最大数是1024(2的十次方) ,磁头的最大数是256(2的八次方),扇区的最大数是63(2的六次方-1)。所以,能寻址的扇区数是16,515,072 (1,024x256x63)。一扇区是512字节,也就是说如果以CHS寻址方式,IDE硬盘的最大容量为8.456 GB。

如果以LBA寻址方式,24位可用的寄存器空间(10+6+8)被看作一个完整的LBA地址,因为包括位0(不象CHS里扇区不能从0计),能寻址的扇区数是16,777,216 (210x 26 x 28),这时IDE硬盘的最大容量为8.601 GB。

五、容量限制的分类

目前看来,IDE硬盘容量的限制有四种:

1、528 MB

早期的BIOS并没预料到硬盘的容量会超过500 MB,因此,当把地址从Int 13的地址寄存器转换为ATA的地址寄存器时,只是把INT 13 中10位的柱面地址拿过来往ATA界面中的16位柱面寄存器里放,其中柱面高位寄存器的高6位填0。把6位的扇区地址拿过来往ATA的8位扇区寄存器里放,其中高2为填0。最后,因为那时的BIOS认为磁头数不会超过16(2的四次方),所以只把INT 13磁头寄存器的低4位往ATA里传递。

这时,柱面的最大数是1024(2的十次方) ,磁头的最大数是16(2的四次方),扇区的最大数是63(2的六次方-1)。所以,能寻址的扇区数是1,032,192(1,024x16x63)。一扇区是512字节,也就是说如果以CHS寻址方式,IDE硬盘的最大容量为528.4 MB。这就是“528MB限制”的由来。

为了解决它,后期的BIOS使用了两种算法,它们都能实现Int 13地址和ATA地址相互正确地转变:

A、在那时很多硬盘不支持LBA寻址,所以最初、最流行的算法就是位移法。它把柱面数、磁头数相互转换,这样在保证总扇区数不变的前提下可以正确地转换数据地址。具体转换方法见下表:

表 1 - 位移法

ATA柱面数
(用C1表示) ATA磁头数
(用H1表示) INT13柱面数
(用C2表示) INT13磁头数
(用H2表示) 硬盘容量
理论最大值
1~1024 1~16 C2=C1 H2=H1 528.4MB
1,024~2048 1~16 C2=C1/2 H2=H12 1.057GB
2048~4096 1~16 C2=C1/4 H2=H1
4 2.114GB
4096~8192 1~16 C2=C1/8 H2=H18 4.228GB
8192~16384 1~16 C2=C1/16 H2=H1
16 8.456GB
16384~32768 1~8 C2=C1/32 H2=H132 8.456GB
32768~65536 1~4 C2=C1/64 H2=H1
64 8.456GB

比如说,BIOS检测到硬盘的柱面数是16,384,磁头数是16,它就向上层结构报告柱面数是1048,磁头数是256。经过这样的转变,总扇区数没变,但柱面数和磁头数都符合INT 13的10位柱面数、8位磁头数的寄存器结构。同时,当从INT 13层到ATA界面时,BIOS再把它们转变为符合INT 13的16位柱面数、4位磁头数的寄存器结构。

不过,请注意如果硬盘不能按照表1的柱面数和磁头数来配置,位移法就无效了。另外,因为位移法只是转换柱面数和磁头数,所以当扇区数小于63时(这种情况极少),表1右侧的硬盘容量最大值就不能达到。

B、第二个转换的方法是LBA协助法,本法只能在支持LBA寻址的硬盘上实现。基本原理是:BIOS通过柱面数X磁头数X扇区数的公式先确定硬盘的总扇区数,然后按表2的设置向上层逻辑模块报告各参数。

表 2 - LBA 协助法

总扇区数(用X表示) 扇区数 磁头数 柱面数 硬盘最大容量值
1~1,032192 63 16 X/(6316) 528.4MB
1,032192~2,064384 63 32 X/(63
32) 1.057GB
2,064,384~4,128,768 63 64 X/(6364) 2.114GB
4,128,768~8,257,536 63 128 X/(63
128) 4.228GB
8,257,536~16,450,560 63 255 X/(63*255) 8.422GB

经过这样的转变,硬盘的各参数就都能符合Int 13的寄存器结构了。同时,当从INT 13层到ATA界面时,BIOS再把三个参数相乘,得到一个有效的LBA地址传递给ATA界面。因为这个方法使用了硬盘定位的全部三个参数,所以硬盘的最大容量值可以达到。

2、2.1 GB

这个限制可能由硬件、软件的因素导致。

A、硬件

为了解决“528MB限制”,不同的BIOS生产商使用不同的方法。其中一个就是将INT 13的磁头寄存器的高2位保留给柱面数的11、12位使用。这样,最大的磁头数就是64(2的六次方)。但是一般的操作系统不使用这种转换方法,它认为磁头寄存器的所有位数只记录磁头数。比如,为了正确地转换柱面数为4,096、磁头数为32的硬盘,就需要操作系统把柱面数除以4(1024个逻辑柱面数),磁头数乘以4(128个逻辑磁头数)。可因为上述的BIOS使用磁头数寄存器的高2位记录柱面数,所以就没法存储128的磁头数。有这种BIOS的机器可能在加电自检时执行硬盘确认命令并试图设置CHS值时死机。

B、软件

DOS分区的限制是由文件分配表(FAT,DOS用来记录文件的存储位置,硬盘的使用情况)决定的。FAT处理存储空间是以簇为单位的,它处理一簇的最大长度是32,768 字节,最多能处理65,536 个簇,如果将两个数字相乘,就会得到DOS的最大分区界限值是2,147,483,648 字节或2,048 MB (2,147,483,648 /1,0242)。

3、4.2 GB

不幸的是,有些操作系统用8位寄存器来存储磁头数。这样当BIOS报告硬盘的磁头数等于256时,只有磁头数的低8位(即0)被系统保存,从而导致硬盘配置错误。参照表1,一旦硬盘的磁头数是16,柱面数大于8,192,位移法就会导致这种情况发生。因此,当在上述的操作系统里使用位移法时,硬盘的最大容量就不会超过4.2 GB. 注意:在LBA协助法里磁头数从不超过255,所以用LBA方式寻址的硬盘没有此类容量限制。

4、最新的容量限制-8.4 GB

无论是位移法,还是LBA协助法,都使用在开机自检时BIOS得到的硬盘参数返回值。这些返回值里柱面数、磁头数、扇区数的最大值分别是16,383、16和63,而三者相乘就是8.456 GB。

为了超越这个容量限制,人们又定义了新的扩展INT 13。新的INT 13不使用操作系统的寄存器传递硬盘的寻址参数,它使用存储在操作系统内存里的地址包。地址包里保存的是64位LBA地址,如果硬盘支持LBA寻址,就把低28位直接传递给ATA界面,如果不支持,操作系统就先把LBA地址转换为CHS地址,再传递给ATA界面。通过这种方式,能实现在ATA总线基础上CHS寻址最大容量是136.9 GB,而LBA寻址最大容量是137.4 GB。

六、容量限制的症状

1、528 MB

症状:无论硬盘容量有多大,操作系统报告不超过528 MB。

2、2.1 GB

症状:在加电自检时,BIOS在转换硬盘参数时可能有问题,从而导致死机。

注意:如果用户操作系统的FAT是16位的,为了使用全部的硬盘空间,必须创建多个分区。

3、4.2 GB

症状:在硬盘上创建分区后,再启动机器时死机。

4、8.4 GB

症状:因为这是个新的容量界限,目前还不清楚全部的表现症状。下面是在安装大于8.4GB硬盘时的一些症状:

操作系统报告硬盘容量不超过8.4 GB。
在加电自检时,BIOS在转换硬盘参数时可能有问题,从而导致死机。
格式化硬盘时出错。或者操作系统经常报告硬盘上有坏扇区,而实际上硬盘完好无损。
七、解决方案

1、硬件方案

升级机器系统的BIOS或使用增强型IDE接口(EIDE) ,还可以使用BIOS 扩展卡(它对大容量硬盘提供正确的LBA寻址支持)。

2、软件方案

对BIOS不支持LBA寻址的机器来说,迈拓公司(Maxtor)提供了MaxBlast的软件,它能有效地转换大容量硬盘的各个参数,达到全容量使用硬盘的目的。MaxBlast不是在操作系统启动后才加载的,而是在BIOS启动后、操作系统启动前。最新的MaxBlast可从 www.maxtor.com处下栽。

另外,Western Digital的EZ drive(最新9.0版本)也是类似的软件。 它界于操作系统和BIOS之中,既能符合老式BIOS限制硬盘容量的要求,也能保证操作系统正确地访问整个硬盘。

3、方案产品一览表

下面是主流的BIOS,EIDE扩展卡的一览表:

1)系统的BIOS
下面BIOS的版本都是核心版(CORE)。即使BIOS的生产日期或版本符合下面的条件,也可能不支持扩展INT 13,这是主板商对“核心”BIOS的修改不正确导致的。(一般他们很少向BIOS制造商咨询正确的BIOS升级方案)这有时导致扩展INT 13工作的不正确,结果不是硬盘不能全容量使用,就是硬盘有时出错(严重时可能毁坏启动分区)。如果有上述的情况发生,就需要向主板商索取一份BIOS升级文件。

Phoenix([url]http://www.ptltd.com/):[/url] 基础版本4,修改版本是6(Version 4 Revision 6)和更高的版本支持容量大于8.4GB的硬盘。而如果BIOS的revision是5.12, 它就不支持扩展INT 13。因为所有的Phoenix BIOS基础版本都是 4, 所以升不升级主要看它的修改版本号。Phoenix 建议到Micro Firmware (877-629-2467)那儿要BIOS升级文件。
Award([url]http://www.award.com/):[/url] 在1997年11月及其以后的BIOS支持容量大于8.4GB的硬盘。Award 建议到Unicore(800-800-2467) 那儿要BIOS升级文件。
American Megatrends INC., (AMI)([url]http://www.megatrends.com/):[/url] 在1998年1月及其以后的BIOS支持容量大于8.4GB的硬盘。
2)BIOS 升级卡

BIOS 升级卡可以是控制卡,EPROM 集成电路或上面有BIOS的扩展卡。这些升级卡如果设置的正确,就能覆盖机器当前的BIOS,从而达到硬盘的全容量使用。

Micro Firmware([url]http://max.firmware.com/,)[/url] Micro Firmware公司有三种类型的BIOS升级:EPROM,flash(快闪) BIOS软件包,控制卡。上述的三种产品只要是1998年1月1号以后买的,都支持扩展INT 13。如果是以前买的,就只能向他们要flash BIOS软件升级包了。
pormise(http://www.promise.com)生产的多功能I/O卡,它自带的BIOS能识别大容量硬盘。
八、各种操作系统下的容量界限

因为硬盘使用的最高逻辑层就是操作系统,我们还要看看各种操作系统下的容量界限。即使操作系统支持大于8.4 GB的硬盘容量, 整个电脑系统也有可能不认全部的硬盘。这时需要使用分区软件如MaxBlast ,或购买支持扩展INT 13的升级卡。另外,有些操作系统还有分区大小的限制,这时需要创建多个分区以达到硬盘的全部使用。

1、DOS 6.22 或更低的版本: 不支持大于8.4 GB的硬盘,目前无解决办法。

2、Windows 95(标准版):支持扩展INT 13,所以支持大于8.4 GB的硬盘。但因为FAT16的分区限制,要使用大于8.4G的硬盘,至少要创建5个分区。随着硬盘容量的增大,分区数也要增多(如:11GB 的硬盘需要6个分区)。

3、Windows 95B / OSR2: 支持扩展INT 13,所以支持大于8.4 GB的硬盘。它的FAT32文件系统可以让一个分区包括整个硬盘。不过,只有分区容量大于512MB时,FAT32 分区才能被创建。

4、Windows 98:支持扩展INT 13,所以也支持大于8.4 GB的硬盘。它的FAT32文件系统可以让一个分区包括整个硬盘。不过,只有分区容量大于512MB时,FAT32 分区才能被创建。

5、Windows NT 3.5x: 不支持大于8.4 GB的硬盘,目前无解决办法。

6、Windows NT 4.0: 支持大于8.4 GB的硬盘。可如果当启动分区的容量大于8.4 GB时,NT就不能使用超过8.4 GB的其它硬盘空间了,这是NT的一个缺陷。据微软说已有相关的“补丁”程序推出。

7、Windows NT 5.0 (BETA版): 支持大于8.4 GB的硬盘。使用NTFS文件系统可以使单个分区容量大于8.4GB,不会出现类似NT 4.0的问题了。

小结:微软无意升级他们以前的操作系统去支持大于8.4 GB的硬盘,所以如果需要,请升级操作系统。

8、OS/2 Warp 3 和4: OS/2有些版本的启动分区不能大于3.1 GB 或 4.3 GB,用户可从IBM下栽有关的最新设备驱动软件(文件名是idedasd.exe)来解决,这个软件能让启动分区达到8.4 GB。OS/2的HPFS文件系统能支持高达64 GB 的硬盘容量。

9、Novell: Novell的NetWare 4.0不支持大于8.4 GB的硬盘,因为它还没有使用扩展的INT 13磁盘中断,不过据说他们现在已经开发出4.0的设备驱动升级文件。而Novell 4.12 和以后的版本就支持超过8.4GB的硬盘。

我倒,,你转得还真是长。。
补充一点,,NT4可以支持8.4G以上分区,,不过需要将SP4以上的磁盘驱动提出来。
NOVELL也支持,,同样的提取其SP中的磁盘驱动即可。
另外,,所有的操作系统的引导记录不可能分在磁盘的1024柱面之后。。这是INT13的原因。。:)