|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『楼 主』:
GRUB 伤脑筋的问题, 大家会诊一下
我知道这里的 DOS/BIOS 高手多, 大家齐心协力, 看看这是怎么回事.
新版的 GRUB 带来了许多新功能, 比如, 可以仿真任意尺寸的软盘或者硬盘映像; 不仅可以从仿真磁盘读出, 还可以写入仿真磁盘; 另外, 还可以启用 "就地仿真" 功能, 这样, 在 GRUB 的命令行状态就可以使用仿真了.
然而, 出现了一个奇怪的事情详述如下:
第一种情况, 我用
map (hd1,0)/dos98.img (fd0)
chainloader (hd0)+1
boot
这是从 C: 盘启动 win98, 这样启动后, 在 win98 里面可以正常访问仿真后的软盘内容.
第二种情况, 用
map (hd1,0)/dos98.img (fd0)
map --hook
(上述这条命令启用就地仿真功能)
chainloader (hd0)+1
boot
结果, 进入 win98 后发现软盘不能访问了, 软盘的第一扇区被改写了, 其它扇区似乎都还在, 没有遭到破坏.
第三种情况, 用
map (hd1,0)/dos98.img (fd0)
map --hook
map --unhook
(上述这条命令解除就地仿真功能)
chainloader (hd0)+1
boot
这样也不行, 软盘映像第一扇区仍然被毁.
第四种情况, 用
map --read-only (hd1,0)/dos98.img (fd0)
(上述这条命令禁止用 int13/AH=03h 或者 int13/AH=43h 写入软盘映像)
map --hook
chainloader (hd0)+1
boot
这样启动 win98, 软盘不再被毁.
根据以上情况, 初步可以断定是某个非常隐蔽的 int13/AH=03h 或者 int13/AH=43h 写入了软盘.
首先, win98 是在 vmware 中, 我没有安装多余的软件, 不可能染病毒; 其次, 即使 win98 染了病毒, 想想它为什么在第一种情况不破坏软盘呢? 所以, 应当不是 win98 等这类操作系统的原因造成的.
那么问题就集中在 GRUB 的代码上了. 然而 GRUB 上很少有写磁盘的操作, 尤其找不到写软盘的操作. GRUB 在极少数情况下才写入磁盘, 例如安装 GRUB 到 MBR 等等. 这类操作, 我们根本都不可能涉及, 怎么突然会出现写入软盘这样的动作呢?
实在是一头雾水!!
|
因为我们亲手创建,这个世界更加美丽。 |
|
2003-11-14 00:00 |
|
|
如是大师
元老会员
步行的人
积分 9654
发帖 3351
注册 2003-3-11 来自 湖北
状态 离线
|
『第
2 楼』:
试试看..再说..
|
弄花香满衣,掬水月在手。
明月鹭鸟飞, 芦花白马走。
我自一过后,野渡现横舟。
青云碧空在,净瓶水不流。
http://dos.e-stone.cn/guestbook/index.asp
======中國DOS聯盟=====
我的新网页http://rsds.7i24.com欢迎光顾 |
|
2003-11-14 00:00 |
|
|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『第
3 楼』:
哇!本来怀疑 GRUB 代码有问题,把 biosdisk 函数开头加上判断,如果是写盘操作就打印出错信息并死循环。这样满以为会死的,结果,没有死,还是一直启动了 win98,在 win98 一看软盘,当然第一扇区仍然破坏掉了。
因此,我猜测是 win98 写入了软盘,换用 DOS,或许就不再写入软盘了。果然,在启动 WIN98 时按 F8 呼出菜单,选择安全模式命令行启动,这下子,软盘没有问题了。
至于说 win98 在什么时候写入软盘,这还有待研究。这究竟算是 win98 的 BUG 呢?还是它的秘密?另外,它会不会破坏掉硬盘?
如果它(哪怕是偶然有一次)破坏硬盘第一扇区,那简直受不了。软盘第一扇区不包含重要数据,然而硬盘第一扇区却有分区表,如果这个弄丢了,整个硬盘不就完了?
另外,奇怪的是,win98 也并非任何时候都破坏软盘。在上述第一种情况下,它总是不破坏。只是用了 --hook 之后,它才破坏。
|
因为我们亲手创建,这个世界更加美丽。 |
|
2003-11-15 00:00 |
|
|
cba-xyz
中级用户
积分 295
发帖 70
注册 2003-7-24
状态 离线
|
『第
4 楼』:
这里懂程序的人不多吧,支持你创作的软件。
|
|
2003-11-15 00:00 |
|
|
Wengier
系统支持
“新DOS时代”站长
积分 27734
发帖 10521
注册 2002-10-9
状态 离线
|
『第
5 楼』:
我用GRUB的map命令“就地仿真”虚拟软盘后,用chainloader/boot命令启动到MS-DOS 7.1(是用的“MS-DOS 7.10完整安装版”安装的DOS)后运行Win98,但出现"Unable to write to Drive C"的蓝屏错误或者直接黑屏死机而无法继续启动到Win98界面下,重启动后发现此IMG镜像已损坏而无法读取;而如果不先用map命令虚拟软盘,则用chainloader/boot命令启动DOS+Win98后不会出现这些现象,而是正常启动。
随后我将Win98的“系统属性”中的“使用32位磁盘存取”功能禁用了,再用GRUB用跟上面同样的命令来调用启动MS-DOS 7.1+Win98启动,结果问题果然解决,不仅启动到了Win98界面下,而且软盘无任何损坏!可见目前GRUB的虚拟软盘的“就地仿真”功能似乎与Win98的32位IFSMGR子系统功能还不兼容,导致如果启用“32位磁盘存取”时Win98无法正常启动/使用。
[此贴子已经被作者于2003-11-15 5:32:49编辑过]
|
Wengier - 新DOS时代
欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/
E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)
|
|
2003-11-15 00:00 |
|
|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『第
6 楼』:
非常感谢 Wengier! 感谢您的重大发现。情况仍然很复杂,请继续关注这一问题,试图给它一个完全的解决。
我来报告一下我测试的新情况。我用就地仿真启动,按 F8 出现菜单,选择 command prompt only,这时,在 DOS 下访问软盘正常。然后,在 DOS 命令行敲入 win 启动 win98,结果,软盘第一扇区变成垃圾了。
这就进一步证实了,GRUB 没有写软盘的操作,是 win98 而不是别的任何程序写入了软盘。
结合刚才 Wengier 所述,是否可以认为,win98 的 “32位磁盘存取” 本身存在着 BUG 呢?前面我已经证实了,通过禁止 int13/ah=3h/ah=43h 就可以确保软盘不被损坏。因此,这个 “32位磁盘存取” 也是通过 int13/ah=3/ah=43 来写入软盘的。我的疑问就是:它干嘛要这么干?这有什么意图?难道说,“32位磁盘存取” 就必须调用这些写盘的功能吗?事实上在不用就地仿真时,“32位磁盘存取” 并未调用写盘功能。所以,我目前觉得,这要么是 “32位磁盘存取” 的 BUG,要么是什么未公开的秘密。
Wengier 兄,你再看看,那个破坏了的硬盘,究竟有多少个扇区遭到了破坏?我猜想可能也正好是 MBR 一个扇区被毁掉。
另外,假如问题的根源就是这么样的,那么请大家建议一下,我们的程序应当怎么对付这一情况?谢谢。
|
因为我们亲手创建,这个世界更加美丽。 |
|
2003-11-15 00:00 |
|
|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『第
7 楼』:
在 google 中查找 “32位磁盘存取” 得到这样的结果:
------------------------------
二,在Windows环境下对CD-ROM进行操作时,显示出“32磁盘访问失败”,然后死机?
很显然,Windows的32位磁盘存取对CD-ROM有一定的影响。CD-ROM大部分接在硬盘的IDE接口上,不支持Windows的32位磁盘存取功能,使Windows产生了内部错误而死机。进入Windows后,在“主群组”中双击“控制面板”,进入 “386增强模式”设置,单击“虚拟内存”按钮后再单击“更改”,把左下角的“32位磁盘访问”核实框关闭,在确认后,再重启动Windows,在 Windows中再访问CD-ROM进就不会出错误。
------------------------------
这说明微软的 “32位磁盘存取” 本身就不成熟,是它的程序的 BUG。我觉得不用再找别的原因了。
|
因为我们亲手创建,这个世界更加美丽。 |
|
2003-11-15 00:00 |
|
|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『第
8 楼』:
又找到一个非常好的网页,说的是 win98 的种种启动故障以及解决办法:
http://tech.sina.com.cn/c/2001-12-13/7856.html
摘录:
启动故障
Windows 98启动时死机的原因比较复杂,因为Windows 98在系统引导时要经过一个彻
底的硬、软件检测过程,其中的任何一个环节都可能引起系统工作不正常。
1、系统第一次启动就死机
如系统第一次启动就死机,应怀疑硬件安装或设置有问题。这时,应在系统引导出现"Start Windows 98"时立即按下F8键,选"Safe mode"(安全模式)启动系统。单击"开始/运行",在打开的框中输入"msconfig",单击"确定"。然后根据下面不同的情况选择不同的选项卡。
①禁止32位磁盘存取
如果硬盘不支持32位存取方式,那么系统会在启动过程中挂起。这时应单击"高级"选中"强制兼容方式磁盘访问"复选框,并按"确定"。系统提示重新启动计算机,单击"是"重新启动系统。如果计算机正常启动,则说明硬盘太陈旧了,不能支持32位存取方式,应将它换掉。
如果系统无法使用"Safe mode"进入安全模式,则可按F8键通过"Command prompt only"项进入DOS状态。当出现DOS提示符后,键入"WIN/D:F"来启动Windows 98。如果成功,同样说明系统拒绝采用32位磁盘存取模式来运行Windows 98。
②保证基于BIOS的磁盘操作
如果采用上述方法不能成功,那么Windows 98可能要求使用基于BIOS的磁盘操作系统。单击"高级",选中"禁止虚拟HD IRQ"复选框,单击"确定",再击"确定",再重新启动系统。
如果系统无法使用"Safe mode"进入安全模式,则可按F8键通过"Command prompt only"项进入DOS状态。当出现DOS提示符时,键入"WIN/D:V"来启动Windows98。如果启动成功,那么可在SYSTEM.INI文件中的[386Enh]项目后面加入下列设置:
VirtualHDirq=0
③禁止Windows 98使用ROM断点
一个ROM断点是PC BIOS中的一个地址,它含有Windows 98从安全模式转换成实模式时所使用的指令。一般情况下,Windows 98在指定地址寻找那些断点指令。但是,如果使用了第三方内存管理程序,需禁止使用ROM断点。单击"高级",选中"禁用系统ROM断点"复选框,单击"确定",再击"确定",重新启动计算机,如启动成功,说明系统不能使用ROM断点。
如果系统无法使用"Safe mode"进入安全模式,则可按F8键通过"Command prompt only"项进入DOS状态。当出现DOS提示符时,键入"WIN/D:S"来启动Windows98。如果启动成功,那么可在SYSTEM.INI文件中的[386Enh]项目后面加入下列设置:
SystemROMBreakPoint=0
2、出现"Starting Windows 98……"信息后死机
这种故障多是由于Windows 98的DOS启动部分受到损坏。如果有安装Windows 98时创建的启动盘,将此盘插入软驱重新启动机器,启动后使用"SYS C:"命令向C盘传送系统即可。如安装时没有建立启动盘,可到其他机器上通过"控制面板/添加删除程序/创建启动盘"来创建启动盘。但要注意,传输的系统版本须与原系统版本一致,否则系统无法启动。
3、启动后立即自动关机
产生该故障的原因是Windows 98启动时,设置驱动程序转载出错,导致系统认为硬件无法正常工作。可以在系统启动出现"Start Windows 98"时按下F8键,利用启动模式中的"Step-by-step confirmation"选项来确认。如果系统运行至"Load all Windows drivers[ENTER=Y,ESC=N]"时,按回车键后出现安全关机信息,则肯定是这个原因。
重新启动系统,进入Windows安全模式(Safe mode)。打开Windows/System.INI,检查其中的boot项,将每一条装载的驱动程序与C:WindowsSystem下对应的drv 文件对比,即检查[boot]项后面扩展名为drv的语句的等号右边的驱动程序名是否与C:WindowsSystem下对应的drv文件的文件名相一致,若不一致则加以更正。若System.INI所指定的驱动程序丢失或受到破坏,则可从其他机器的Windows 98系统中拷贝过来。如无法拷贝,也可临时在该行前加注解符";"跳过该行。
|
因为我们亲手创建,这个世界更加美丽。 |
|
2003-11-15 00:00 |
|
|
Wengier
系统支持
“新DOS时代”站长
积分 27734
发帖 10521
注册 2002-10-9
状态 离线
|
『第
9 楼』:
我有几个问题想说一下,
Win3.11和Win98中的“32位磁盘存取”有些不同。在Win98中,假设在不支持FAT32分区的MS-DOS 7.0下运行未启用“32位磁盘存取”的Win98的话,那Win98也无法看到FAT32分区;但如果在MS-DOS 7.0下运行启用了“32位磁盘存取”的Win98的话,则Win98可以看到FAT32分区。可见Win98在DOS下运行后只是在启动时用32位的IFSMGR对磁盘分区进行了一次重定向。
关于不用"map --hook"IMG不被损坏,而用"map --hook"后IMG则被损坏,可以检查一下这两种方式后系统略有哪些不同,会不会因为这些细微的不同(或者是细微的小BUG,或者像FreeDOS Kernel 2030那样的BUG)而造成IFSMGR重定向磁盘驱动器时失败?
我也是用软盘IMG试的,前512字节确实变成了其它内容。我本来想用硬盘IMG试验的,但实在是做不到,因为GRUB要求IMG镜像文件空间必须连续,软盘IMG还略容易些(我也是复制了几次才成功的),至于硬盘IMG镜像想做到这点则非常非常难。不知GRUB能不能想办法支持不连续的IMG镜像,以使得它更方便实用些?
|
Wengier - 新DOS时代
欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/
E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)
|
|
2003-11-15 00:00 |
|
|
sd8
初级用户
积分 191
发帖 32
注册 2003-11-14
状态 离线
|
『第
10 楼』:
你不会用圆规吗,哈哈,搞笑。
|
我……来…… |
|
2003-11-15 00:00 |
|
|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『第
11 楼』:
又有新发现。换了一个软盘映象,这次即便用第一种方法启动,也毁坏了软盘映象!
这就证明了,并非只有 --hook 才导致软盘被毁。不用 --hook 也能导致软盘被毁。
所以,决非 "就地仿真" 功能本身的错。这个功能很简单,不会有任何问题的。它就是简单的把 int13 挂上,使得 GRUB 本身可以使用仿真罢了。通常如果不用 --hook,则一直到 boot 命令执行之后才挂接 int13 仿真。所以,使用 --hook 和不使用 --hook ,其差别是及其微小的,或者说,对于将要引导的操作系统来说,这个先后顺序本来就没有差别,最终都是挂接了 int13 的仿真程序。
本次的发现之后,我确认问题不是出在 --hook 本身。
|
因为我们亲手创建,这个世界更加美丽。 |
|
2003-11-15 00:00 |
|
|
Wengier
系统支持
“新DOS时代”站长
积分 27734
发帖 10521
注册 2002-10-9
状态 离线
|
『第
12 楼』:
我上面回复了一下,不知您看到了没有。那可能确实Win98自己有问题,我看先不管它了吧,如果DOS能正常使用它就行。。
|
Wengier - 新DOS时代
欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/
E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)
|
|
2003-11-15 00:00 |
|
|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『第
13 楼』:
Wengier 兄,你不是坏掉过硬盘吗?你就再检查一下,那个坏掉的硬盘究竟有多少个扇区坏掉了。
======
哦,对不起,刚刚看明白,你的硬盘没有损坏,损坏的是软盘。
=========
> 不知GRUB能不能想办法支持不连续的IMG镜像,以使得它更方便实用些?
不行啊。为了编程的简单,不想考虑那么复杂了。典型的情况,一个 1.44M 的文件,可以占据 1000 个甚至更多个不连续的区域。如果这样,仿真起来不知道要增加多少困难呢,程序也容易出现隐含错误,造成潜在的危险。退一步说,即使这样能仿真,其运行效率将会大大受到影响。光是保存这 1000 个指针,就需要 4000 个字节的空间。4K 的空间啊,这还不包括 int13 的代码。所以,这对于存贮空间也是不利的。更不用说 2.88M 或者硬盘映象的仿真了。
其实,产生连续硬盘映象也是容易的。格式化一个硬盘,然后拷贝文件到这个硬盘,则这个硬盘上就没有碎片了。
=======
不过可以用 (hd0,0)+666666 来直接使用整个分区,此处 666666 应当是分区的全部扇区总数。这样的表示法,肯定是连续的了。
我正在编写代码,从而把 (hd0,0)+1 解释成整个分区,这样就不必让人工计算分区的扇区数目了。
好了,硬盘映象的问题我自己先弄,大家可以暂且不管了。
|
因为我们亲手创建,这个世界更加美丽。 |
|
2003-11-15 00:00 |
|
|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『第
14 楼』:
Quote: | 以下是引用Wengier在2003-11-15 12:32:28的发言:
那可能确实Win98自己有问题,我看先不管它了吧,如果DOS能正常使用它就行。。 |
|
我已经看到了解决问题的曙光了。特别佩服、感谢 Wengier 兄指出了 32位磁盘存取这个焦点、根源。我刚才在 google 上搜索 32-bit disk access ,终于知道什么叫做 “32位磁盘存取” 了。它应当叫做 “保护模式磁盘存取”,以避免产生歧义。
在保护模式执行 16 位实模式的 int13 程序,要求这些程序的代码不使用 32 位寄存器。我的程序中使用了大量的 32 位寄存器,所以导致 “保护模式磁盘存取” 产生了误操作。
好了,接下来大概不难解决了。现在先歇一歇。
|
因为我们亲手创建,这个世界更加美丽。 |
|
2003-11-15 00:00 |
|
|
Wengier
系统支持
“新DOS时代”站长
积分 27734
发帖 10521
注册 2002-10-9
状态 离线
|
『第
15 楼』:
Quote: | 以下是引用不点在2003-11-15 12:56:26的发言:
其实,产生连续硬盘映象也是容易的。格式化一个硬盘,然后拷贝文件到这个硬盘,则这个硬盘上就没有碎片了。 |
|
不点,不知有没有能在DOS下实现直接将文件连续复制的软件?毕竟如果就为了产生连续的IMG镜像供GRUB for DOS使用就让大家来格式化硬盘未免显得有些不切实际,况且GRUB的最终目标毕竟是要真正用在真实电脑而不是在虚拟机中玩的。
|
Wengier - 新DOS时代
欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/
E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)
|
|
2003-11-16 00:00 |
|