Board logo

标题: 在grub of dos中虚拟二个软驱的问题。 [打印本页]

作者: Qlin     时间: 2005-3-21 00:00    标题: 在grub of dos中虚拟二个软驱的问题。

因为一些原因要在grub of dos中虚拟二个软驱 ,过程如下。



map (hd0,0)/boot.flp (fd0)

map (hd0,0)/kern.flp (fd1)

chainloader (hd0,0)/boot.flp

chainloader (hd0,0)/kern.flp

rootnoverify (fd0)

boot



之后好像不行。还是不能读取 kern.flp ,请问要如何解决。。?



PS 。请问windows下有什么软件可以修改软驱镜像文件(*.flp)  ?? 谢谢






作者: 不点     时间: 2005-3-21 00:00
chainloader 命令是决定用哪个引导扇区来引导操作系统,因此,chainloader 命令只能用一次才有效。如果该命令使用多次,则只有最后一次的才起作用,在此之前的那些 chainloader 命令都等于是废的。

对于磁盘仿真而言,这两条命令是正确的:

map (hd0,0)/boot.flp (fd0)
map (hd0,0)/kern.flp (fd1)

如果用 0.4.0 的版本,则可以加上 --mem 参数,来使用内存盘的仿真功能。

注意上述命令仅仅指定仿真的磁盘是 fd0 和 fd1,并未指定由哪个扇区来引导你的操作系统。根据你的文件名来猜测,你可能是要从 boot.flp 来引导,因此,你应该这样:

chainloader (hd0,0)/boot.flp
rootnoverify (fd0)
boot

这就应该好了。



作者: 不点     时间: 2005-3-21 00:00
不过还是要补充一点,在 版本 0.4.0 中,我们已经增加了两个非常重要的 map 命令参数:

map --floppies=M
map --harddrives=N

这两条命令指定 BIOS 所识别的软盘驱动器数目和硬盘驱动器的数目。对于你的情况,应当这样:

map (hd0,0)/boot.flp (fd0)
map (hd0,0)/kern.flp (fd1)
map --floppies=2
chainloader (hd0,0)/boot.flp
rootnoverify (fd0)
boot

其中 map --floppies=2 只要在 boot 之前即可,除此之外,没有其它要求,它可以放在最前面,也可以放在最后,这都没有错的。



作者: Qlin     时间: 2005-3-21 00:00
哈哈。。谢谢不点兄
作者: Qlin     时间: 2005-3-21 00:00
请问关于
map --floppies=M
map --harddrives=N

这两条命令指定 BIOS 所识别的软盘驱动器数目和硬盘驱动器的数目。
有没有数目的限制。。? 比如说不能多于二个之类的。。? 谢谢。

作者: Qlin     时间: 2005-3-21 00:00
不点兄。。跟据你的提示。我进行了如下操作。
map (hd0,0)/boot.flp (fd0)

map (hd0,0)/kern.flp (fd1)

chainloader (hd0,0)/boot.flp

rootnoverify (fd0)

boot
但好像还是不行。。不知是什么原因。。?? 谢谢。

作者: 不点     时间: 2005-3-21 00:00
指定的软盘数目不可以超过2, 指定的硬盘数目不可以超过(我有点忘记了,大概是) 100 吧。

> 但好像还是不行。。不知是什么原因。。?? 谢谢。

“不行” 在哪个方面呢?是不能启动?还是什么别的毛病,你没有描述详细。

只要 boot 之后能够把控制权顺利交给 boot.flp 的引导代码,这就算是 GRUB for DOS的成功。至于说以后你引导的操作系统是 linux 或者 BSD 等,由于这些操作系统从 CPU实模式切换到保护模式,在此之后,这些操作系统就不再使用仿真了,因为它们不再使用 int13。

也就是说,一旦这类操作系统被引导成功,你就不再能访问我们的虚拟软盘了。只是在操作系统的引导过程中,也就是在操作系统获得控制之前的这段时间,我们的仿真还是起作用的。





作者: Qlin     时间: 2005-3-21 00:00
谢谢 不点 兄。
原来是这个样子啊。
我的理想情况是。 先从A 盘引导,然后再读取B盘的kern .
看来是不行了呢。。



作者: 不点     时间: 2005-3-22 00:00
老兄用的可能是 BSD 吧。不管 LINUX 还是 BSD,目前都不支持实模式的 BIOS中断调用。但是,另一方面,保护模式确实是完全有可能支持实模式的中断调用的,这可以叫做“实模式兼容层”,win98 就有这种兼容层,因此win98 就可以顺利地访问到我们通过 int13 映射而得到的内存盘。注意 win98也是保护模式的操作系统。winNT/2K/XP/2003 同样都是保护模式的操作系统,所不同的是,它们去掉了实模式兼容层,也就是某个 DLL实模式兼容性驱动程序文件。假定有某个公司为 winNT/2K/XP/2003 写一个这样的驱动程序,那么 winNT/2K/XP/2003也能支持实模式的所有概念,包括从 winNT/2K/XP/2003 内部不用重启动 Windows 即可像 win98 那样进入 realmode DOS。只是由于微软故意不做,其它公司也不愿意费这个牛劲替它做罢了。

LINUX 和 BSD 的道理完全一样,在这些操作系统中本来不存在实模式兼容驱动,但是,完全可以为它们增加一个,当然了,这都是系统底层操作,会麻烦一些,然而这不存在实质的困难。

===============

在目前的情况下,也许你稍作变通就可以躲过以上限制。比如说,你的全部文件都放在 A:盘上,A:盘本身做得很大,比如 2.88M,或者,如果不够用的话,干脆做 50M 或 1000M。经过 GRUB4DOS 仿真之后,A:盘的引导程序获得控制,这段引导程序把A:盘上的内核和initrd 都装入内存,这样,当内核获得控制时,根本不需要再读软盘了,因为软盘的全部数据(除了内核之外)都在 initrd中,这已经都在内存中了。BSD我没用过,但是我很清楚这个办法对 LINUX 是成功的。



作者: Qlin     时间: 2005-3-22 00:00
根据如上,我进行了下面的尝试。。
系统情况是。硬盘分有二个主分区,在grub中显示 第一个为 hd0, 0    第二个为 hd0,2
我把freebsd 的iso 文件解压到 第二个主分区(hd0,2)
我的相法是把第二个主分区虚拟成A盘,然后再从At盘启动,

然后进行了如下操作:
map (hd0,2)+1 (fd0)
chainloader (fd0)+1
rootnoverify (fd0)
boot

但是运行 chainloader (fd0)+1 后电脑会长鸣, 然后死机 。
请问我这样的做法是否有错。? 为什么不能成功。。? 谢谢。。

作者: 不点     时间: 2005-3-22 00:00
你的分区的文件系统,如果不是 FAT/NTFS 这类微软格式的,是不能用你所用的分区仿真功能的。

你可以改为文件仿真功能:

map (hd0,2)+xxxxxxxx (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
boot

当 xxxxxxxx 为 1 时,是调用分区仿真功能,而当 xxxxxxxx 等于分区中的扇区总数时,则调用的是文件仿真功能。

另外你少掉了一条很重要的 map ---hook 命令。




作者: Qlin     时间: 2005-3-23 00:00
谢谢 不点 兄....问题解决了。。哈哈。。