Board logo

标题: [讨论] BIOS和分区软件究竟是如何确认硬盘容量的 [打印本页]

作者: DOSforever     时间: 2005-10-14 15:26    标题: [讨论] BIOS和分区软件究竟是如何确认硬盘容量的

这是一个困扰于我已久的问题

我就先从当初的504M容量限制的问题说起,当初超过500M的硬盘出现后许多386、486的机器都不认,后来才知道需要有带LBA寻址模式的BIOS支持才行。从那时起,大容量硬盘在BIOS中选LBA似乎是当仁不让的选择。到后来出现了8G容量的限制问题(中间我跳过一些其它不常见的限制),才知道需要有带扩充Int 13h支持的BIOS才行。注意,从这时候起,我的问题来了。我就以AWARD BIOS为例,在4.5版的情况下,我使用它自己的硬盘参数检测功能,当一个超过8G,比如10G、20G、40G的硬盘,BIOS检测后能给出三种参数:NORMAL模式(我认为其实就是传统的CHS模式),LARGE模式和LBA模式。我想我们大多数人都会毫不犹豫的选择LBA模式,然后分区,格式化,装系统,OK!这都没问题。如果我们的目的只是在于机器可以使用,管它内部究竟是怎么回事,那么我们也不必要来这里了,也没必要讨论这个问题了。

我的问题在于:我曾经试过用其它模式,也可以照常使用,那么是否是现在使用什么模式对硬盘来说是无所谓的呢?如果再仔细比较一下就会发现,三种模式下所能识别出的硬盘容量不是完全一样的,但相差不多,只差那么一点点,这不象以前是有“质”的区别。而且有趣的是,过去能够识别最大容量模式的LBA现在所能识别出的反而最小,而过去所能识别容量最小的CHS模式反倒能识别出最大容量,过去处于中庸的LARGE仍然处于中间水平。那么这个硬盘实际的最大可用容量究竟是多少呢?那个在CHS模式下所认出的最大容量究竟是不是可靠的呢?如果在它这个模式下对硬盘的访问会不会有所损伤呢?由于对这些疑问我始终没有找到答案,所以出于保守起见,我以后一直使用的还是LBA模式,在BIOS给出这三种模式下硬盘参数的同时也默认的推荐是这个模式。此外,在一些品牌机的用户手册中也指导用户使用这一模式,我不知道他们这样做确实是有科学依据的,还是人云亦云不经过调查研究图省事写的。

后来BIOS发展到6.0版的时候情况又发生了新的变化,连手工检测硬盘参数的步骤都省去了,只要接上硬盘开机就能自动识别容量和寻址模式(当然,你也可以手工设定其它模式),而且在BIOS中AUTO方式下自动检测出的硬盘模式和参数都是按照CHS方式的,但奇怪的是自检时所显示的硬件信息概要中所报告的硬盘模式几乎都变成了是LBA?!(特殊情况除外,下面我会说明)那么如此看来似乎LBA应该是唯一的、正确的选择了?按理,硬盘的(最大)容量是固定的,BIOS是根据硬盘固件中的信息来识别硬盘容量的,但好象现在的BIOS都过于“聪明”了,它似乎能根据分区表中的信息再来判断一下硬盘的参数、寻址模式和容量,我说的“再来”是因为BIOS似乎有两次检测,第一次是当你进入BIOS设置的时候可以看到它认出缺省的寻址方式(几乎都是CHS,后来实际变成LBA),而当启动时显示硬件配置信息的时候(不一定就是这时候,只是我们是在这时候看到)它还要检测一次,为什么我要这样说呢,如果你的硬盘是全新的、重新分区的,你是看不出两次变化是有什么意义的,可能认为这种变化只是一个假象,只不过是BIOS“例行公事”。但当你的硬盘在另一台机器上是以CHS方式分区的,再装到这台机器上的时候,你就会看到配置信息中显示的也是CHS方式而不是同样会变成LBA模式。另外,我还曾遇到过这样一种情况:一块4G的老硬盘,在BIOS中认出的确实是4G,但在启动时会变成1G,以后在BIOS中就一直变成1G了,我在BIOS中让它重新检测一下还是1G?!在每次清除CMOS让BIOS重新正确认一遍后,每次启动时又会变成1G?!后来我把MBS清零后就再也没有出现这种怪现象。我虽然不清楚BIOS到底是如何识别硬盘的,但通过上述两个例子,我认为现在的BIOS除了通过固件中的信息外,还会通过启动时在引导OS之前会读取硬盘的分区信息来“智能”地确定硬盘的寻址模式和容量。当然,这些只是我的猜测,到底是怎么回事请熟悉BIOS内部结构的朋友来解答一下。

