此重新对应的方式是尝试 4,8,16,32,64,128,255 磁头数(H*C 保持不变)直到 C <= 1024 或是 H = 255.
细节如下 - 小节的抬头是出现在相对应之启动讯息里的字串.在此以及在这份文件任何其它地方中分割的型态都以十六进位数字表示.
5.1 EZD
侦测到 EZ-Drive , 因为第一个主要分割区型态为 55 .如上述重新对应 geometry, 且忽略从第 0 磁区读入的分割表 - 以第 1 磁区的分割表取代.磁碟的区块号码(block numbers) 没有改变, 但对磁区 0 的写入会转向磁区 1.此动作可以藉由修改在 ide.c 中的
#define FAKE_FDISK_FOR_EZDRIVE 0
并重新编译核心来改变.
5.2 DM6:DDO
侦测到 OnTrack DiskManager(在第一个磁碟上), 因为第一个主要分割区型态为 54 .如上述重新对应 geometry 而且整个磁碟平移 63 个磁区. (所以旧的磁区 63 变成磁区 0)然後从新的第 0 磁区读入新的 MBR (与分割表).此平移当然是为 DDO 留空间 - 这也就是为什麽其它磁碟不必平移.
5.3 DM6:AUX
侦测到 OnTrack DiskManager(在其它磁碟上), 因为第一个主要分割区型态为 51 或 53.如上述重新对应 geometry .
5.4 DM6:MBR
侦测到某旧版的 OnTrack DiskManager, 并非藉由分割区型态, 而是签名(signature).(测试在 MBR 里第 2,3 位元组的偏移值是否不大於 430, 而且在此偏移位址找到的 short 等於 0x55AA, 後面并跟著一个奇数的位元组) 再一次如上述重新对应 geometry .
5.5 PTBL
最後, 核心会尝试从主分割区的 start 以及 end 值推断转换方式: 若某些分割区的 start 以及 end 磁簇小於 256, 而且 start 以及 end 磁区号码分别为 1 和 63 , 而且 end 磁头为 31, 63, 或 127, 那麽, 因为依惯例分割区会在磁簇边界结束, 而且更因为 IDE 介面最多使用 16 个磁头, 故推测有开启 BIOS 转换, 分别使用 32, 64 或 128 磁头数重新对应 geometry. (也许这里有点瑕疵, genhd.c 不应该测试磁簇号码前两个位元吗?)无论如何, 当目前的 geometry 已经为每磁轨 63 个磁区且至少这麽多磁头时, 不会做重新对应 (因为这可能意谓著重对应已完成).
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
6. 结论
这到底意谓著什麽? 对 Linux 的使用者而言只有一件事: 就是他们必须得确保 LILO 以及 fdisk 使用正确的 geometry , 其中"正确"的定义对 fdisk 而言是与其它在同一个磁碟上的作业系统所使用的 geometry 相同, 而对 LILO 而言是能够在启动时期成功地与 BIOS 交谈的 geometry.(这两者通常相符.)
fdisk 如何得知该 geometry ? 它询问核心, 使用 HDIO_GETGEO ioctl.但使用者可以交谈式地或在指令列上重定 geometry.
LILO 如何得知该 geometry ? 它询问核心, 使用 HDIO_GETGEO ioctl.但使用者可以用 `disk=" 选项重定.也可以给 LILO 一个 linear 选项, 如此它将在其 map 档中储存 LBA 位址以取代 CHS 位址, 并且在启动时期找出该 geometry 来使用(藉由 INT 13 功能呼叫 8 来询问磁碟的 geometry).
核心如何知道该怎麽回答? 首先, 使用者可能以 `hd=cyls,heads,secs" 指令列选项明确地指定 geometry, 否则核心将询问硬体.
6.1 IDE 细节
让我详细说明.IDE 驱动程式有四个关於 geometry 的资讯来源.第一个(G_user)是使用者在指令列上所指定的.第二个(G_bios)是 BIOS 的固定磁碟参数表(只用於第一及第二个磁碟), 在系统启动时, 切换至 32 位元模式之前读入.第三个(G_phys)及第四个(G_log) 是由 IDE 控制器传回, 作为对 IDENTIFY 指令的回应 - 它们是 "实体的" 以及 "目前逻辑上的" geometries.
推荐阅读
- Linux Quota mini-HOWTO 磁盘空间限制
- ISP-Connectivity-mini-HOWTO
- faxsrv-mini-HOWTO 传真机服务器
- 使用电池供电的 Linux Mini-HOWTO
- Automount mini-Howto 文件系统自动挂载程序
- FreeBSD如何跑diskless
- 制作U盘启动的RAMDISK为根目录的FREEBSD完全版
- FreeBSD如何跑diskless?
- Sun Solaris 不同规格的硬盘用Disksuite做镜像的实现
- DiskSuite做raid 0的一些note
