无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: chenall

grub4dos 外部命令 wenv [2010-10-17 ]

  [复制链接]
 楼主| 发表于 2010-6-29 23:41:50 | 显示全部楼层
gfxmenu、UNIFONT还有FONTFILE都是使用了4-6M之间的内存。
回复

使用道具 举报

发表于 2010-6-30 08:06:27 | 显示全部楼层
4-6M之间的内存分配看来以后也得指定个标准,比如从0x400000~0x41000分配给谁,至少明显地方有提示。
回复

使用道具 举报

发表于 2010-9-5 23:49:49 | 显示全部楼层

可能是BUG

我想在获取输入时设定 ESC 和 ENTER 两个键的默认值,测试如(附件1)

希望输入时:
按 ESC,GET_STR=abcd
按回车,GET_STR=1234
其它,GET_STR=输入内容

结果:
1、附件1中的命令在命令行手工输入时均正常
2、在菜单中执行时:
按ESC、输入字符时正常
按回车不正常,WENV set GET_STR=${OK_STR} 运行结果不对(附件2)
测试用的WENV是8月27日版


[ 本帖最后由 tuxw 于 2010-9-27 12:36 编辑 ]
1.png
4.png
回复

使用道具 举报

 楼主| 发表于 2010-9-6 17:11:45 | 显示全部楼层
谢谢反馈。
可能是一个隐藏的BUG。
得空我再测试一下。。
回复

使用道具 举报

 楼主| 发表于 2010-9-6 19:07:01 | 显示全部楼层
已经找到原因了,是程序的问题,一个逻辑错误。

明天再上传新版本。
回复

使用道具 举报

 楼主| 发表于 2010-9-6 20:13:47 | 显示全部楼层
WENV已经更新,请下载新版测试。
回复

使用道具 举报

发表于 2010-9-8 10:22:34 | 显示全部楼层

返回值BUG

前面那个问题已解决,现在又发现一个新的问题


title test
fallback x
map --mem .../A.IMG  (fd0)                 --------------(A.IMG是个正确的路径)
map --mem .../notfound.img (fd0)        ------------- (这是个不存在的文件)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
这个菜单执行时会按预期跳转到 x

===============================================
现在将菜单变成

title test
fallback x
map --mem .../A.IMG  (fd0)                 --------------(A.IMG是个正确的路径)
WENV set GET_IMG=.../notfound.img  ------------- (这是个不存在的文件)
WENV run map --mem ${GET_IMG} (fd0)
map --mem  (fd0)map --hook
chainloader (fd0)+1
rootnoverify (fd0)
这个菜单会启动 A.IMG,而不是跳转到 x

================================================
如果这样
WENV run map --mem ${GET_IMG} (fd0) || fallback --go x
又能跳转,也就是能识别出命令错误执行
回复

使用道具 举报

 楼主| 发表于 2010-9-8 11:07:12 | 显示全部楼层
OK,加了一个语句进行控制.

http://code.google.com/p/grubuti ... ip&can=2&q=
回复

使用道具 举报

发表于 2010-9-8 11:48:28 | 显示全部楼层
OK了,响应好快!!!
回复

使用道具 举报

发表于 2010-9-20 15:43:27 | 显示全部楼层
发现一个情况,不知什么原因?

grldr内置菜单
map --mem /BOOT/XDOS.IMA (fd0)       //IMA大小10M
map --hook
command --set-path=(fd0)/grub/bin       //这个路径是正确的
configfile /BOOT/A.LST



菜单A.LST
default 0

title Load B.LST
WENV set BACK_CMD=configfile /BOOT/A.LST
configfile /BOOT/B.LST

title View Environment Variable
wenv get
pause any key ...



菜单B.LST
default 0

title return
WENV run ${BACK_CMD}

title View Environment Variable
wenv get
pause any key ...
============================

现象:
1.从菜单A进入B
2.在B中查看环境变量正常
3.从B返回A,所有外部命令出错
Error 28: Select item cannot fit to into memory

4.用 command 重新指定外部命令路径,仍然不能使用外部命令
===========================
重启,按1,2进入B菜单,查看环境变量正常
进入命令行,手动输入
configfile /BOOT/A.LST
返回A.LST,查看环境变量正常
===========================
重启,进入B菜单,进命令行,手动输入
WENV run ${BACK_CMD}
返回A菜单,外部命令不能运行
===========================
Grub4Dos版本:08-12中文版