现在再谈谈分区软件对容量的识别问题,传统的FDISK看不出什么,我先不谈。我现在一般是用DM来分区的,并且通常一直使用带/M参数的手动模式下进行操作,我发现DM和FDISK一样,最小的分区单位也是以柱面为单位的,但奇怪的是我常常碰到用DM分过区的硬盘在FDISK的查看下往往还会显示还有1%的未使用空间,(其实也只不过几兆而已,并不是硬盘容量真正的1%)。所以我一直在想会不会是DM是以LBA模式来识别硬盘的,而FDISK是以CHS来识别的,所以要比DM能多认些扇区?其它的分区软件如PM我估计也是以柱面为单位的。UNIX可以以磁道为单位,LINUX不太清楚。


作者: 不得不爱     时间: 2005-10-14 15:48
1%的未使用空间是DM未分配完的一柱面容量!

作者: DOSforever     时间: 2005-10-14 16:34
但是为什么DM要保留一柱面呢?
还有一个关键的问题就是到底应该用哪个寻址模式呢?还是随便哪个都可以用?

作者: maya0su     时间: 2005-10-14 16:52
分区软件有二种方式察看硬盘容量,一个是通过BIOS,另一个是直接察看!但是很遗憾的是DM和FDISK都是直接察看的!我说的这些还是不能解决你的疑惑,就是说出来罢了!呵呵……

作者: DOSforever     时间: 2005-10-14 16:55
直接察看?怎么个直接察看,是直接对ATA接口进行访问吗?另外,哪些软件是通过BIOS查看的?你说DM是直接查看的我相信,但FDISK也是直接查看的我倒觉得奇怪了,因为如果你在CMOS中把硬盘设为NONE,DM照样可以认出来,而FDISK却会认为No fixed disk。呵呵,你这一说我的问题更多了

Last edited by dosforever on 2005-10-14 at 17:03 ]

作者: willsort     时间: 2005-10-15 18:37
Re dosforever:

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


据此来看,你的关于CHS>LBA的言论可能属于经验上的误差,从而影响了你的判断。

作者: DOSforever     时间: 2005-10-16 13:17
我所说的CHS>LBA并不是指它们各自的最大可寻址容量,而是指对同一块硬盘而言它们各自所认出的寻址容量。这也不是我经验上的误差而是BIOS就是这么报告给我的,如果你的BIOS也是AWARD的话(AMI的不太清楚),你现在就可以重新启动一下机器当场进入BIOS设置中看一下,如果你的硬盘比较大,可能看不出有什么区别。下面是我采集到的几个例子,分别为三种模式下所给出的参数和寻址容量,可以看出CHS的最大,而LBA的为最小,BIOS为AWARD 6.0

一块8G硬盘

Head Sector Cylinder Capacity

CHS 16 63 16708 8623

LARGE 240 63 1113 8616

LBA 255 63 1048 8620


一块10G硬盘

Head Sector Cylinder Capacity

CHS 16 63 19852 10246

LARGE 240 63 1323 10242

LBA 255 63 1245 10241


但奇怪的是,到了60G及以上的硬盘这种区别就不明显了,我想也许是细微的差别不能表示出来罢了。

一块60G盘

Head Sector Cylinder Capacity

CHS 16 255 29437 61496

LARGE 240 255 1962 61482

LBA 255 63 7476 61496

作者: 不得不爱     时间: 2005-10-16 15:12
未分配完的一柱面容量是分区软件dm引起的,可以用pqmagic将未分配完的一柱面容量移动到最后一个分区里!

作者: DOSforever     时间: 2005-10-16 16:48
Originally posted by qwe1234567 at 2005-10-16 15:12:
未分配完的一柱面容量是分区软件dm引起的,可以用pqmagic将未分配完的一柱面容量移动到最后一个分区里!

我想请问一下,你自己有没有遇到过这样的问题

作者: 不得不爱     时间: 2005-10-19 08:46
我也遇到过这样的问题,用ghost克隆硬盘也有类似的问题!

