大容量硬盘的读写操作

摘要:本文主要是讨论系统级C语言程序设计的又一话题:大容量硬盘的读写操作。文章首先介绍了硬盘的物理结构,然后简要地说明了存在容量限制的原因,最后给出了解决问题的方法,并用C语言实现对大容量硬盘的读写和测试操作。文章会涉及部分有关计算机数据存储和中断调用的内容,想要更深一步了解这些内容的读者可以参阅笔者所写的《系统级C语言程序设计(中断服务程序的编写)》或相关资料。

关键词:柱面、磁头、扇区、硬盘寻址模式、CHSLBAATA界面、INT 13界面、扩展INT 13中断、硬盘容量、标准格式化

在对硬盘分区表进行跟踪时,可以发现一个问题:对于一个4.3GB的硬盘,可以正确地找到它的所有逻辑分区,而对于一个10.3GB的硬盘,我们只能够找到近8GB范围内的逻辑分区。同样,在采用传统方式编程来获取硬盘参数时,如果硬盘是4.3GB的,能够得到正确结果,但如果硬盘是10.3GB或更大的,程序就好象成了“近视眼”,只能“看到”8.4GB的容量。这是为什么呢?

为了解决这个问题,首先应该了解硬盘的物理结构。我们可以把硬盘看成一个圆柱体,然后将圆柱体沿垂直于中心轴的方向切成多块薄圆片,对于一个圆片,它有上下两面,每面上都有多个同心圆,每个同心圆又可以分成数量相等的扇形区域,数据就存放在这些扇形区域中。我们把一个圆片不同的上下两面叫做“磁头”(磁面),标号从0开始,把这些同心圆叫做“柱面”(磁道),标号从0开始,把扇形区域叫“扇区”,标号从1开始。对于标准格式化的磁盘,每个扇区一共是512个字节,所以硬盘的容量可以这样计算:

容量=柱面数 * 磁头数 *(扇区数/柱面)* 512(字节/扇区)

其实对于所有标准格式化的磁盘,上面的公式都成立。例如对于软盘,共有2个磁头(磁面),每磁头80条磁道,每磁道18个扇区,所以容量就是:

2 * 80 * 18 * 512 = 1.44MB

了解了硬盘的物理结构后,再来简要谈谈有关ATA界面和INT 13界面。ATA界面是寄存器驱动式并行总线,传输数据时,BIOS先向ATA中特定寄存器写入数据的开始地址和长度,再把相应的读写等命令写入特定寄存器,完成相应操作;INT 13界面其实也是靠寄存器来驱动的,它先将所有的参数包括数据地址等设置好(赋值给寄存器),再调用INT 13中断完成操作。

对于ATA界面,寄存器定义如下:

                                柱面低位寄存器                  8bit

                                柱面高位寄存器                  8bit

                                       扇区寄存器                  8bit

                                设备磁头寄存器                  4bit

如果采用传统的CHSCylinder Head Sector)寻址,其最大寻址容量是:

28+8*28-1* 24 * 512 = 65536*255*16*512=136.9GB

如果采用LBALogic Block Addressing)寻址,其最大寻址容量是:

2(8+8) * 28 * 24 * 512 = 65536*256*16*512=137.4GB

对于INT 13界面,寄存器定义如下:

                                柱面地位寄存器                  8bit

                        柱面高位/扇区寄存器                  2bit/6bit

                                       磁头寄存器                  8bit

如果采用传统的CHSCylinder Head Sector)寻址,最大寻址容量是:

210 * (26-1) * 28 * 512 = 8.456GB

如果采用LBALogic Block Addressing)寻址,最大寻址容量是:

210 * 26 * 28 * 512 = 8.590GB

注意:两种寻址方式的计算公式之所以有差别,是因为CHS寻址方式的扇区首地址是从1开始的,而LBA寻址方式的扇区首地址是从0开始的。

至此,为何存在8.4GB容量限制的原因已经清楚了。概括起来,原因有两个方面:一方面,主板的BIOS程序太旧,无法支持大容量的硬盘,报告给操作系统的参数也就不具备可靠性,解决这一问题的方法就是通过刷新BIOS的方法升级BIOS;另一方面是因为INT 13的局限。为了解决这个软问题,以超越容量限制,人们又定义了新的扩展INT 13,它不再使用操作系统的寄存器传递硬盘参数,而是使用存储在操作系统内存中保存着64LBA地址的地址包。如果硬盘支持ATA,就把地址包低28位传给ATA界面,否则就先转换成CHS

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值