[ 本帖最后由 tuxw 于 2010-9-20 15:50 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2010-9-20 16:53:08 | 显示全部楼层
内存不够.能不能制作一个可以重现这个情况的IMG镜像上传上来,我测试一下.
或者贴上截图(全屏幕)还有map --status信息。
回复

使用道具 举报

发表于 2010-9-20 17:14:02 | 显示全部楼层
原帖由 chenall 于 2010-9-20 16:53 发表
内存不够.能不能制作一个可以重现这个情况的IMG镜像上传上来,我测试一下.
或者贴上截图(全屏幕)还有map --status信息。


做了个ISO,可以直接在虚拟机里测试
放了 A.LST, B.LST
grldr 是 08-12 中文,原版未修改
为方便上传,IMA里只保留了里面的外部命令文件
XDOS.rar (150.45 KB, 下载次数: 20)
回复

使用道具 举报

 楼主| 发表于 2010-9-20 17:54:52 | 显示全部楼层
谢谢提供资料,明白了,这不知算不算是个BUG,汗....

因为configfile命令不能返回(除非执行失败)

所以wenv run configfile后内存没有被释放就卡住了.

目前只允许执行一个外部命令,前一个命令没有完成时不可以执行其它命令,所以就有了上面的问题.

目前暂时的解决方法是不要用wenv 来运行configfile命令.

目前应该是无解了,看看不点有没有办法.
回复

使用道具 举报

发表于 2010-9-20 19:11:15 | 显示全部楼层
目前只能运行一条外部命令,只有它退出以后,才能运行另外的外部命令。

WENV 运行 configfile 之后,由于没有返回,所以,认为这条命令没有执行完。

想想有没有办法。

能不能把 wenv 运行的 configfile 命令转化成内部的 configfile 命令?

也就是说,WENV(或者其他外部命令)先退出,退出前做好某些必要的设置工作,然后,由内核检测某个设置,如果发现需要运行某个命令,就在 WENV(或者其他外部命令)退出之后立即运行。这样就解决问题了。
回复

使用道具 举报

发表于 2010-9-20 19:41:43 | 显示全部楼层
在等结果之前,我只能先传一个文件名进来
二级菜单中将它map成(rd),再 configfile 了

但这样有局限,因为我需要的不一定是configfile某个菜单
可能是直接 chainloader (hd0)+1 或 chainloader (hd0,0)+1 这样的命令, 虽然也有曲线办法解决,但不简洁

期待完善的解决办法
回复

使用道具 举报

 楼主| 发表于 2010-9-20 19:58:15 | 显示全部楼层
原帖由 不点 于 2010-9-20 19:11 发表
目前只能运行一条外部命令,只有它退出以后,才能运行另外的外部命令。

WENV 运行 configfile 之后,由于没有返回,所以,认为这条命令没有执行完。

想想有没有办法。

能不能把 wenv 运行的 configfil ...


这个办法倒是可以一试.嘿嘿.
回复

使用道具 举报

发表于 2010-9-20 22:58:27 | 显示全部楼层
广泛使用递归/回溯的prolog语言有一种“尾递归”优化,其思路或有参考价值。
关于尾递归,可以google一下。
回复

使用道具 举报

发表于 2010-9-21 16:28:20 | 显示全部楼层

诡异的 calc 命令(包括 WENV calc)

write 0x60010 0
calc *0x60000=*0x8280
calc *0x60004=*0x8208
calc *0x60008=*0x82A0
calc *0x6000C=*0x829C
第4条calc会影响 0x60010 的值

测试ISO
XDOS_test.rar (150.51 KB, 下载次数: 20)
tt.jpg
回复

使用道具 举报

 楼主| 发表于 2010-9-21 16:59:02 | 显示全部楼层
原帖由 tuxw 于 2010-9-21 16:28 发表
write 0x60010 0
calc *0x60000=*0x8280
calc *0x60004=*0x8208
calc *0x60008=*0x82A0
calc *0x6000C=*0x829C
第4条calc会影响 0x60010 的值

测试ISO
100041


呵呵,这是正常的,因为数值最大是64位.
回复

使用道具 举报

发表于 2010-9-21 17:15:47 | 显示全部楼层
原帖由 chenall 于 2010-9-21 16:59 发表


呵呵,这是正常的,因为数值最大是64位.


为什么我写
write 0x60000 -1
只写入了32位?


试了下 calc *addr 这样的操作确实是64位的

[ 本帖最后由 tuxw 于 2010-9-21 17:19 编辑 ]
回复

使用道具 举报

发表于 2010-9-21 20:59:44 | 显示全部楼层
写64位也有好处,用calc来做内存清零比write简洁得多
回复

使用道具 举报

发表于 2010-9-21 21:14:15 | 显示全部楼层
这个真不懂,呵呵呵呵
回复

使用道具 举报

发表于 2010-9-23 23:33:42 | 显示全部楼层
变量与参数的传递是个问题,看样子以后grub4dos会越来越强大。
回复

使用道具 举报

发表于 2010-9-24 00:37:28 | 显示全部楼层
原帖由 NicTense 于 2010-2-3 12:19 发表
既然是新命令的例子,就不要用dd和write了
calc *0x60000=*0x475 & 0xff
问题解决了,也不用清除


这条命令跟
dd if=(md) of=(md) bs=1 count=1 skip=0x475 seek=0x60000
有相当大的区别,影响结果的字节数不同,不能完全替代, calc 简洁,dd精确

原帖由 chenall 于 2010-6-26 15:48 发表
我考虑不周,大概星期二我再改一下。现在用手机上。
1.可能允许自定义使用的内存起始位置。
2.zhaohj说的不错,32个足够了。
3.会加上清除已设变量的功能。


有点像N年前说640K内存已经足够了。刚在时空看chenall弄了个外部命令版的贪吃蛇,以后还有更多基于外部命令的应用。WENV目前是最具魅力的外部命令,还有无限的挖掘空间,不要太早的限定死了。

@chenall
calc 对内存和变量有个用法不统一

write 0x60000 5
wenv calc *0x60000-5 || ECHO =5
这条命令会改变0x60000的值,不合乎编程习惯,它只是个表达式,*0x6000 应该只读取值
wenv calc temp=*0x60000-5 || ECHO =5 && set temp=
这样就正常了

wenv set tt=5
wenv calc ${tt}-5 || ECHO =5
这条命令不会改变tt的值

[ 本帖最后由 tuxw 于 2010-9-24 00:41 编辑 ]
回复

使用道具 举报

发表于 2010-9-24 09:47:05 | 显示全部楼层
希望 reset 命令能扩充下
WENV reset XXX*
清理所有 XXX 开头的变量名

这样可以快速清掉局部模块自己加入的变量而不影响其它模块
回复

使用道具 举报

 楼主| 发表于 2010-9-24 15:00:51 | 显示全部楼层
原帖由 tuxw 于 2010-9-24 00:37 发表


这条命令跟
dd if=(md) of=(md) bs=1 count=1 skip=0x475 seek=0x60000
有相当大的区别,影响结果的字节数不同,不能完全替代, calc 简洁,dd精确



有点像N年前说640K内存已经足够了。刚在时空看ch ...


目前可以使用64个变量,应该没有什么菜单会把64个全部用上吧,如果是的话那这个菜单也太变态了.

正常情况下用掉10已经是够多的了.

另外关于calc的设计.

以*开头的是代表内存地接(而且是直接操作内存地址的).

像calc *0x60000 = 1+2
直接把结果放在*0x60000中.

有一点之前没有考虑到,像calc *0x60000 + 1,是不应该改变内存的值的.下个版本再修改.
回复

使用道具 举报

 楼主| 发表于 2010-9-24 15:01:23 | 显示全部楼层
原帖由 tuxw 于 2010-9-24 09:47 发表
希望 reset 命令能扩充下
WENV reset XXX*
清理所有 XXX 开头的变量名

这样可以快速清掉局部模块自己加入的变量而不影响其它模块


目前可以使用
wenv set xxx=
后面为空来清除这个变量.
回复

使用道具 举报

发表于 2010-9-26 10:28:11 | 显示全部楼层
原帖由 chenall 于 2010-9-24 15:00 发表

以*开头的是代表内存地接(而且是直接操作内存 ...


发现一个避免的方法
wenv calc 0+*0x60000-5 || ECHO =5
这样就完全是个表达式了

原帖由 chenall 于 2010-9-24 15:01 发表

目前可以使用
wenv set xxx=
后面为空来清除这个变量.

我是想局部模块里将自己的临时变量用统一的前缀命名,退出时可以用一条命令快速的清理,这样可以避免数量限制不得不即用即清理,语法结构可以安排的得更清晰。当然,用 set 一个个的清理也是可以的,只是想偷偷懒:)


又一个不统一的地方
calc 针对地址是64位,针对变量是32位
wenv calc *0x60000=-1
wenv calc sign=*0x60000>>63,取符号位
wenv calc temp=-1
wenv calc sign=${temp}>>31,取符号位

还有个情况:下面这个写法经常导致重启
wenv calc  (${temp}-8})>>31 && ECHO temp<8
我想用这条命令来判断一个变量的范围(现在只能分成多条命令来实现)
有时不重启,它会将括号中的结果当0来计算,可能目前还不支持括号优先级吧。
但导致重启应该是语法检查还有待完善

