无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
12
返回列表 发新帖
楼主: 不点
打印 上一主题 下一主题

如果在 grub4dos 中集成 DOS 运行环境,哪个开源的 DOS 比较好,请推荐

  [复制链接]
31#
 楼主| 发表于 2014-12-29 01:58:17 | 显示全部楼层
刚才测试了27日的版本,这台AMD Athlon II一切正常,未试其他电脑,之前的印象,
许多机子常有51楼的情况,就是无法载入dos img,所有文件是一样的,似乎和bios版本有关


假如无法载入 DOS,那它大致应该死机,而不至于退回到 grub4dos。

要知道,退回到 grub4dos 的功能,只有通过 grub.exe 才能实现。如果纯粹是偶然的随机代码,碰巧能够退回到 grub4dos,那可能性太小。

注意,DOS 不可以有任何访问扩展内存的动作。不可以有 himem 或 emm386 之类的程序。DOS 下的程序不可以写入扩展内存。读取扩展内存是可以的。


回复

使用道具 举报

32#
 楼主| 发表于 2014-12-29 12:18:19 | 显示全部楼层
pcs2006 发表于 2014-12-29 10:27
基本上,能够键入grub.exe,应该是文字模式环境,即使在用中文系统下,
也是文字模式,最大不会超过10k ...

int10/ah=1Ch,在 2014-12-27 的版本中,已经采用了。运行情况与您刚才描述的情况完全一样。

您的解释,让我更清楚了 int10 功能 AH=1Ch 的作用。我本来还纳闷:为何保存和恢复状态的代码不能完全恢复状态呢?现在明白了。谢谢,非常感谢。

点评

原来27日的版本已使用了int 10h ah=1ch功能,那么不妨让grub.com先做一下实验, 把上面SaveVid和RestoreVid的代码加入grub.com中。 试验的结果,新的grub.com配合27日的版本,可以完全回复画面,包括dos时代菜鸟  详情 回复 发表于 2014-12-30 09:55
回复

使用道具 举报

33#
 楼主| 发表于 2014-12-30 22:49:27 | 显示全部楼层
pcs2006 发表于 2014-12-30 09:55
原来27日的版本已使用了int 10h ah=1ch功能,那么不妨让grub.com先做一下实验,
把上面SaveVid和Resto ...

仍旧以前述 dos 时代菜鸟的中文 dos 为测试对象。这一版的 grub.com,不能恢复显示画面。此前的版本还可以成功恢复。也许是这台联想笔记本的 BIOS 比较特殊吧。它的 int10/ax=1C00h 返回的缓冲区大小,换算成字节数,竟然达到 56K,也就是说,已经接近 64K 了。

我猜,说不定有些主板的 int10/1C00h 功能采用 256K 的缓冲区,也未可知。

------------------------

继续说说恢复画面的问题。我们接触得较多的中文 DOS,都是把图形模式包装成文本模式了。

但不要忘了,在原始的图形模式下,dos 也能工作。在图形模式下,即使是英文的 dos 仍然可以运行。

说不定有些国家的 dos 就偏爱图形模式,也未可知。

这时候我们不可能以较小的内存空间来恢复整个屏幕的内容。

因此,我觉得保持清屏状态是没问题的,或者说是合理的。

点评

功能 入口参数和出口参数 INT 10H 的 1C00H 功能 返回状态缓冲区容量 AX = 1C00H AL = 1CH 成功 BX = 需要的 64 字节块数目 实际操作下,cx也应该定义,若cx,7,传回的bx才有参考价值, 在几部机子不同的中  详情 回复 发表于 2014-12-31 14:43
回复

使用道具 举报

34#
 楼主| 发表于 2014-12-31 17:26:41 | 显示全部楼层
pcs2006 发表于 2014-12-31 14:43
功能 入口参数和出口参数
INT 10H 的 1C00H 功能
返回状态缓冲区容量 AX = 1C00H AL = 1CH 成功

1C 功能有很完善的说明,我当然不会搞错。实际计算出的缓冲区大小 56KB,确实令人吃惊。

你给的缓冲区只有 8K,显然太小了,所以也就理所当然地不能恢复画面。

而你之前的版本,不带有 1C 功能,反而可以正确恢复画面。

点评