作者: DOSforever     时间: 2005-10-19 09:39
但是你不能就此就得出结论说这肯定是DM或是ghost引起的,因为我也看到用DM分区,但FDISK没有报告还有1%的未使用空间的。还有,在FDISK认为的还有1%的未使用空间的硬盘上根本就没法使用你所说的用PQMagic把“未分配完的一柱面容量移动到最后一个分区里!”!因为PQMagic根本就没有认为还有未使用的空间!还有一点是,我们现在要讨论的是为什么会产生这一现象,而不是告诉别人有这一现象,因为现象大家都看到了。所以又回到了我前面的问题,即使是DM引起的,但为什么DM要保留一个柱面不分配呢?

虽然没有解决我的疑惑,但是对各位的热情参与我还是表示非常的感谢。希望大家有什么确切的资料或者大胆合理的假设也可以说出来讨论。不要怕说错话,因为论坛就是一个给大家讨论问题的地方。

作者: lfdjssz     时间: 2005-10-20 12:03
学习.....................................

作者: DOSforever     时间: 2005-10-21 16:59
谁在使用大硬盘的,比如80G、120G、160G的,能否请按照我在7楼写的格式发个参数上来

作者: 不得不爱     时间: 2005-10-21 17:35
我用的是80G。

作者: DOSforever     时间: 2005-10-24 13:01
Originally posted by qwe1234567 at 2005-10-21 17:35:
我用的是80G。

你回这个贴就是为了告诉我们你用硬盘是80G?

作者: 不得不爱     时间: 2005-10-27 19:52
Head Sector Cylinder Capacity

CHS 16 255 39236 39235

LARGE 240 255 2615 39235

LBA 255 63 9964 39235

作者: fdsiuha     时间: 2005-10-27 22:37
硬盘发展的历史到处都找的到,而且每次硬盘发展的时候突破的限制都有详细介绍。我就不贴了。

我想说的是,这是硬件软件发展不同步的表现,就像在64位CPU上运行16位程序,其他的好多硬件都会有类似的现象。

尤其明显在硬盘上的是,硬盘参数一般是通过BIOS存取的。那么首先BIOS能够接受到的数据地址位数要比硬盘所能够提供的要相等或更大。同样,软件存取BIOS的时候,软件能够接受的数据地址位数也要大于等于BIOS。

所以,每次盘片技术的突破,都会造成已有的软件(包括固化在ROM中的)更新换代。

至于容量的差别是不同计算方法造成的,实际上都是使用28位的寄存器,并没有很大的区别,把硬盘设置成不同模式没有什么实际意义。


PS:我也使用的是80G硬盘,但是我的主板是97年买的430HX主板,通过修改BIOS硬盘模块能够支持80G已经算是个奇迹了,现在的BIOS不能手动设置,只能AUTO。

Last edited by fdsiuha on 2005-11-1 at 20:17 ]

作者: DOSforever     时间: 2005-10-28 00:46
Originally posted by qwe1234567 at 2005-10-27 19:52:
Head Sector Cylinder Capacity

CHS 16 255 39236 39235

LARGE 240 255 2615 39235

LBA 255 63 9964 39235

首先,感谢你为讨论问题而采集了数据。但奇怪的是,这就是你80G的硬盘?怎么看上去象40G?而且为何所有模式下所显示的容量都相同?你的BIOS是AWARD的吗?多少版本号?

作者: DOSforever     时间: 2005-10-28 01:21
Re: fdsiuha

关于这个问题我也曾在网上查找过很多资料,但几乎都差不多,也没有找到能够解释我疑惑的答案。你所说的寻址容量是 软件>BIOS>HDD ,我认为要看什么时候了,当象我们现在可以“稳定”使用的时候是这样,但当硬盘容量有所突破的时候往往是反过来的。

你所说的“至于容量的差别是不同计算方法造成的”能否举个具体的计算实例来说明这个问题。

确实,现在的大硬盘,BIOS都是能够正确的访问。但正如我前面所说的,假如我们的目的只是在于可以使用,那么我们也没必要讨论这问题了。如果从我们能够单独使用这硬盘的角度来说,设成什么模式确实没有什么意义,因为没有人会在乎这几兆容量的差别。但是当你在不同的机器上使用同一块硬盘的时候,有时候,你就会知道这个意义了。或者,一些OS安装软件在你一个已经分好区的硬盘上,把你的分区改的面目全非的,你原来的盘符都不认时候,你也会体会到这个意义了。

另外我想问一下你的BIOS怎么个不能手工设置,是没有这个选项,还是使用手工设置的话它不认?你现在升级后的BIOS是哪种版本的?版本号多少?