另:
wevn calc temp=${temp}++
好象意义不大,书写上也不比+1更简洁,++/--优势没能体现(或许内部计算会更简洁吧)
如果改成
wenv calc ${temp}++
就好了
单目操作符直接改变变量值更直观

[ 本帖最后由 tuxw 于 2010-9-26 10:56 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2010-9-26 13:19:34 | 显示全部楼层
原帖由 tuxw 于 2010-9-26 10:28 发表


发现一个避免的方法
wenv calc 0+*0x60000-5 || ECHO =5
这样就完全是个表达式了


我是想局部模块里将自己的临时变量用统一的前缀命名,退出时可以用一条命令快速的清理,这样可以避免数量限制不得不 ...


嘻嘻,这个计算器是简易计算器,从左到右计算的。

其实我觉得你可以考虑自己修改一下....相信对你来说应该不难。
回复

使用道具 举报

发表于 2010-9-26 13:30:42 | 显示全部楼层
原帖由 chenall 于 2010-9-26 13:19 发表


嘻嘻,这个计算器是简易计算器,从左到右计算的。

其实我觉得你可以考虑自己修改一下....相信对你来说应该不难。


我对g4d和wenv的源码从没看过,对框架完全不了解,突然入手要改个东西难度很大,而且容易引入BUG且短时间内发现不了。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-28 19:40

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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