发信人: dalasthunder(Dallas)
整理人: blainelinar(2001-07-19 21:00:54), 站内信件
|
★原文转载自DOS版dalasthunder的《对硬盘管理的部分解说》★ 硬盘的第一个扇区叫做主引导记录 MBR(Master Boot Record),其中中包含了一个
分区表描述分区(这里指主分区:Primary Partition)信息,有四个表格给四个主分区
使用, 该表格结构为:
struct partition {
char active; /* 0x80: 引导分区 0: 非引导分区 */
char begin[3]; /* 第一个扇区的 CHS 编号 */
char type; /* 分区类型 */
char end[3]; /* 最后一扇区的 CHS 编号 */
int start; /* 32 bit 的起始扇区号(从 0 开始) */
int length; /* 32 bit 的扇区的数目 */
};
(其中 CHS 是 柱面/磁头/扇区:Cylinder/Head/Sector 的缩写,每扇区为 512 字节,
硬盘的结构就不说了,簇的概念也和这里无关)
所以,有一项信息是重复的:分区的位置既可以由 24 bit 的 begin 以及 end 字段确定,
也可以由 32 bit 的 start 以及 length 字段确定。
Linux 中只使用了 start 以及 length 字段,所以最多可以处理包含 2^32 个扇区的分区,
也就是,最大 2 TB(2,199,023,255,552 字节)的分区。这是目前最大 80GB 硬盘容量的
25 倍,暂时还能够满足要求。
不幸的是,BIOS INT13 中断使用了三个字节的 CHS 编号,10 bit 作为柱面号码,8 bit
作为磁头号码,以及 6 bit 作为磁道上扇区的号码。可能的柱面号码是 0-1023,可能的磁头
号码是 0-255,而可能的扇区号码为 1-63(磁道上的扇区是由 1 起算,不是 0)。以这
24 bit 最多可以寻址
1024X256X63X512 = 8,455,716,864 个字节(7.875 GB)。这是 1983 年的硬盘容量的
两百倍,但却不能满足当今的需要。
更不幸的是,标准的 IDE 接口允许 65536 个柱面,16 个磁头以及 256 个扇区。它自己本身
可以存取的容量是
2^28X512 = 137,438,953,472 个字节(128 GB)。但是加上 BIOS 方面 63 个扇区和 1024
个柱面的限制后就只剩下了
1024X16X63X512 = 528,482,304 个字节(504 MB)可以寻址的到。
这早已不足以应付当今的硬盘,人们使用各种硬件或软件上的方法来克服。
没有人对硬盘的“真实”几何学地址有兴趣。磁道的扇区数通常是变动的 - 接近磁盘外围的磁道有
比较多的扇区 - 所以没有“真实”的每磁道扇区数。对于使用者而言最好是把磁盘当作编号 0,1,...,
的扇区组合成的线性阵列,让控制器去找出扇区究竟位于磁盘的哪里。
此线性编号一般通称为 LBA(Logical Block Addressing),对于(C,H,S)的硬盘而言,
几何学地址为(c,h,s)的线性地址为 c*H*S+h*S+(s-1)。所有 SCSI 控制器都使用 LBA,
某些 IDE 控制器也是。
如果 BIOS 把这 24 个bit (c,h,s)转换成 LBA 并传递给懂得 LBA 的控制器, 那么又可以
寻址到 7.875 GB。并不足以应付所有的硬盘,但仍然是个改进。注意此处 BIOS 使用的 CHS,
它不再与“实体”有任何关系。
当控制器不懂何为 LBA 但是 BIOS 知道如何转换时有些类似的方法可行。(在 BIOS 设定中通常
称为“Large”。)现在 BIOS 将把几何学地址(C',H',S')报告给操作系统,而在与硬盘控制器
沟通时则使用(C,H,S)。通常 S = S',C' = C/N 而 H' = H*N,其中 N 是确保 C' <= 1024
的 2 的最小次方数(所以 C' = C/N 时舍去的数浪费少许容量)。再一次,这允许存取最多达
7.875 GB。
如果 BIOS 不知道“Large”或是“LBA”,那么还是有软件的解决方案。像是 OnTracker 或 EZ-Drive
这些个磁盘管理程序会以它们自己的例程(routines)替换掉 BIOS 的。通常这是靠着将磁盘管理程序
放在 MBR 及其后几个扇区(OnTrack 称这些代码为 DDO: Dynamic Drive Overlay)来达成的,
所以它会在任何其它操作系统之前被启动。这也就是为什么在安装磁盘管理程序后从软盘启动可能会出问题。
|
|