作者: 不得不爱     时间: 2005-10-28 07:17
我的BIOS是AWARD V6.0PG BIOS显示硬盘容量为81G,WINDOWS显示硬盘容量为76.26G,现在的BIOS为什么不能手动设置硬盘?我的BIOS可以手动设置硬盘,BIOS的日期为02/27/03。

作者: 不得不爱     时间: 2005-10-28 09:24
『第 18 楼』:
根据我的计算硬盘容量是:
CHS 81962434560 字节
LARGE 81939456000 字节
LBA 81956689920 字节
你是怎么看象40G?所有模式下所显示的容量怎么相同啦?明明不相同嘛!

作者: DOSforever     时间: 2005-10-28 10:02
我把你在第16楼写的参数按相应的列对齐再整理一下

Head Sector Cylinder Capacity

CHS 16 255 39236 39235 (81962434560)

LARGE 240 255 2615 39235 (81939456000)

LBA 255 63 9964 39235 (81956689920)

可以看出 Capacity 一列中所显示的容量均为39235,也就是40G左右。不知你后来所说的81G是在那里显示的。括号中的数值是我按照各个模式下CHS的值分别计算出的容量,和你的计算结果完全相同,是一个80G的硬盘。但为什么在容量一列中所显示是40G,而且数值都一样呢?

作者: 不得不爱     时间: 2005-10-28 14:19
应该是这样:
Head Sector Cylinder Landing zane

CHS 16 255 39236 39235 (81962434560)

LARGE 240 255 2615 39235 (81939456000)

LBA 255 63 9964 39235 (81956689920)
81G是在上面数据是时同一个画面里显示的!Landing zane应该不是硬盘容量,我的硬盘是单碟80G的!

作者: DOSforever     时间: 2005-10-28 15:27
那看来是你自己写错了咯,那你还跟我激动个啥!你前面和我瞎激动了几次我都没怎么和你计较了!要不是看你小子可爱,我……
你现在还写错了,应该是 zone 而不是 zane !

我再问你,你的80G容量到底是怎么显示的,难道就简单显示个“81G”?我想也不会象我们计算的那样会列出具体的数字。

作者: fdsiuha     时间: 2005-10-28 17:33
我的BIOS程序经过两道PATCH的,其中有一个PATCH明确指出PATCH后只能使用AUTO利用PATCH的程序检测硬盘,自己设置当场死机,或自检当机。

其实如果是老BIOS依赖CHS/LARGE/LBA选择的话,你就算在同一个机子中修改了模式,硬盘都是不能正常存取的。更不说移到其他机器上使用了。

作者: DOSforever     时间: 2005-10-28 18:00
你说的对,但这个问题并不限于在老的BIOS上,实际上在所有的BIOS上都是这样的。而且我想你指的不能正常存取是指在一块已经分好区的硬盘上吧。这也正是我为什么要提出这个问题的实用性之一。因为如果大家都是只能用LBA模式的话也就没这个问题了,问题就在于它还有其它模式可选,也可以正常使用(指一旦选定一个模式)。所以我又回到了一开始的问题上来了:

这个硬盘实际的最大可用容量究竟是多少呢?那个在CHS模式下所认出的最大容量究竟是不是可靠的呢?如果在它这个模式下对硬盘的访问会不会有所损伤呢?”

作者: 不得不爱     时间: 2005-10-29 11:07
Originally posted by DOSforever at 2005-10-28 15:27:
那看来是你自己写错了咯,那你还跟我激动个啥!你前面和我瞎激动了几次我都没怎么和你计较了!要不是看你小子可爱,我……
你现在还写错了, ...

是我没有搞清楚,应该是:
Head Sector Cylinder Landing zone Capacity

CHS 16 255 39236 39235 81G (81962434560)

LARGE 240 255 2615 39235 81G (81939456000)

LBA 255 63 9964 39235 81G (81956689920)

作者: fdsiuha     时间: 2005-10-29 16:52
其实没有担心的必要,不同的存取方式都是硬盘所能够接受的。不会说40G硬盘你发出存取80G地址的指令时候磁盘上的机械臂会移出盘片外。显示不同的容量只是硬盘上的空余空间的分配方式不一样。

我们逻辑上的多少头、多少扇、多少道,现在只是一个逻辑概念,并不是真正对应盘片上的3维结构,这个是由硬盘内部的寻址转换引起的。而且即使是在这些所谓被分配的空间之间,也不是连续的,譬如有出厂的时候被标为坏扇区的部分,也有被硬盘登记为未使用的扇区(备分以取代使用后出现的坏扇区)。这些都是硬盘的逻辑电路处理的内部问题。