这似乎和ax,1c00h那缓冲区没有关系,因为那个只是表格而己,不是真正的视讯资料。 bios千差万别,有些机子ok但有些不成,为什么视讯资料回存了,但偏偏没有显示,随便按一下Enter, 屏幕上卷,原来的画面出来了,  详情 回复 发表于 2014-12-31 18:22
回复

使用道具 举报

35#
 楼主| 发表于 2015-1-1 11:37:12 | 显示全部楼层
首先纠正一下我在前面关于机器型号的描述。联想和华硕笔记本,都是返回 BX=000F。能够正常恢复画面。

而返回 BX=0374 的,是 VirtualBox 虚拟机。你自己可以安装 VirtualBox 虚拟机进行试验。

在 VirtualBox 上,最新版的 grub.com 不能恢复画面(显示的画面为 grub4dos 的内容:Graphics mode set to 0x12),但回车后,滚屏一行,则可以显示以前的 DOS 画面。

我发现可能是你程序中的一个小的错误造成的。


int5:    mov   ax,1c00h                ;get vga config buffer size in bx
           xor    bx,bx
           mov  cx,07h
           int    10h
           cmp  al,1ch
           jnz    int3
               mov        cx,6        ; x 64 bytes
           shl         bx,cl   <------- 此处也有隐患,万一当 buffer size 超过 64K 时,将发生溢出。BX 的寻址范围最大只有 64K。改进方法:不要进行乘以 64 的操作,而把 2000h 除以 64,这样再进行比较,就安全了。
           cmp       bx,2000h
           jg            int3 这里似乎应该是 ja (无符号比较大小)才对 。


回复

使用道具 举报

36#
 楼主| 发表于 2015-1-3 11:11:37 | 显示全部楼层
反复考虑,觉得不容易解决与原有的功能相冲突的问题。

有两个方案,大家讨论一下,哪个更好?

方案一,grub.exe 不带参数表示退出 dos 返回到 grub 环境。而原有的 grub 不带参数功能,
需要用参数 --config-file=  (这里配置文件为空) 来实现。

方案二,grub.exe 不带参数表示原有的功能,新增一个参数 --resume 表示
退出 dos 返回到 grub 环境。


第一个方案,给老用户带来一定的不方便,需要老用户修改旧的 bat 批处理,
把不带参数的 grub.exe 添加一个形式参数 --config-file= (这里配置文件为空),
表示采用默认的配置文件。但命令行输入很方便。

第二个方案,保持了与旧版的兼容性,但终端命令行需要敲入 grub --resume 才能执行
退回到 grub 的任务,这给命令行的输入,带来一定的不方便。

我个人倾向于采用第一个方案,虽然给老用户带来了不兼容性,但修改起来也不困难。
我们可以把它写入日志,告诉用户出现错误后应该怎么处理,即,添加
空的 --config-file=  (这里配置文件为空) 形式参数。

每个人都可以跟帖发表自己的意见。如果chenall 发表了意见,那么我将按照 chenall 的
意见进行编程。

点评

新增一个参数 --return 表示 退出 dos 返回到 grub 环境 比较好。 更贴切。 用起来感觉更顺。  详情 回复 发表于 2015-1-11 11:33
回复

使用道具 举报

37#
 楼主| 发表于 2015-1-3 14:11:34 | 显示全部楼层

2015年1月3日更新:这个是按照第一方案编写的版本。运行的逻辑路线:

对于不带 “--config-file=......” 参数的 grub.exe 来说,如果它发现在地址 2M 处有以前的 grub4dos 的备份,则执行退出 DOS 返回到 grub4dos 的功能。如果在地址 2M 处没有发现 grub4dos 的备份,则像从前一样,正常加载 grub.exe 自身所带的 grub4dos 环境。

用 "grub.exe --config-file=" (后面为空) 可以强制按照以前无参数的情形去执行,即,强制正常加载 grub.exe 自身所带的 grub4dos 环境,因此,不去执行退出 DOS 的动作,即,不会返回到以前的 grub4dos 环境中。这种方法用来模拟以前不带 “--config-file=......” 参数的 grub.exe 的情况。

回复

使用道具 举报

38#
 楼主| 发表于 2015-1-3 16:26:07 | 显示全部楼层
本帖最后由 不点 于 2015-1-3 16:43 编辑

