求网上流行的maxdos(基于grub4dos)启动载入dos的原理作者: yiyaxuan 时间: 2007-4-8 10:30 希望高手能解答下.作者: lianjiang2004 时间: 2007-4-8 11:01 找了一篇,不知是否是你要的,反正本人是看不懂。我也不关心为何,只求知道如何用就行了。
--------------------
GRUB for DOS 磁盘仿真命令
技术细节和实现方法:
GRUB for DOS 0.2.x 将要对各种规格的软盘映像给以支持。由于硬盘的仿真也很类似,所以,也要对硬盘的 img 给以支持。另外,GRUB for DOS 0.2.x 也要开放写入虚拟磁盘的操作(写入虚拟盘是一种危险的操作,因为实际上我们写入了硬盘的 img 文件中,万一 GRUB for DOS 0.2.x 的仿真程序有 BUG,写入硬盘其它扇区中,可能造成数据毁损、无法启动等严重问题!)。
硬盘比软盘复杂了一些。硬盘第一扇区不是 DOS 的引导区,而是主引导记录(MBR),这里没有 BPB 表,而是有一个分区表。所以,对于硬盘的 CHS,作如下的处理:
当没有分区表或者分区表错误时,必须由 map 命令行来指定 CHS,否则拒绝仿真。当分区表存在时,由四个分区表项中的任意一项都可以确定 H 和 S 的值。再用 img 文件长度即可确定 C 的值。【大硬盘的 CHS 值也是可以用这种办法来确定的。】
也可能有人不愿意给出命令行 CHS 参数,他们希望 grub for dos 任意选择一个适当的值。map 命令将提供这样一种选项。首先根据上述 BPB 或分区表来确定CHS,如果失败,再用以下的办法来确定。对于软盘,尽量采用具有 2 个磁头的参数。对于硬盘 img 文件,如果让 GRUB for DOS 来自动挑选,则总是选择 63个扇区、256 个磁头。
NUM_HEADS 的取值范围是 1 至 256;NUM_SECTORS 的取值范围是 1 至 63。但它们也允许是 0,这表示用户允许 grub for dos 任意挑选一个合适的值。如果 map 的命令行没有指定 --heads-per-cylinder 以及 --sectors-per-track,那么,当 grub for dos 不能从 img 文件的第一扇区探测到一个合适的值时,会给出错误信息并拒绝仿真。
这里指出一点限制。GRUB for DOS 扩展了原来 GNU GRUB 的仿真。GNU GRUB 原来的仿真是一种简单的仿真,只能仿真整个磁盘,不能用一部分扇区来仿真。新的仿真可以用磁盘上的部分扇区序列来仿真,但是,这个功能的实现,利用了新型 BIOS 的逻辑块寻址(LBA)功能,也就是磁盘扩展读写功能。这对于老旧的 BIOS 是无效的。所以,老的 BIOS 无法利用新的仿真功能。但 GRUB for DOS 兼容 GNU GRUB 的仿真,所以,老的 BIOS 仍然可以用 GRUB for DOS 的“用整个磁盘来仿真”的功能,这是原来 GNU GRUB 本来就有的功能,其用法在 grub for dos 中完全没有变化。
可以在 grub> 提示符下用 help map 命令察看即时帮助信息。
下面介绍另外几个 map 命令行参数的用法。
map --status 这条命令显示磁盘仿真的状态,很有用。所显示的状态标题栏中,最右边的 Hk 表示 hook 的意思,其值是两位二进制数 xy,因此取值有四种:00,01,10,11。当 x 为 1 时,表示现在 grub 正在使用该虚拟磁盘。当 x 为 0 时,表示现在 grub 没有使用该虚拟磁盘。当 y 为 1 时,表示在运行 map --rehook 命令之后,grub 将使用该虚拟磁盘。当 y 为 0 时,表示在运行 map --rehook 命令之后,grub 将不使用该虚拟磁盘。