除了上述的情况,事实上硬盘盘片上可用物理空间要大于实际我们使用的范围不少,很多时候机械臂也可以使磁头移到这些地方上,但是保留这些空间一般都是为了安全或其他的目的,比如所谓的磁头PARK区,不会完完全全用掉。但是这些也都是硬盘内部电路控制的,对不论什么级别的软件,都是不可见的(但是有些硬盘采用不公开的特殊的指令,可以使自己厂商的一些专业硬盘修复、检测软件进行操作)。

作者: DOSforever     时间: 2005-10-30 05:08
我们现在讨论的硬盘最大可用容量当然不包括它的P-LIST和G-LIST以及其它内部所用掉的扇区,我们只是讨论一个从逻辑上来讲对用户是一个“完好无损”的硬盘。实际上我记得好象从几十兆的硬盘开始,在CMOS中的CHS参数就已经不是实际的物理参数了,那时候如果手工指定参数错误是不能正常使用的。所以依照此想法,我在想,尽管你现在无论选择何种寻址模式硬盘都可以正常使用,但会不会假如我选择了一个不恰当的模式,它所寻址的各个扇区,相对与它“应有”的模式是不可靠的呢?或者前面一部分比较接近,而越往后就越是偏离“正常”位置呢?现在,我们没有一个理论根据或者实际使用经验来证明这三种模式都可以完全正常使用,也就是说无非是寻址容量有所差别罢了。如果是这样的话那太好了,看来我们都没有用足我们硬盘的最大容量,今后我们安装新硬盘设置的时候都应该选择CHS模式。根据qwe1234567提供的数据,在CHS模式下与LARGE模式竟有20多兆容量的相差 (81,962,434,560 - 81,939,456,000 = 22,978,560) ,与我们常用的LBA模式也有5兆多的相差 (81,962,434,560 - 81,956,689,920 = 5,744,640) 。即便是有人经过实践证明无论哪种模式都能够完全正常使用,也最好有人能够从理论上来解释一下为什么会造成这一现象,以及我们应该使用CHS模式来达到硬盘的最大使用容量。

这里我再讲一个有关事例:
大名鼎鼎的 PC Tools 5.0 相信各位都一定用过吧,不知你们现在手头还有没有,我还一直保留着,而且有好几种版本,呵呵(我还想以后发个贴专门讨论这件事情)。我们知道,当时它的磁盘编辑功能是很强的。在LBA寻址模式的BIOS和硬盘出现以前,它可以很方便的编辑逻辑盘的各个逻辑扇区或某一簇,以及FAT12/16系统定义的各个逻辑区域,比如可以直接跳转到BOOT区,第一个FAT扇区,第一个FDT扇区和第一个数据扇区。当突破528M容量的BIOS也就是支持LBA的BIOS出现以后, PC Tools 5.0 的磁盘编辑的定位问题来了:当我指定要它跳转到第一个FAT扇区或者第一个FDT扇区的时候,它实际跳转到的并不是该区域,也就是说它的扇区计算位置出现了错误。我想这很可能是由于 PC Tools 是按照CHS寻址模式来设计的,而实际硬盘却是按照LBA来寻址的,所以会造成这一现象。但奇怪的是后来Ext int13h出现后,这么古老的 PC Tools 反而可以正常定位了?!同样是在LBA模式下,为什么会出现两种不同的结果呢?

我举这个事例和我前面所怀疑的扇区定位问题不是一回事,前面我怀疑的是物理定位,也就是说怀疑偏离了扇区的真正的物理位置,而这个例子我认为是逻辑定位问题,也就是说某个扇区的物理位置没错,但不是我要找的扇区。当然,还有可能随着要找的扇区位置的后移,同时具有逻辑定位的偏差和物理位置的偏差。

作者: fdsiuha     时间: 2005-10-31 10:48
哎呀哎呀

CHS和LBA不是同一个计算方法...
28位的寄存器是这样的(就以你前面的60G硬盘为例子):
CHS和LBA分别为:
10000/111 11111/11001011111101
11111 111/11111/11110100110100
因为CHS是C、H、S三个不同寄存器,所以每个寄存器都分别规定最大值,其中的磁头固定为10000。
但是LBA是整个28位全都作为一个整体传送给BIOS,所以可以是2^28=137G。

