中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS启动盘 & LOGO技术 (启动盘室) » 一个硬件难题,希望大家一起诊断解决。
作者:
标题: 一个硬件难题,希望大家一起诊断解决。 上一主题 | 下一主题
tinybit
初级用户





积分 137
发帖 57
注册 2005-9-29
状态 离线
『楼 主』:  一个硬件难题,希望大家一起诊断解决。

http://grub4dos.jot.com/ 上有最新编译的 GRUB.EXE 文件。这个文件支持在 win98 下运行,原则上讲,也应该能够在 winMe 下运行,但是我这里没有 WinMe 的机器,所以无法测试。在 NT/2K/XP 下肯定不行,不要指望了。

是的,我们确实没必要支持在 WIN98 下运行,因为 WIN98 可以切换到 real mode 的 DOS 来运行 GRUB.EXE。

但是,既然有这种可能性,那为什么不去尝试呢?如果我们能够在 98 下顺利运行,这对于我们进一步理解硬件、掌握深层硬件知识,无疑会有很大的帮助。

目前这个版本,在一台老机器(win98)上测试,非常成功,但是,在其它机器上测试,统统归于失败,启动 GRUB.EXE 的过程会造成死机。注意,你测试的时候也会死机(!!!!),记住保存好你的工作,比如退出你正在编辑的 WORD 文档,然后再测试。

那台成功的机器,主板比较旧,是华硕的 PII 主板。机器中没有网卡,而在 98 下电源管理驱动也没有安装成功(这可能也是运行 GRUB.EXE 成功的一个原因),也没有内置和外置的 MODEM,声卡也没有驱动成功。我怀疑,所有这些不成功的硬件,正是启动 GRUB.EXE 成功的原因。

在其它机器上,网卡、声卡、电源管理都已经正常驱动,所以,用 GRUB.EXE 强行进入实模式之后,这些硬件不断发来的中断信号,导致 GRUB 死机。我已经对 PIC 进行了编程,包括对 PIC 的优先级进行了实模式兼容性调整,将中断号重新设定为实模式的 int08 到 int0F,int70 到 int77,但是我没有屏蔽任何中断,因为资料上说,BIOS 在 POST 之后会开放所有的中断,不会屏蔽任何一个。

需要硬件知识,谁知道的,帮忙吧。目前我猜测是因为那些硬件中断没有合适的实模式驱动程序而产生死机。谁知道怎么初始化那些硬件,让它们与实模式兼容?

2006-4-23 21:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Wengier
系统支持

“新DOS时代”站长


积分 27734
发帖 10521
注册 2002-10-9
状态 离线
『第 2 楼』:  

如果GRUB for DOS在Win98下是通过强行从保护模式进入实模式的方式来启动自身的话,恐怕会对系统本身造成一些问题,尤其是如果硬件正在工作中时更可能对硬件造成一些损害。我建议先关闭所有正在运行的进程和硬件才好,而且最好还是尽量通过WIN下所支持的方式(包括WIN API)来进行,以最大程度提高安全性、稳定性以及在不同电脑上的兼容性。



Wengier - 新DOS时代

欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/

E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)

2006-4-25 08:47
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (29206679)  编辑帖子  回复  引用回复
tinybit
初级用户





积分 137
发帖 57
注册 2005-9-29
状态 离线
『第 3 楼』:  

> 对硬件造成一些损害

像掉电一样,对硬件不会有更多的损害。由于我们只是简单地从 DOS 窗口下运行,所以,还无法编写像 Win32 那样复杂的程序,通知应用程序退出,等等;如果那样的话,不知道二进制执行程序的长度又要增大几十或者几百个 KB。况且微软也根本没有公开的 API 可以用来切换到实模式。因此,像我们这样简单的程序设计方法,根本不可能做到绝对的“安全性、稳定性”。

2006-4-25 14:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tinybit
初级用户





积分 137
发帖 57
注册 2005-9-29
状态 离线
『第 4 楼』:  

不知不觉地GRUB4DOS已经走到对硬件支持的改进这条路上来了。除了A20这个古老的话题以外,还有在98下直接运行GRUB.EXE的问题。和后者比起来,A20似乎还不是我们的难题。通过禁止鼠标,初始化可编程中断控制器,初始化系统时钟,已经可以让不少机器可以在98下运行GRUB.EXE了。但是,还是有一些机器出现死机。出现死机的机器,使用了USB键盘。所以我怀疑USB设备的初始化是个问题。查了资料,但不知道怎么初始化USB设备,也不知道怎么初始化 PCI 设备(用公开的 int1A 标准,但这个标准没有说如何初始化设备)。

于是,想到了ROM,看看ROM是如何初始化这些设备的。这台机器的ROM编的可谓酷啊,我用GRDB单步跟踪,结果它总是有一条指令将SS段寄存器设置为F000。起初我以为是ROM的BUG,但这条指令多次出现,而且它只设置SS,而不设置SP,这迫使我想到,这是故意安排的,它是反跟踪的最好手段。

试想,如果调试程序将断点下在 ROM 程序中,遇到断点,总要执行 int01 或者 int03 指令,而这些指令都要使用堆栈。如果堆栈放在 ROM 中,那么使用堆栈的指令必然失败,因为 ROM 是只读的,写进去的 CS 和 IP 都被丢弃了。

好了,小心一点,每次碰到这条设置 SS 的指令,就让它跳过,不要执行它。然而,这个 ROM 程序还有别的反跟踪手段:我不知道执行到什么地方,在一条 out 指令后,屏幕上干净了,像清屏了一样。键盘还没死锁,因为我按 NumLock 键,键盘指示灯有反应。摸黑按调试命令 g,可以顺利启动下去,进入操作系统中。

干脆在 ROM 中查找 CD 1A 这个字符串(就是 int1A 的机器汇编码)。结果找到了一段程序,我猜想这应该就是 PCI 设备的初始化程序了。可是用这段程序以后,GRUB.EXE 死得更彻底了,郁闷。

唉,正如 Stallman 所倡导的那样,BIOS 是最后一个需要开放源码去征服的领地……

2006-5-8 12:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xuantian
高级用户





积分 587
发帖 282
注册 2006-4-10
状态 离线
『第 5 楼』:  

不用grub

2006-5-8 14:24
查看资料  发送邮件  发短消息 网志  OICQ (315594066)  编辑帖子  回复  引用回复
wang6610
银牌会员




积分 1246
发帖 488
注册 2003-11-11
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by xuantian at 2006-5-8 02:24 PM:
不用grub

不用,不用留言,楼主在干正事呀。。。。可以说给在大家造福!!!

2006-5-8 16:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: