标题: GRUB for DOS 磁盘仿真命令简介 [打印本页] 作者: 讯极天度 时间: 2012-3-10 20:12 标题: GRUB for DOS 磁盘仿真命令简介 先申明一下:本文内容属于他人创作,特此转帖与坛友分享
GRUB for DOS 0.0.x 系列是没有任何磁盘仿真扩展功能的版本,功能上完全等价于 GNU GRUB。这里说明,GNU GRUB 本身就有磁盘映射功能。磁盘映射是一种特殊的磁盘仿真。磁盘映射只能把一个 BIOS 磁盘号码映射到另外一个 BIOS 磁盘号码,也就是说,它只能整盘整盘地仿真,不能用磁盘中的一个文件来仿真另外一个磁盘。这个版本也是最安全可靠的,可以认为,GNU GRUB 有多安全,GRUB for DOS 0.0.x 就有多安全。
GRUB for DOS 0.1.x 系列具有 0.0.x 的全部功能,除此之外还具有软盘仿真扩展。但是只能用硬盘上的 img 文件来仿真 1.44M 的软盘,并且对软盘映象进行了写保护,也就是说禁止软件通过 int13 接口写入软盘的映象。这个版本也没有已知的安全问题。
GRUB for DOS 0.2.x 系列增加了任意规格的软盘和硬盘的仿真功能,是功能上比较完善的版本。它和 0.1.x 系列的最大不同之处是,它默认时不再保护被仿真的磁盘映像。如果想获得与 0.1.x 等价的功能,必须为 map 命令加上 --read-only 参数。【注:0.1.x 系列也支持 --read-only 参数,但即使没有这个参数,0.1.x 系列也会自动保护磁盘映象不被写入。】
版本 0.2.x 虽然支持写入虚拟磁盘映象,但是,格式化虚拟磁盘映象的 int13/AH=05h 功能并未完整实现。当格式化磁道的时候,GRUB for DOS 0.2.x 并不真的采取任何实质性的格式化动作,也即,它并不改变虚拟磁盘中的任何扇区的内容,而仅仅立即返回“格式化成功”的(类似于 fake write 的虚假)消息给调用者。这没有太大的问题。只有一点需要注意:当您在 DOS/Win98 下要格式化虚拟磁盘的时候,您先不要忙着下达格式化命令,而是要首先运行删除命令,将虚拟磁盘根目录下的所有文件以及所有目录都删去,变成一个空盘,然后再下达格式化命令,这样,格式化后的虚拟磁盘能够正常使用。否则,格式化之前的垃圾目录项仍然在残存着,这将影响虚拟盘的正常使用。
因为 MS-DOS 的逻辑分区之前的 63 个扇区处,都存放了一个“扩展分区的分区表”,所以有可能用它来仿真一个硬盘。“扩展分区表”中的引导记录全都是 00 字节。GRUB for DOS 0.2.x 在读取这个分区表的时候,作了一些修改,使得这个表看起来像是一个合法的硬盘主分区表。GRUB for DOS 并不写入该扇区,因为默认的 safeboot 在起作用。这是安全的。在这种情况下不应当加入 --unsafe-boot 选项,因为 win98 会随意写入虚拟磁盘的引导扇区,这将导致该分区表信息的错位,造成扩展分区不可访问的后果【内容还在,只是扩展分区表错误导致不可访问。手动修改扩展分区表可以解决这个问题,但需要计算准确】。
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 将不使用该虚拟磁盘。