在这个计算容量的过程中,LBA容量的增量为
LBA=255(磁头,固定)*63(扇区,固定)*512/1024=8032.5K
也就是说,磁盘的最小单位为8M。
这样的好处就是,用户不用知道自己的CHS参数究竟是多少,直接转换为线性地址了(修改:这句话说的%$^&@#,让人误解,其实是我想说的是“这样的好处就是,用户不用知道自己的CHS参数究竟是多少,因为它是由线性地址直接转换而来的”)

但是CHS的计算方法不是这样,因为是对应物理参数(当然后来也是硬盘内部的地址转换),所以,他的所有3个寄存器的值都是可以变动的,这样计算出来的值当然与LBA有微小差别(8M以下),就算是现在前两个寄存器达到最大(现在的所有硬盘所使用的方式),其增量为
CHS=16(磁头,固定)*255(扇区,固定)*512=2040K
与LBA的增量不一样。

这样,一个固定的磁盘空间要同时表示为两个互不能相约的参数,只能牺牲一点(<6M)磁盘空间的寻址了,由于线性寻址的普及,那么这个工作统一由磁盘的内部电路来完成。

你所谓的用CHS达到最大空间的利用率,确实有道理,毕竟LBA的最小增量大一些,容易留下“边角料”。但是LBA是更为先进的性质,尤其是运行在系统级的软件,将逐渐抛弃CHS方式,而且对于现在120G、160G甚至更大的硬盘,<6M的空间没有什么意义,而且以后可能还会采用更大单位的储存方式。另外LBA虽然同样有137G限制,但是它表示地址范围的大一些(最大容量比CHS多500MB左右),而且极其容易的扩展到更大的空间。

至于LARGE我还没有资料,不知道它的工作方式,不好说

Last edited by fdsiuha on 2005-11-1 at 20:23 ]

作者: 不得不爱     时间: 2005-10-31 11:12
我一个245M的小硬盘在LBA
模式下工作时SPFDISK无法对它进行操作,在CHS模式下工作时SPFDISK可以对它进行操作,而且还多出了0.21M,不知道是什么原因。

作者: DOSforever     时间: 2005-11-1 16:30
你那200多兆的硬盘肯定不支持LBA寻址模式,当然只能用CHS模式了。你是接在哪台机器上的,什么版本的BIOS

作者: DOSforever     时间: 2005-11-1 16:38
CHS和LBA确实不是同一个算法,但我认为并不是在BIOS层面上,而是在ATA接口层面上。ATA接口的硬盘寻址寄存器(现以28bit寻址为讨论基础,48bit暂不讨论)分别用了16位,4位和8位来分别表示柱面数、磁头数和扇区数;所以,如果以CHS方式来寻址的话,最大可寻址空间为 2^16 * 2^4 * (2^8-1) = 267386880 个扇区,也就是 136,902,082,560 byte;如果把整个28位用来作表示为一个LBA的线性地址的话,那就是可寻址 2^28 = 268435456 个扇区,也就是 137,438,953,472 byte。这也就是两种方式最大可寻址空间的区别。

具体到某个硬盘是否如你计算所表达的那样我表示怀疑。还是以那块60G的硬盘为例,为了简便起见我们就以扇区为计算单位(其实都一样)。假如按照CHS模式的话,三个参数都在允许的范围以内。但假如按照LBA模式的话 0111111111111111110100110100(B) => 134,217,012(D) 所表示的扇区数已经超出这块硬盘的实际实用扇区数了。反过来,这块硬盘的最大实用扇区数为 120,103,200 (D) => 0111001010001010000100100000(B) 28bit,这个数值无论怎么分割也凑不成该模式下CHS各个参数的。

我们再把那块60G的硬盘的参数的表格扩充计算一下:

LBA Sector count: 120,103,200 sectors

Head * Sector * Cylinder = Total Sectors | Remain | Sectors/Cylinder
| |
CHS 16 255 29437 120,102,960 | 240 | 4080
| |
LARGE 240 255 1962 120,074,400 | 28800 | 61200
| |
LBA 255 63 7476 120,101,940 | 1260 | 16065


通过上面这个例子可以看出,无论哪种模式下,逻辑上的CHS参数乘积所得到的总扇区数都小于LBA(注意,此LBA非彼LBA,下面会说明)所给出的总扇区数,而且剩余的扇区数都不到该模式下每柱面的扇区数,也就是不足以构成一个柱面。因此,我认为CHS和LBA算法的不同只是表现在ATA接口层面上,而在BIOS层面上所显示出的各个模式的各个CHS参数都是以ATA接口的LBA总扇区数为基础进行换算的,而且是以柱面为单位分配的,所有这些柱面相加的总扇区数不超过LBA给出的总的扇区数,不足的部分省略。

