由于硬盘的存储介质为圆盘,过去的硬盘采用了与软盘类似的寻址方法,即使用下面的CHS参数寻址,这又称为3D参数。
磁头数(Heads) 表示硬盘总共有几个磁头,也就是有几面盘片, 最大为 256 (用 8 个二进制位存储),由0开始计;
柱面数(Cylinders) 表示硬盘每一面盘片上有几条磁道, 最大为 1024(用 10 个二进制位存储),由0开始计;
扇区数(Sectors per track) 表示每一条磁道上有几个扇区, 最大为63 (用 6 个二进制位存储),由1开始计。
每个扇区一般是 512个字节, 理论上讲这不是必须的, 但好象没有取别的值的. 请注意下面的说法中的CHS有的指CHS参数,有的是指CHS地址。所谓CHS参数是指一个硬盘的CHS划分的情况,一定情况下它是固定的,相当于坐标轴上的单位。所谓CHS地址是指某个扇区的CHS的地址,不同的扇区CHS地址是不同的,相当于坐标轴上的坐标值。
在 CHS 寻址方式中, 有以下几种尺寸单位: 扇区 (Sector) = 512 字节 (一般情况下) 磁道 (Track) = (Sectors per track) 扇区
柱面 (Cylinder)= (Sectors per track) * Heads 扇区
由于上述的限制,所以磁盘最大容量为:
256 * 1024 * 63 * 512 / 1048576 = 8064 MB ( 1M = 1048576 Bytes ) 或硬盘厂商常用的单位:
256 * 1024 * 63 * 512 / 1000000 = 8455 MB ( 1M = 1000000 Bytes )
在 CHS 寻址方式中, 磁头, 柱面, 扇区的取值范围分别为 0 到 Heads-1,0 到 Cylinders-1, 1 到 Sectors per track (注意是从 1 开始).
过去的操作系统利用int 13使用CHS寻址,因此寻址的能力只能是8.4GB,这就是为什么会存在8G限制的原因,比如原来的linux启动分区也必须安装在8G之内。
在老式扇区中,由于每个磁道的扇区数相等,所以外道的记录密度要远低于内道,因此会浪费很多磁盘空间(与软盘一样)为了解决这一问题,进一步提高硬盘容量,人们改用等密度结构生产硬盘。也就是说,外圈磁道的扇比内圈磁道多。采用这种结构后,硬盘不再具实际的3D(柱面,磁头,扇区)参数,寻址方式也改为实际的线性寻址方式,即以逻辑扇区为单位进行。
逻辑扇区是物理扇区的一组连续数字从0开始的编号(注意是从0开始)。例如,一个逻辑扇区的表示方法是"2736扇区",而不再是3D参数"100柱面,2磁头,1扇区"。这种线形寻址方式得到的地址我们称为逻辑地址,可能就是指LBA (logical Block Adress)。原来的CHS寻址方式我们称之为物理地址,尽管它目前已经没有了物理的含义。
计算方法可能是(我猜的),C*Cylinder + H*Track + S -1 = 线性寻址的sector地址。(也有一种说法说计算逻辑扇区的时候不计入MBR所在的柱面的,好像没有必要呀)。 为了与使用3D寻址的老软件兼容(例如,使用BIOS Int 13H接口的软件),在硬盘控制器内部安装了一个地址翻译器,由它负责将老式3D参数翻译成新的线形参数。这也是为什么现在硬盘的BIOS有多种选择的原因(不同的工作模式,对应不同的3D参数,例如LBA,LARGE和NORMAL,目前来说可能只有LBA有意义了)。
最早的LBA只有24位,因此也受到8G的容量限制,为了解决这个问题人们推出了28位的LBA。不知道为什么人们总是这么短视,低估了硬盘的发展速度,看下面就知道了。 许多基于intel的操作系统采用CHS的方式通过int 13来寻址,尽管硬件可能通过LBA的方式来寻址。由于int 13受到8G容量的限制,因此人们推出了新的扩展int 13的方法来寻址。
新的INT13它使用存储在操作系统内存里的地址包。地址包里保存的是64位LBA地址,如果硬盘支持LBA寻址,就把低28位直接传递给ATA接口,如果不支持,操作系统就先把LBA地址转换为CHS地址,再传递给ATA接口。
如果采用前一种LBA方式,这28位可用的寄存器空间被看作一个完整的LBA地址,因为包括0(不象CHS里扇区不能从0计),能寻址的扇区数是268,435,456,这时IDE硬盘的最大容量为137.4 GB。
使用后一种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。
但是这个限制很快又被突破了,因此人们推出了48位LBA的新规范,这样可以访问的容量是2^48/10^9=144115188G,这个数目应该是够用了。
但是,其实没有这么简单,由于32位操作系统的限制,目前还有一个限制可能是一个问题,那就是2^32/10^9=2200G,也有说2048G,根据1G为十进制还是二进制不同。至少我觉得硬盘分区表DPT中存储的是32位的LBA地址就需要考虑新的规范。
以上主要是我对从网上的整理修改和总结,其中的内容不一定正确,在此感谢这些文字的原创者,尽管已经不知道他们是谁了。
罗嗦这么多,总结一下其实很简单,由于原来的24位的CHS访问,产生了8G的限制;采用28位LBA寻址或者28位CHS寻址产生了137G的限制;由于32位系统的限制,存在2T的容量限制。有的容量限制有些差异,这可能是由于LBA扇区从0开始计,而CHS的扇区数由1开始计造成的(其实我觉得这不是矛盾,这些人也太死心眼了,你从1开始计,把全零当作64或者256不就统一了吗,真是自己和自己过不去,呵呵,我也就这么一说,这种计算还存在其他技术问题)。还有的时候是由于M、G、T是采用二进制还是十进制造成的,比如十进制千兆(此时 1 GB = 1,000,000,000 字节)或二进制千兆(此时 1 GB = 1,073,741,824 字节)。其实我觉得应该搞一个新的单位,比如二进制的叫做BK(Binary Kilo)、BM(Binary Million)、BG(Binary Giga)、BT(Binary Trillion)(好像有些专有缩写,"别看 斑竹 报告 变态"呵呵)也就可以了,避免了许多混淆。 这里定义如下:
1BK=1024,1BM=1024BK=1BK*1BK,1BG=1024BM,1BT=1024BG~=1.0995T。
我们是从8.4G限制开始谈得,其实,历史上还有一些别的限制,比如528M、2.1G、4.2G等等,参考http://www.goldwing-c.com/pc/new/idexxx.htm 。
总之,好像每走一步就会遇到自己制造的一些限制。其实一切本来不必这么复杂的,如果从开始,一切都采用64位的LBA线性寻址(至少32位),就OK大吉了,其他的一切交给硬盘控制器自己解决吧,我们只要知道简单的线性寻址就行了其他都不用管。可是商家和技术人员非要搞出这些貌似繁杂其实无聊的知识和技术,消耗人们的心神,如果你不知道的话,当你遇到BIOS设置、当你查看硬盘分区表、当你使用int 13中断、当你遇到容量限制问题等等的时候,就会无所适从、不知所以然。
从硬盘容量的问题上我们可以看到技术人员自己或者相互制造麻烦的能力(想想震动全球的Y2K问题吧),我们更应该看到技术人员不断的制造困难然后不断的克服困难的勇气、决心和无穷乐趣(呵呵,只有解决困难才有成就感吗),没有困难并不怕,我们制造困难也要继续前进,相信无论将来我们制造出怎样的困难,我们总能克服它,因为一切毕竟不断在发展嘛。
呵呵,just kidding,从中我们最应该看到的是硬盘技术的飞速发展,超过了我们的预期,之所以出现这些限制是由于当时的条件所限和低估了技术的发展造成的(因为所有的规范都应该是实现的成本和预期的发展之间的一个折衷,也许不久以后我们就会埋怨48位LBA的短视了),我们只有这样在磕磕绊绊中不断改进、在过去的包袱中不断发展才能不断提高,过去给予我们的既是教训也是经验,(谁也不可能横空出世、而且没有历史的横空出世可能孕育着更大的危险)这就是现实的技术现实的生活,所有伟大的理想的实现都是由琐碎和细节造成的,我们可以追求理想但要接受现实,感谢所有创造这些技术的人,无论他们各自是怎样的初衷,正是由于他们的努力飞速的改变着我们的生活。
下一个到来的限制我想应该是2BT的问题了,但是2BT的容量限制现在好像还远得很,仿佛可以不管,车到山前必有路总会有办法的,等到那一天来了再说吧,再说,64位的系统不是已经出来了吗,我们还是得过且过安心的睡大觉吧!:)
磁头数(Heads) 表示硬盘总共有几个磁头,也就是有几面盘片, 最大为 256 (用 8 个二进制位存储),由0开始计;
柱面数(Cylinders) 表示硬盘每一面盘片上有几条磁道, 最大为 1024(用 10 个二进制位存储),由0开始计;
扇区数(Sectors per track) 表示每一条磁道上有几个扇区, 最大为63 (用 6 个二进制位存储),由1开始计。
每个扇区一般是 512个字节, 理论上讲这不是必须的, 但好象没有取别的值的. 请注意下面的说法中的CHS有的指CHS参数,有的是指CHS地址。所谓CHS参数是指一个硬盘的CHS划分的情况,一定情况下它是固定的,相当于坐标轴上的单位。所谓CHS地址是指某个扇区的CHS的地址,不同的扇区CHS地址是不同的,相当于坐标轴上的坐标值。
在 CHS 寻址方式中, 有以下几种尺寸单位: 扇区 (Sector) = 512 字节 (一般情况下) 磁道 (Track) = (Sectors per track) 扇区
柱面 (Cylinder)= (Sectors per track) * Heads 扇区
由于上述的限制,所以磁盘最大容量为:
256 * 1024 * 63 * 512 / 1048576 = 8064 MB ( 1M = 1048576 Bytes ) 或硬盘厂商常用的单位:
256 * 1024 * 63 * 512 / 1000000 = 8455 MB ( 1M = 1000000 Bytes )
在 CHS 寻址方式中, 磁头, 柱面, 扇区的取值范围分别为 0 到 Heads-1,0 到 Cylinders-1, 1 到 Sectors per track (注意是从 1 开始).
过去的操作系统利用int 13使用CHS寻址,因此寻址的能力只能是8.4GB,这就是为什么会存在8G限制的原因,比如原来的linux启动分区也必须安装在8G之内。
在老式扇区中,由于每个磁道的扇区数相等,所以外道的记录密度要远低于内道,因此会浪费很多磁盘空间(与软盘一样)为了解决这一问题,进一步提高硬盘容量,人们改用等密度结构生产硬盘。也就是说,外圈磁道的扇比内圈磁道多。采用这种结构后,硬盘不再具实际的3D(柱面,磁头,扇区)参数,寻址方式也改为实际的线性寻址方式,即以逻辑扇区为单位进行。
逻辑扇区是物理扇区的一组连续数字从0开始的编号(注意是从0开始)。例如,一个逻辑扇区的表示方法是"2736扇区",而不再是3D参数"100柱面,2磁头,1扇区"。这种线形寻址方式得到的地址我们称为逻辑地址,可能就是指LBA (logical Block Adress)。原来的CHS寻址方式我们称之为物理地址,尽管它目前已经没有了物理的含义。
计算方法可能是(我猜的),C*Cylinder + H*Track + S -1 = 线性寻址的sector地址。(也有一种说法说计算逻辑扇区的时候不计入MBR所在的柱面的,好像没有必要呀)。 为了与使用3D寻址的老软件兼容(例如,使用BIOS Int 13H接口的软件),在硬盘控制器内部安装了一个地址翻译器,由它负责将老式3D参数翻译成新的线形参数。这也是为什么现在硬盘的BIOS有多种选择的原因(不同的工作模式,对应不同的3D参数,例如LBA,LARGE和NORMAL,目前来说可能只有LBA有意义了)。
最早的LBA只有24位,因此也受到8G的容量限制,为了解决这个问题人们推出了28位的LBA。不知道为什么人们总是这么短视,低估了硬盘的发展速度,看下面就知道了。 许多基于intel的操作系统采用CHS的方式通过int 13来寻址,尽管硬件可能通过LBA的方式来寻址。由于int 13受到8G容量的限制,因此人们推出了新的扩展int 13的方法来寻址。
新的INT13它使用存储在操作系统内存里的地址包。地址包里保存的是64位LBA地址,如果硬盘支持LBA寻址,就把低28位直接传递给ATA接口,如果不支持,操作系统就先把LBA地址转换为CHS地址,再传递给ATA接口。
如果采用前一种LBA方式,这28位可用的寄存器空间被看作一个完整的LBA地址,因为包括0(不象CHS里扇区不能从0计),能寻址的扇区数是268,435,456,这时IDE硬盘的最大容量为137.4 GB。
使用后一种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。
但是这个限制很快又被突破了,因此人们推出了48位LBA的新规范,这样可以访问的容量是2^48/10^9=144115188G,这个数目应该是够用了。
但是,其实没有这么简单,由于32位操作系统的限制,目前还有一个限制可能是一个问题,那就是2^32/10^9=2200G,也有说2048G,根据1G为十进制还是二进制不同。至少我觉得硬盘分区表DPT中存储的是32位的LBA地址就需要考虑新的规范。
以上主要是我对从网上的整理修改和总结,其中的内容不一定正确,在此感谢这些文字的原创者,尽管已经不知道他们是谁了。
罗嗦这么多,总结一下其实很简单,由于原来的24位的CHS访问,产生了8G的限制;采用28位LBA寻址或者28位CHS寻址产生了137G的限制;由于32位系统的限制,存在2T的容量限制。有的容量限制有些差异,这可能是由于LBA扇区从0开始计,而CHS的扇区数由1开始计造成的(其实我觉得这不是矛盾,这些人也太死心眼了,你从1开始计,把全零当作64或者256不就统一了吗,真是自己和自己过不去,呵呵,我也就这么一说,这种计算还存在其他技术问题)。还有的时候是由于M、G、T是采用二进制还是十进制造成的,比如十进制千兆(此时 1 GB = 1,000,000,000 字节)或二进制千兆(此时 1 GB = 1,073,741,824 字节)。其实我觉得应该搞一个新的单位,比如二进制的叫做BK(Binary Kilo)、BM(Binary Million)、BG(Binary Giga)、BT(Binary Trillion)(好像有些专有缩写,"别看 斑竹 报告 变态"呵呵)也就可以了,避免了许多混淆。 这里定义如下:
1BK=1024,1BM=1024BK=1BK*1BK,1BG=1024BM,1BT=1024BG~=1.0995T。
我们是从8.4G限制开始谈得,其实,历史上还有一些别的限制,比如528M、2.1G、4.2G等等,参考http://www.goldwing-c.com/pc/new/idexxx.htm 。
总之,好像每走一步就会遇到自己制造的一些限制。其实一切本来不必这么复杂的,如果从开始,一切都采用64位的LBA线性寻址(至少32位),就OK大吉了,其他的一切交给硬盘控制器自己解决吧,我们只要知道简单的线性寻址就行了其他都不用管。可是商家和技术人员非要搞出这些貌似繁杂其实无聊的知识和技术,消耗人们的心神,如果你不知道的话,当你遇到BIOS设置、当你查看硬盘分区表、当你使用int 13中断、当你遇到容量限制问题等等的时候,就会无所适从、不知所以然。
从硬盘容量的问题上我们可以看到技术人员自己或者相互制造麻烦的能力(想想震动全球的Y2K问题吧),我们更应该看到技术人员不断的制造困难然后不断的克服困难的勇气、决心和无穷乐趣(呵呵,只有解决困难才有成就感吗),没有困难并不怕,我们制造困难也要继续前进,相信无论将来我们制造出怎样的困难,我们总能克服它,因为一切毕竟不断在发展嘛。
呵呵,just kidding,从中我们最应该看到的是硬盘技术的飞速发展,超过了我们的预期,之所以出现这些限制是由于当时的条件所限和低估了技术的发展造成的(因为所有的规范都应该是实现的成本和预期的发展之间的一个折衷,也许不久以后我们就会埋怨48位LBA的短视了),我们只有这样在磕磕绊绊中不断改进、在过去的包袱中不断发展才能不断提高,过去给予我们的既是教训也是经验,(谁也不可能横空出世、而且没有历史的横空出世可能孕育着更大的危险)这就是现实的技术现实的生活,所有伟大的理想的实现都是由琐碎和细节造成的,我们可以追求理想但要接受现实,感谢所有创造这些技术的人,无论他们各自是怎样的初衷,正是由于他们的努力飞速的改变着我们的生活。
下一个到来的限制我想应该是2BT的问题了,但是2BT的容量限制现在好像还远得很,仿佛可以不管,车到山前必有路总会有办法的,等到那一天来了再说吧,再说,64位的系统不是已经出来了吗,我们还是得过且过安心的睡大觉吧!:)
Spirituel@SMTH 2004-7