无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 469794|回复: 3156

GRUB4DOS更新建议、bug反馈专帖

    [复制链接]
发表于 2010-11-5 19:12:01 | 显示全部楼层
我觉得这些不是很重要的东西尽量不要使用内部的命令去实现。

你可以把你最终想要得到的结果贴出来。
注:是最终的目的,而不是使用这个命令要达到的过程,也许会有更好的解决方案。

看看tuxw或zxw能不能想办法去实现。
回复

使用道具 举报

发表于 2010-11-6 23:09:17 | 显示全部楼层
原帖由 zhaohj 于 2010-11-6 20:14 发表
我也测试是这样,批处理中无法使用wenv check
本来想用wenv for /f "delims= " %i in ("STRING”) do set s=%i 来获取16进制的第一个数值
发觉“ ”空格分隔符不起作用了。
----------
要用到新版的>>,看来 ...


wenv默认就是使用空格作为分隔符的啊。这个怎么和GRLDR扯上关系了。应该是WENV的BUG。
回复

使用道具 举报

发表于 2010-11-6 23:38:28 | 显示全部楼层
原帖由 zhaohj 于 2010-11-6 20:14 发表
我也测试是这样,批处理中无法使用wenv check
本来想用wenv for /f "delims= " %i in ("STRING”) do set s=%i 来获取16进制的第一个数值
发觉“ ”空格分隔符不起作用了。
----------
要用到新版的>>,看来 ...



看了一下这个是WENV的BUG。
看下面的代码,等tuxw的修正版吧。

    for(i=0;i<7 && *arg;i++)
    {
     if (*arg == '\"' || *arg == ' ')
      break;
     delims = *arg++;
    }

简单一点处理只要再加一个判断就好了。
    if (*arg == '\"' || (*arg == ' ' && arg[1] != '\"'))

这样对语法要求比较严格,不能有多余的空格,当然正常情下这样处理就足够了,没有必要去作那么多的判断。
事实上许多GRUB4DOS的命令对语法要求都是比较严格的,可以节约一些代码空间。
回复

使用道具 举报

发表于 2010-11-7 00:21:22 | 显示全部楼层
额,,又没有完全清除前一句的error信息了。
回复

使用道具 举报

发表于 2010-11-7 22:54:23 | 显示全部楼层
cat 比较16个字符,太长了会降低效率。一次读取16个字符进入缓冲后后再进行比较。

另外--locate-align=A是指对齐参数。

即如果你确定你要查找的内容的位置正好是A的倍数则使用这个参数可以加快查找。

比如A=16时。
只会从0X0,0X10,0X20等开始的位置进行查找。
回复

使用道具 举报

发表于 2010-11-15 17:18:09 | 显示全部楼层
原帖由 zhaohj 于 2010-11-15 17:04 发表
configfile会改变debug状态为debug 1,这个看来是grldr的bug


这个可以算是bug,也可以不算.

configfile 是一个不可返回命令,执行的效果其实就是相当于重新加载GRLDR的过程只是省略了前面的过程直接加载新配置文件.

加载新的configfile相当于是进入了新的环境.

[ 本帖最后由 chenall 于 2010-11-15 17:20 编辑 ]
回复

使用道具 举报

发表于 2010-11-15 23:23:05 | 显示全部楼层
这个是正常的啊,找不到就返回错误。以前的版本一直是这样的吧。
回复

使用道具 举报

发表于 2010-11-16 12:45:59 | 显示全部楼层
你看一下map --status的状态里面的软驱数量是多少。。
find是根据这个来查找的。

猜测可能是先map (fd2)再映射(fd1) (fd0),这样会导致软驱的数量没有增加

当root (fd2)时可以找到这是肯定的,因为查找时优先找当前root设备(之前的版本会找不到)

[ 本帖最后由 chenall 于 2010-11-16 12:48 编辑 ]
回复

使用道具 举报

发表于 2010-11-16 16:28:27 | 显示全部楼层
原帖由 zhaohj 于 2010-11-16 15:43 发表
测试发现,如果先map (fd0) (fd1),floppies_curr=2
再map (fd2),也不会增加floppies_curr,始终是2
可能是镜像文件非标准引起的?
再次测试,用标准格式的,也不会增加floppies_curr值,最多是2

下面的 ...


哦,看来你得想其它办法解决问题了。因为标准的电脑中最多只有两个软驱,可能因为这个原因所以这个值不会大于2.

具体看不点怎么解释了。
回复

使用道具 举报

发表于 2010-11-16 16:52:59 | 显示全部楼层
刚上传了一个新的GRUB4DOS测试版本。

尝试支持多个外部命令同时运行。(即外部命令再次调用其它外部命令)

例子
wenv call exec chkpci ${pcicfg}

注:中间的exec是为了兼容之前的设计,代表执行的是一个外部程序。

另外请尽量不要在外部命令中调用那些不可返回的命令像configfile。因为会造成内存占用无法释放。

这个版本主要测试多外部命令执行还有目前简易内存管理机制是否有问题。
回复

使用道具 举报

发表于 2010-11-17 14:41:45 | 显示全部楼层
原帖由 jianliulin 于 2010-11-17 11:09 发表


对啊!!目前的外部命令都是比较常用的命令,稳定后能否考虑内置???


目前的GRUB4DOS程序已经够大的了,不会考虑内置,但是会有其它解决方案。
我还在考虑中,大家有什么好的方案也可以提出来。

理想状态是简单的打包然后附加在GRLDR尾部就可以使用。(GRUB.EXE不考虑)
回复

使用道具 举报

发表于 2010-11-17 16:40:51 | 显示全部楼层
@zhaohj
抱歉,没有看明白你前面所指的问题。
另外这里的问题也是稀里糊涂的。
http://bbs.wuyou.net/forum.php?m ... p;page=8#pid2086963


新的GRUB4DOS版本已经上传,重写优化了command_func(外部命令调用)的代码。

现在写外部命令可以省去以下几行。
        void *p = &main;
        char *arg = p - (*(int *)(p - 8));
        int flags = (*(int *)(p - 12));
直接把主函数声明为
int main(char *arg,int flags)就可以了。
回复

使用道具 举报

发表于 2010-11-17 23:22:32 | 显示全部楼层
新版GRUB4DOS使用了从32MB开始的内存。

如果说有比较大的区别的话可能就在这里了,你可以检查一下是不是有使用了32MB处的内存.
回复

使用道具 举报

发表于 2010-11-18 00:10:09 | 显示全部楼层
记得之前有用过这一块内存,具体的忘了在哪里用到了,应该是外部命令。
回复

使用道具 举报

发表于 2010-11-18 00:31:25 | 显示全部楼层
原帖由 zhaohj 于 2010-11-17 22:42 发表
这个问题比较纠结:在11-6的grub上正常运行的SRSF6.IMG,只更换grldr到11-17版本
出现:
初步怀疑是内存冲突或破坏所致。


这个要跟踪一下具体执行的命令是什么。
回复

使用道具 举报

发表于 2010-11-18 00:32:34 | 显示全部楼层
原帖由 zhaohj 于 2010-11-18 00:17 发表
那现在最小的内存安全区域是那一块?


批处理里面有非法字符?
回复

使用道具 举报

发表于 2010-11-18 00:47:06 | 显示全部楼层
原帖由 zhaohj 于 2010-11-18 00:39 发表
如果批处理中有非法命令,也不会终止的。
ERROR27是系统错误


GRUB4DOS的批处理是碰到错误就退出的,你可以在批处理中进行调试看看是哪一句出现的问题。
比如先注释最后一句再看看是否同样的问题。如果是再注释倒数第二句。

ERROR 27,在check、find中比较容易出现,一般是命令写错。

或者批处理中有非法字符(ASCII 值小于0X20的),还有一个可能是该命令不允许在这个地方执行。
回复

使用道具 举报

发表于 2010-11-18 16:22:32 | 显示全部楼层
我应该大概知道这个产生的原因了.

我先测试下再上传一个新的版本.
回复

使用道具 举报

发表于 2010-11-18 17:03:04 | 显示全部楼层
新的版本已经上传,应该是修正了前面Error 27的bug.

另外新增加了一个内存变量在0000:8278处,以后可以通过这个变量来判断你菜单是否适用于该版本GRUB4DOS.
使用编译时的日期.比如今天上传的版本
read 0x8278 会显示0x132B7FE  (20101118)

以下命令可用于检测是否20101118以后的版本.
checkrange 20101118:-1 read 0x8278
回复

使用道具 举报

发表于 2010-11-23 13:25:27 | 显示全部楼层
应该是你自己菜单的问题.

另外,你可以在GRUB4DOS环境下再次加载这个菜单看看.

至于BUG1.jpg  
这个肯定是你自己的问题.要使用这个命令要求有一个DEFAULT文件
具体使用方法可以看README_GRUB4DOS.TXT文件
搜一下SAVEDEFAULT就可以看到了.

[ 本帖最后由 chenall 于 2010-11-23 13:28 编辑 ]
回复

使用道具 举报

发表于 2010-11-23 15:25:33 | 显示全部楼层
@2010lifefx
试了一下完全可以正常显示,

怀疑你是使用了内置菜单,内置菜单不可以超过4KB,后面的被截断了.所以才会显示不正常.

刚看了一下源码,应该是GRUB.EXE的限制.
从命令行加载的菜单相当于内置菜单,不可以超过4KB.
回复

使用道具 举报

发表于 2010-11-27 17:27:58 | 显示全部楼层
原帖由 zhaohj 于 2010-11-25 22:57 发表
@chenall:
>>写文件完毕后的文件,如(fd1)/txtsetup.oem,启动PE用F6会出现txtsetup.oem最后一行没有闭合的情况。

详见:http://bbs.wuyou.net/forum.php?m ... ;tid=159851&amp;page=97#pid2094915


重新传了一个,麻烦你再试一下。
回复

使用道具 举报

发表于 2010-11-28 18:06:14 | 显示全部楼层
嗯,试了一下我没有考虑周全,呵呵。

GRUB4DOS就不变动了,只要WENV使用旧的方法调用就可以了。

目前有两种调用方式,如果第一个参数为空就用新的调用(直接调用RUN_LINE函数),否则用旧的调用。
第一个参数是exec就调用外部命令。

新的调用方式可以在一些特殊的地方中使用。我在WENV DIR命令就使用了新的调用方法。

[ 本帖最后由 chenall 于 2010-11-28 18:26 编辑 ]
回复

使用道具 举报

发表于 2010-11-29 14:33:56 | 显示全部楼层
原帖由 zhaohj 于 2010-11-29 08:27 发表
11-27版本grldr测试,115#问题依旧存在



那就不是这个原因了。记得之前的0PE也是出现这样的问题。后面用defrag整一下就好了。
回复

使用道具 举报

发表于 2010-11-29 15:27:45 | 显示全部楼层
原帖由 zhaohj 于 2010-11-29 15:02 发表
那为何在文件中最后写入一行就可以了呢?如:
echo -n ############## >> (fd1)/TXTSETUP.OEM


不清楚,就像以前一样,直接写入启动失败,复制一下删除再改名就可以了。

这个问题我目前也没有办法。
回复

使用道具 举报

发表于 2010-12-6 21:29:31 | 显示全部楼层
原帖由 tuxw 于 2010-12-6 20:42 发表
12-06 又出现了引号匹配问题,11-30 正常


这个是11-30的
107150

下面是12-06的
107151
跟以前一样,命令行下正常,批处理不正常


我试了一下好像是正常的啊,之前是SKIP_TO的BUG,已经修正整合到源码中了。

麻烦你重新下载测试一下,注意一下日期是否正确。

否则可能是因为我添加参数支持时引发的BUG。
回复

使用道具 举报

发表于 2010-12-6 23:40:38 | 显示全部楼层
应该是找到原因了。

因为批处理命令行缓冲区不够,导致溢出。

重新编译了一个使用4K的缓存,除非是非常变态的命令否则应该都是够用了。
(嘻嘻为了节约代码所以在参数替换时没有进行长度限制)

先编译一个试一下,明天再重新上传。

[ 本帖最后由 chenall 于 2010-12-7 19:14 编辑 ]
回复

使用道具 举报

发表于 2010-12-7 09:01:57 | 显示全部楼层
原帖由 jianliulin 于 2010-12-7 08:22 发表
能否添加个功能判断bios把U盘认作fd 还是hd


目前使用以下语句应该可以部份确定.
checkrange 0x8280 0 && echo fd
checkrange 0x8280 0x80 && echo hd
回复

使用道具 举报

发表于 2010-12-7 19:11:28 | 显示全部楼层
上传了一个测试版本。外部命令内置化。加快外部命令调用速度,如果需要频繁使用某个命令最好加载一下。只使用一次两次的就没有必要了。因为使用了链表结构所以可加载的外部命令个数没有限制(受限于可分配内存大小)


主要改动
添加了两个伪命令load 和 unload用于加载外部命令到内存和释放。
比如
把wenv命令加载到内存中,加载后不管这个磁盘有没有存在都可以使用该命令。
load (bd)/grub/wenv 或 load wenv 或 load (hd0,0)/grub/wenv

注:以上格式都是可以的。加载时只保留文件名。
使用方法
直接使用就好了,会自动从内存中加载.
wenv

卸载直接 unload 命令(不要使用路径,只要文件名).
unload wenv

另外重复加载无效。

注:加载的命令只能在当前环境中使用。批处理脚本也属于外部命令,所以也可以load

PS: 好像load和unload也不是很贴切,嘻嘻,有没有比较贴切的命令?

先放上来测试一下,改动比较大,涉及到所有外部命令和批处理执行的过程。可能会有BUG。
我小测了一下还没有发现BUG。

[ 本帖最后由 chenall 于 2010-12-7 19:14 编辑 ]
回复

使用道具 举报

发表于 2010-12-8 08:16:17 | 显示全部楼层
原帖由 sratlf 于 2010-12-8 01:20 发表
@chanall

为什么1207版  用--mem加载文件时的进度没有了  什么时候取消了

还有  怎么实现批处理里面的跳转

比如批处理里面两个title  用fallback --go 执行的是菜单的跳转  不是批处理里面的


有进度的啊??好像压缩文件才会没有进度条.新版lzma压缩我有加了进度.gz的没有.

批处理里面不能跳转.但可以跳出批处理,执行一个失败的命令就会跳出了..

要怎么样跳转?像批处理一个GOTO?有点麻烦.我有空再尝试一下.
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 03:40

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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