说了那么多的LBA和CHS,我认为有必要说明一下,不然的话很可能会引起混淆

我认为有两个LBA的概念,一个是ATA层次上的 LBA ,也就是这个硬盘内部的可线性寻址的最大扇区数,我认为这就是这块硬盘的最大可用扇区数;而另一个 LBA 是指在BIOS层面上,也就是BIOS向OS报告的它的寻址模式。
同样,有两个CHS概念,一个是指 CHS模式 ,也就是BIOS的一种寻址方式;而另一个是 CHS参数 ,是所有模式下都要用到的柱面、磁头、扇区数的参数。

到此为止,我认为我们可以暂且得出一个结论,也就是我在表格下面的第一段话。对于这个结论我没有什么理论依据和实际实验来证明其正确性,只能通过纸面上的一些数据来“自圆其说”。关于两个LBA和CHS的概念也是我自己分析的结论,同样没有什么理论基础。现在,尽管还有许多细节问题没有搞清楚,比如 PC Tools 5.0 的逻辑定位问题,但我认为我们还是取得了一定的进展。真是非常感谢所有参与讨论和关注此问题的朋友,特别是 fdsiuha 。同时也希望有更多的朋友能提供试验数据和提出理论假设,也希望有功底深厚的大师能不惜赐教。

Last edited by DOSforever on 2005-11-1 at 16:48 ]

作者: fdsiuha     时间: 2005-11-1 19:21

但假如按照LBA模式的话 0111111111111111110100110100(B) => 134,217,012(D) 所表示的扇区数已经超出这块硬盘的实际实用扇区数了。反过来,这块硬盘的最大实用扇区数为 120,103,200 (D) => 0111001010001010000100100000(B) 28bit,这个数值无论怎么分割也凑不成该模式下CHS各个参数的


不是这个意思,LBA的存取确实把28位的寄存器作为一个统一的部分存取,但是使用这个寄存器的时候,仍然分为C、H、S这3部分相乘,其中对于更大的硬盘来说,H更大些,另外两个参数是固定的(好好想一下3个参数的物理意义);此所谓地址线性增加,非我们所见的28位寄存器的大小,从0->n,而是硬盘内部的所有扇区都有一个从小到大的编号,这样做自然是把LBA看成是具有CHS参数的硬盘,保持兼容性。

所以你上面说的的B->D转换方式是不正确的。所以后面自然就“无法自圆其说”了。


PS:另外查了所谓LARGE,无非是在INT13的两个寄存器之间相互借4位来存取更多的空间罢了,与CHS没有本质区别。还有忘了说了,就是并不是LBA方式解决500MB的限制问题。

Last edited by fdsiuha on 2005-11-1 at 20:29 ]

作者: DOSforever     时间: 2005-11-2 01:16
我们先把讨论的基础确定下来,不然的话会陷入混乱。首先我们先确定有几件事是可以肯定的。一个是一个硬盘的最大可寻址扇区数是确定的,由厂商给出。另一个是要寻址的扇区地址是经过两次转换,一次是BIOS,另一次是ATA接口。假如这两件事是可以确定的,好,我们接着讨论。

我想你所说的寄存器应该是指ATA寄存器而不是Int 13h所用的寄存器吧,假如是的话,你说LBA模式使用这个寄存器的时候仍然是3部分相乘,那么这样一来岂不是和CHS模式没有区别了吗?怎么体现它的“整体”概念和CHS本质的区别呢?

另外,我认为随着硬盘容量的增加不是 H 值的增大而是 C 值的增大,H 反而是固定的,因为表示磁头的位数最少,最容易达到饱和。

我记得好象LARGE模式是最初突破504M限制的,后来才出现LBA模式的,由于这种模式现在也不常用,所以我们就不把它纳入讨论范围了。只要能搞清楚CHS和LBA也一样。

Last edited by DOSforever on 2005-11-2 at 01:17 ]