世上没有最好,也没有最差,所有的东西,都是权衡。而且,不同的权衡,就有不同的结果。主要看侧重于哪方面。

主要的负责人,他的权衡是要最终采纳的。他可以参考别人提供的意见,然后做出自己的决定。

有些东西,我自己已经有了基本明确的权衡结果。比如,前面 pcs2006 提供的恢复 DOS 显示画面的代码,我就再三考虑,觉得还是不采纳比较妥当,即,保持清屏,这一点是可以写入文档的。我有以下几方面的考虑。第一,如果恢复画面,万一在有些情况下恢复得不好,用户又该抱怨了。第二,多增加一行代码,就多增加了一个兼容性的隐患,给硬件攻击者留下更多一点的攻击机会。比如说调用那些不常用的 BIOS(例如 int 11h),这可以让硬件攻击者抓住机会制造陷阱导致 grub4dos 死机。第三,代码太长,增加了太多的代码空间,挤占了 grub.exe 功能性的代码空间,让 grub4dos 以后增加功能时遇到麻烦。所以,尽可能地减少代码,应该是我们的一个基本原则。第四,恢复画面只恢复了文本模式或类似文本模式的画面,不能够恢复英文版图形模式 dos 的画面。既然有不能恢复的情况,那就干脆不恢复好了。基于以上这几方面的考虑,我就能够决定,不再执行恢复画面的动作了。

而关于 grub.exe 命令参数的改动,我还真有些拿不定主意。刚刚上载的是按照第一方案处理的结果。如果 chenall 觉得第一方案不好,需要用第二方案,那我再按照第二方案进行修改。


再说说以上诸位提到的 “用一个小工具执行退出 DOS 的功能”。我有以下的想法,供 chenall 以及各位参考。

这个工具可以很小,只完成返回 grub4dos 的任务便可。但我觉得,这个小工具可以适当增加一点功能,让它不仅仅是能够切换到 grub4dos,而是,比如说,能够加载 grldr 或 grub.exe 里面的 grub 内核程序体,完成 grub.exe 现有的功能。初步的版本可能仅仅具有切换到 grub 环境的功能,其他功能是随着用户需要,后来增加上去的。

我想,假如这个工具叫做 grub.com,那么,我们今天对于 grub.exe 命令行的设计,就影响到未来的这个 grub.com 的设计。如果按照第一方案,这两者的功能可以完全一致起来,丝毫也不差。运行在 DOS 下的 grub.exe 支持什么参数,那么 grub.com 也支持一样的参数,不多也不少。譬如说,无参数的 grub.exe 表示切换到 grub 环境,同样地,无参数的 grub.com 也表示切换到 grub 环境。

但如果 grub.exe 采用第二方案,那么两者就无法统一了。这是因为,grub.com 在无参数时本来就是执行切换到 grub 环境这一动作的,而无参数的 grub.exe 却不是的,所以无法统一。

因此我觉得,还是第一方案较好一点,其逻辑本身更简练。第一方案的缺点是需要付出一定的不兼容性的代价。第二方案则需要增加一个 --resume 参数,我感觉还是稍微有点别扭,虽然也可接受。一般情况下,我们尽量不制造不兼容性。但在特殊的情况下,也可以有不兼容性的。我们曾经有过不兼容性,比如,map 参数 --e820cycles 就是不兼容参数。再比如,为了让中断向量恢复得全面一点,我们不再支持那些严重破坏中断向量表的驱动程序和 TSR。最老的 grub.exe 版本是支持所有的 DOS 的,也支持所有的驱动程序和 TSR,因为我们从来不恢复中断向量表。后来我们要探测恢复中断向量表了,所以,不再支持那些有毛病的驱动程序和 TSR 了。因此,可以认为我们引入了不兼容。还有,采用 VBE 图形模式以及新的字库和 font 命令,取消 chinese 版本,用国际版替代,这也是制造不兼容。以上举例,是为了说明,兼容性也并非在任何情况下都要保持的。我们尽量保持兼容性,但也不应该束缚手脚,而把兼容性当作清规戒律。

以上我已经全面罗列了我的想法,好了,这就交给 chenall 你们去处理了。当需要按照第二方案或者其他某个第三方案执行时,请在此告知,我会修改程序的。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-22 17:30

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表