|
一般来说,grub4dos 访问设备,都是通过 BIOS 提供的 INT13 软中断调用。但也有少数几个例外。比如说,PXE 规范里面,不存在 INT13 调用,那么访问 PXE 网络服务器上的文件,就无法利用 INT13,只能利用 BIOS 提供的其他接口(属于 PXE 规范)来实现。
当 BIOS 不提供 CDROM 的 int13 接口的时候,grub4dos (在内核中)访问 CDROM 就必须用 grub4dos 自己的驱动程序来访问。这个 CDROM 硬件驱动程序,类似于 PXE 设备驱动程序,都是设法访问设备上存储的内容。
PXE 和 CDROM 又有一些本质的差别。在 PXE 规范中没有确定扇区访问的方法,直接给出的是 PXE 服务器上文件的访问方法。因此,PXE 不符合传统的磁盘设备的理念。在 CDROM 规范中,CDROM 有 “扇区” 这样的概念。对于 No-emulation 模式的 CDROM 盘片来说,当机器用它启动以后,BIOS 还提供了 INT13 接口,用来访问这个 CDROM 的扇区。
由于 CDROM 有 int13 规范(就是说,世界上存在这样的规范),因此,当 grub4dos 能够用硬件驱动程序访问 CDROM 扇区的时候,也顺便把这个访问方法用 int13 包装起来,供其他操作系统(或应用程序)使用。例如 DOS下的 eltorito.sys 就是利用 int13 来访问 CDROM的。其他(任何一个)操作系统的 CDROM 安装程序也都要使用 int13,例如 Windows、Linux 的安装光盘,或者某个杀毒软件的安装光盘。
cdrom --init 探测是否存在 CDROM 硬件,识别出 CDROM 的个数,把这些基本的数据保存起来备用。map --hook 把驱动程序的代码挂上,使 grub4dos 以及其他操作系统都可以用 int13 来访问 CDROM。此时,int13 代码扮演的是 CDROM 驱动程序的角色,而不是纯粹的“仿真”。“仿真”这个概念,是说原来 BIOS 没有某个设备,需要 “假造” 一个出来。而此处的 CDROM 则不同,因为 CDROM 是系统中存在了的设备,只是 BIOS “眼瞎”,看不见它。我们这里的 CDROM 驱动程序是给 BIOS 戴上一副眼镜,是帮助了 BIOS,让 BIOS 能够看见 CDROM。也可以认为是 BIOS 的 “补丁”。如果 BIOS 不 “眼瞎” 的话,根本就不需要这个 “补丁”。当你的机器是用 no-emulation 模式的光盘启动的时候,BIOS 被迫提供 int13 接口,因为这是规范要求的。当机器不是从 no-emulation 模式光盘启动的时候,BIOS 可以不提供 int13 接口(绝大多数的 BIOS 都不提供),因为规范没要求它必须这么做。这规范本身就是有问题的(我认为是恶意的),它故意这么设计。参与设计的人,一定有 “利益” 在里面。
我认为 BIOS 是故意这么 “眼瞎” 的。这是有历史原因的。一般来说,“利益” 是靠 “制造障碍” 而体现的。不制造障碍,就没有利益,也就没有商业的动力了。制造障碍的目的是使自己的利益最大化。这就如同你家的门为什么要上锁?那就是为了保护你的利益,那制造的障碍就是让别人进不去。Windows 不开放源代码,以及商业软件需要加密狗的道理也都是一样的。不再展开论述了,已经离题很远了。不明白的人,自己动脑筋使劲想吧,相信你能找到答案的。
(cd0) 的号码是多少?
它不是固定的,它是可变的。在不同的情况下,它的值会不同。由于这个号码是 grub4dos 设定的,grub4dos 就需要为这个 CDROM 选择一个 “合适” 的值。这个值不能够与 BIOS 中可能已经存在的 CDROM 号码相冲突。对于不同的机器,当 BIOS 从 no-emulation 模式的光盘启动时,它给这个光盘赋予的号码 (cd) 也是不同的。因此,(cd0),(cd1),...,(cd7) 就需要躲避 (cd) 的值,保证与 (cd) 不冲突(不重叠)。目前这些 (cd0)...(cd7) 的选取大致都在 (0xC0)...(0xC7) 以及 (0xE0)...(0xE7) 这两个范围中,但不敢保证今后永远如此。 |
|