作者: fdsiuha     时间: 2005-11-2 15:44
至于“整体”的概念,我说过了,它是硬盘内部的机制。现在的硬盘内部寻址是使用CHS的,而是把所有的扇区统统编号,直接靠这个编号来寻址。然后在硬盘的接口上它被转化为一个CHS参数。为什么要如此麻烦呢?第一,硬盘太大,里圈和外圈每道扇区数相差太大,用直接反映磁盘3维结构的CHS参数对于软件来说变化范围太大,而且不同的硬盘之间也不一样。这样做会使软件难以适应大部分的硬盘(譬如1头10柱面有128个扇区,由于你寻址到64为止,损失一半空间,在如1头1柱面只有32个扇区,由于寄存器可以寻址到64个,所以寻址就会经常出现越界),统一编号扇区后,逻辑上就只存在柱面的范围(就是盘片的直径乘密度,换句话,就是磁道密度的变化)的变化,不会越界,也不会损失空间。第二,虽然废除了CHS直接寻址,但是软件都使用固定的CHS格式来寻址,尤其微软的软件。所以对外还是要以CHS方式传递参数。

所以我的意思是:硬盘28位的寄存器,是软件和硬件之间的接口。就是当向硬盘提交了存取方式之后,硬盘内部寻址机构就会具此选择地址转换的模式。我在前面已经说过了,虽然LBA和CHS在硬盘的内部使用不同的方式寻址,所有的硬盘模式返回28位的都是CHS参数。这个转换过程由硬盘来完成,软件没有必要也操不到这个心。

LBA和CHS其实没有什么本质的区别。你去看你的电脑BIOS,它只有NORMAL、LARGE、LBA、AUTO而没有分成CHS、LBA、LARGE吧。因为LBA它就是用CHS的其中一个方式,只不过,他的28位全都可以为最大值,可以全是1。造成的影响就是每柱面的扇区多一些。

而我们以前那些所谓的限制只是由于软件-软件-软件之间的转换造成的。与CHS和LBA没有关系。只是到137G才是物理极限,新硬盘采用48位寄存器才能解决。

之后,才是软件--包括BIOS--负责接下来的工作,其中的I\O例程按照给定的C、H、S寻址,读写磁盘。

我们之所以软件看到的LBA、CHS设置以及不同的数值,只是硬盘内部按不同的寻址给出的。BIOS一般不做更进一步的变换(LARGE要稍微做一点变化,所以LARGE其实是软件实现的,因此兼容性不好)。

你还说过PC兔子的问题,不只是它,好多磁盘软件都出现过类似的问题,这种问题的根源就是地址的转换问题,就是因为它通过BIOS(通过DOS那就当然更不行了)存取磁盘。你把你现在使用的LBA或NORMAL换成NORMAL或LBA,再开机系统都启动不了,马上当机给你看--BIOS连操作系统的启动扇区都定位不到,你还能指望老版本的PC兔子能通过BIOS来做什么?我有一大把这样的DOS软件,十有八九,一打开就马上死机。


--------------------------------------------------
我的个人网站有关磁盘的详细介绍,还没做完估计到年底也做不完,唉

Last edited by fdsiuha on 2005-11-2 at 16:08 ]

作者: 不得不爱     时间: 2005-11-3 09:58
关于我的小硬盘(245M)请看http://www.cn-dos.net/forum/viewthread.php?tid=17118&fpage,至于多出了0.21M是SPFDIS认出来的,不是计算出来的,200多兆的硬盘肯定支持LBA寻址模式,而且FDISK可以在LBA寻址模式分区,在外加硬盘时,pqmagic正常启动,没发现错误,也能分区。该硬盘上的DOS启动正常,就是除了在CHS模式下工作时SPFDISK正常,其他模式下工作时SPFDISK均不认识小硬盘的分区。BIOS的版本请看『第 20 楼』!

作者: fdsiuha     时间: 2005-11-4 21:27
建议联系该软件作者^^

作者: zjnbwdj     时间: 2005-11-6 13:39
即便是用FDISK来分区,用SFDISK(一个我经常用的硬盘分区和格式化软件)来查看,还是有好多空闲的硬盘空间,也就是还没有100%的对硬盘进行分区.

作者: rainhard     时间: 2005-11-7 11:27    标题: CHS应该是物理方式,而LBA是模拟方式在早期兼容更大容量的
早期的BIOS/DOS在CHS方式下不支持比较大的Cylinder值,LBR就是通过算法将Cylinder值虚拟成header,LARGE也是一种虚拟的算法。
后来的BIOS和32位系统已经支持了更大的Cylinder,所以用哪种方式应都是差不多的。

作者: weilong888     时间: 2006-10-6 08:34
这种对硬盘的讨论是很有价值的。可惜我的认识没有各位的深刻。要知道,整台电脑,就是这硬盘上的数据最重要了。