cdrom 本来应该像磁盘那样,出来一个 BIOS int13 标准,这样,实模式的程序就无需访问 cdrom 硬件,而是通过 int13 这个软件中断来访问 cdrom 的扇区。可惜,由于微软参与了可引导的 cdrom 软件规范的制定,就使得这样一个标准成了一个事实上的伤残标准,整个世界都被微软玩弄了。如果有了 int13 接口标准,那么微软的 DOS 里面的那一大堆 cdrom 驱动就可以不要了,或者可以用一个统一的、很小的驱动来代替。微软参与制定的这个光盘启动标准,它的毛病非常多,比如,这个标准非常复杂,一直到现在,还没有见到哪台机器完整实现了这个标准。因为这个标准有很多功能要求是不必要的,所以,这些功能并未得到厂商的广泛支持。就是说,这个标准有很大的不合理性,说严重点,其中有一些东西可以说是垃圾。而真正关键的,用 int13 这个接口来访问光盘扇区,却未能写入标准之中。可以想象,如果标准中有这个的话,厂商们早都采用并成为事实工业标准了。大家还注意到,用 no-emu 模式启动的光盘,是有 int13 接口的。这就是为什么今天的 no-emu 格式大行其道的原因。以 no-emu 模式启动时有 int13 接口,而以 软盘仿真模式启动时,却没有 cdrom 的 int13 接口,大家至少应该对此有所怀疑吧?为什么这样?有什么理由是这样的?为什么会出现这样奇怪的现象?最后总能想到:原来微软的 DOS 更重要啊,如果离开了它的 DOS 人们也能访问光盘扇区,那么微软的重要性就可能大大降低了,微软当然不会这么做。所以,由微软制定的标准,一定得是一个畸形的标准才符合微软的利益,同时也最大限度地打击大众的利益(最近微软又祭出一个 ooxml,不过这次它要失望了,人们已经不再信任微软了)。
既然历史就是这样的,那我们也只好接受这个现实了。不管是什么光驱,只要有了 int13 标准,我们都是可以访问光盘的。而 no-emu 模式的光盘,就恰好有 int13 标准。grub4dos 对那些具有 int13 标准的光盘是支持的。建议所有的厂家都要给实模式的操作系统和应用程序提供 int13 的光盘接口。重要的是,即便机器并非从光驱启动,BIOS 生产者也应该提供光盘的 int13 接口(就是 no-emu 模式的)。也就是说,无论在任何情况下,都要提供光盘的 int13 接口,这个接口应该是“常驻”接口,它永远存在、无条件存在。qemu 这个虚拟机就是这么做的,大家可以试验一下 qemu 下的 grub4dos:无论qemu 的启动设备是否是它的光驱,在进入 grub4dos 后都能访问它的光盘设备。如此一来,我们就永远也不需要光驱的驱动了。
我注意到有些机器已经是差不多这么做的了。我见到的一台 dell 机器,就做的不错,虽然它还不彻底。这台 dell 机器从 win98 的光盘启动后,如果你没有按键,则自动从硬盘启动。此时进入 grub 就可以发现光盘的 BIOS 接口。注意,win98 的安装盘并非是 no-emu 模式的,而是软盘仿真模式的。然而遗憾的是,当从 win98 的光盘启动进入DOS 时,却没有光盘的 int13 接口了。所以,dell 做的并不彻底。
在另外一个厂家的机器上,出现了更为奇妙的一幕。用 win98 的安装盘启动,进入 DOS 后再用 grub.exe 进入 grub4dos 的环境。此时,它的 00 号磁盘(也就是软盘),具有双重身份!如果用 CHS 模式去读它(DL=0),它的内容是1.44M软盘的内容。如果用 LBA 的模式去读它(DL=0),则它的内容是整个光盘!而且是实实在在的、具有2048字节大扇区的光盘!最新版的 grub4dos 已经对此有了完美的支持了。如果你在 grub 下用
geometry (fd0)
显示出的不是 CHS 和 LBA 而是 BIF,那么这个 (fd0) 就是双重身份:一个身份是 CHS,一个身份是 LBA,两者是不一样的。这里的 BIF 是 bifid 或者 bifurcate 的意思,汉语意思就是“分叉”。
对于 BIF 的盘,你可以用两种方式去访问它。一种是 CHS,一种是 LBA。当你用 CHS 模式访问它时,你只需要像平常那样去访问这个盘便可。当你希望用 LBA 模式访问它时,你只需要用一个特殊的盘号便可。
就拿上面的例子来说,你可以尝试
geometry (fd0)
和
geometry (0x100)
注意,fd0 就等于 0,而 0x100 就是 256,而 0x100 的低字节仍然是 00,就是说它还是软盘的号码。而高字节等于 1,则说明用户希望这个盘是用 LBA 去访问的。这样一来,在上面的例子中,这个 (0x100) 盘的内容就是光盘了。它的几何参数中也能显示出其扇区大小是 2048 字节。