无忧启动论坛

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

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

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

使用道具 举报

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

使用道具 举报

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

明天再上传新版本。
回复

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

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

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

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

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

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

使用道具 举报

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

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

想想有没有办法。

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


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

使用道具 举报

69#
 楼主| 发表于 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位.
回复

使用道具 举报

70#
 楼主| 发表于 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,是不应该改变内存的值的.下个版本再修改.
回复

使用道具 举报

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

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


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

使用道具 举报

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


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


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


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

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

使用道具 举报

73#
 楼主| 发表于 2010-9-26 14:36:34 | 显示全部楼层
原帖由 tuxw 于 2010-9-26 13:30 发表


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


呵呵,只要懂得点C很容易看懂WENV的,并没有想像中的那么难,我当初刚刚开始学C语言,就拿GRUB4DOS来研究。

因为不会用到C语言的函数库,所以我觉得很容易入门,因为不需要一开始就接触那么多函数,并且我一开始只看我能看懂的部份,慢慢的就了解了很多东西。

编写外部命令只要不调用C语言的函数就一般没有什么问题了,需要的函数如果G4D没有提供就要自己实现。
回复

使用道具 举报

74#
 楼主| 发表于 2010-9-26 20:45:49 | 显示全部楼层
原帖由 tuxw 于 2010-9-26 18:56 发表

函数库我倒不怕,我怕的是一大堆BIOS调用。N年前有一本裘伯君的《深入DOS编程》(好象是这个名字),花了很多心思才借到一本,看过之后对它很是抵触,那些底层的编程技术确实很酷(后来想来与没什么,只是因为 ...


嘻嘻,那些BIOS编程我没有研究过。
什么BIOS功能号调用号各种存器编号只是有了解了一点点而儿。

我目前接触的GRUB4DOS包括我写的外部命令都没有用过这些功能(CHKPCI除外),只是纯粹的C语言基本代码。

有空还是要把WENV再继续完善一下,或者找一个好用的SHELL代替GRUB4DOS内部的SHELL。
回复

使用道具 举报

75#
 楼主| 发表于 2010-9-29 11:34:42 | 显示全部楼层
原帖由 zxw 于 2010-9-28 23:26 发表
@chenall大:
操作符 ! 怎么又取消了啊?


没有啊,也许是意外?还是操作错误。。
回复

使用道具 举报

76#
 楼主| 发表于 2010-9-29 12:40:21 | 显示全部楼层
原帖由 pseudo 于 2010-9-29 11:59 发表
9.27,!真的不灵了。


回头再查一下,可能哪里改错了。。
回复

使用道具 举报

77#
 楼主| 发表于 2010-9-30 10:06:55 | 显示全部楼层
已经找到原因,新的版本还没有上传。中午再上传。
回复

使用道具 举报

78#
 楼主| 发表于 2010-9-30 15:04:20 | 显示全部楼层
原帖由 tuxw 于 2010-9-30 14:51 发表
0925版 calc 还有问题

100633
显示结果是64位,实际只处理了32位


wenv 里面的calc是wenv内置的和grub4dos内部的不一样。

wenv里面的calc命令没有更新

可以通过wenv run calc来调用grub4dos内部的calc命令

另外wenv里面的处理好像也有些问题,得空还得再改改。。

[ 本帖最后由 chenall 于 2010-9-30 15:08 编辑 ]
回复

使用道具 举报

79#
 楼主| 发表于 2010-9-30 16:29:02 | 显示全部楼层
原帖由 zhaohj 于 2010-9-30 16:15 发表
减法好像有问题,不能减负数



其实这些我没有考虑太多,当前只是弄出来暂用一下。。

而且-负数按你的例子语法也是错的。

因为扩展之后执行的是

calc 1--1

这样的语句,到底应该如何计算呢?

目前是从左到右的,所以计算方式是先1-- 然后剩下一个1,没有运算符了,所以出错。

其实目前的calc只是很简单的计算器,不要用来计算太复杂的东西。很多东西都没有完善的。

当然了你们也可以考虑修改一下CALC命令让它成为真正的计算器命令。

或者谁可以提供一个DOS计算器(命令行的)的源码,我看看能不能整进去。因为要考虑的东西太多了,懒得再去写一个新的。

[ 本帖最后由 chenall 于 2010-9-30 16:32 编辑 ]
回复

使用道具 举报

80#
 楼主| 发表于 2010-9-30 19:08:40 | 显示全部楼层
回复

使用道具 举报

81#
 楼主| 发表于 2010-10-1 12:10:15 | 显示全部楼层
原帖由 tuxw 于 2010-9-30 20:50 发表
看代码时发现一个问题,判断子命令时没有长度判断,那么

wenv getttttt 是合法的命令,等同于 wenv get



嗯,目前大部份的GRUB4DOS命令都是这样的。^_^
回复

使用道具 举报

82#
 楼主| 发表于 2010-10-1 12:12:15 | 显示全部楼层
原帖由 tuxw 于 2010-9-30 19:56 发表


100665


因为没有取消前面的++和--运算符所以会这样子

使用类似如下的例子就正常了。
wenv calc a=1--1
回复

使用道具 举报

83#
 楼主| 发表于 2010-10-1 18:43:58 | 显示全部楼层
原帖由 tuxw 于 2010-10-1 13:26 发表
请教下chenall,外部命令最简单的编译环境如何搭建?
昨晚下了 MSYS 测试,snv下载代码,进去用 ./build 编译通过不过,难道为了编译个外部命令去装个Linux?


外部命令目前只能在LINUX下编译...
推荐用COLINUX,方便,我目前就是用COLINUX下的UBUNTU编译的。

我的brsbox网盘中可以下载COLINUX+UBUNTU的安装包。

http://www.brsbox.com/chenall

下载密码是:GRUB4DOS

有兴趣的都可以下载试试。
回复

使用道具 举报

84#
 楼主| 发表于 2010-10-2 08:57:56 | 显示全部楼层
原帖由 tuxw 于 2010-10-2 01:27 发表


下载了,在Win7和XP下测试
直接启动没反应(cmd闪一下)
安装服务后,ubuntu服务不能启动



注意:colinux不能和其它虚拟机同时使用像VPC和VMWARE,当然了不能在虚拟机里面安装COLINUX
回复

使用道具 举报

85#
 楼主| 发表于 2010-10-2 08:59:53 | 显示全部楼层
原帖由 hhh333 于 2010-10-1 20:53 发表
chenall大侠,近期在学习你的NTBOOT超级启动IMG,确实很棒,其中的BCD很小,不知道能不能公布其技术细节?从win7原版光盘中的BCD是256KB的,一般用于7PE映象启动的都是用这个文件,我看我的WIN7系统中的是32KB的 ...



只需要用WINDOWS的注册表编辑器加载这个BCD文件,然后导出为一个新的就是小了。

当然可以增加菜单项。目前的BCD里面有3个菜单,一个是普通的,一个是WIM,还有一个VHD的。用BCDEDIT查看是只能看到一个。

因为经过了特殊处理。

一些细节,有空我再整理成图文的介绍。

[ 本帖最后由 chenall 于 2010-10-2 09:01 编辑 ]
回复

使用道具 举报

86#
 楼主| 发表于 2010-10-3 08:11:58 | 显示全部楼层
原帖由 tuxw 于 2010-10-3 02:54 发表
貌似colinux不能运行在64位系统下
在VMWARE里装个XP,在虚拟机里总算可以编译了(绕了好大一个弯)。但网络不正常,不能下载源码,只能在虚拟机与宿主间倒来倒去了


默认是使用桥接网络的,如果你使用路由器共享上网那就可以直接使用。若是单机拨号连接的,只要设置你的拨号连接为共享应该也就可以了。
回复

使用道具 举报

87#
 楼主| 发表于 2010-10-3 11:41:49 | 显示全部楼层
while (*in && po - out < MAX_ENV_LEN)
这确实是一个BUG,你没说我都没有注意。

debug是GRUB4DOS的变量。具体可以看grub4dos.h文件。

以下语句是固定的,用于获取从GRUB4DOS传过来的参数.
void *p = &main;
char *arg = p - (*(int *)(p - 8));
int flags = (*(int *)(p - 12));
arg 是参数。flags是标志,一般代表程序是从哪里执行的,比如从菜单执行或命令行执行的。
flags相关的定义在shared.h文件中

/* The flags for the builtins.  */
#define BUILTIN_CMDLINE                0x1        /* Run in the command-line.  */
#define BUILTIN_MENU                0x2        /* Run in the menu.  */
#define BUILTIN_TITLE                0x4        /* Only for the command title.  */
#define BUILTIN_SCRIPT                0x8        /* Run in the script.  */

通过flags可以限制程序执行,比如不允许在菜单中运行则
if (flags & BUILTIN_MENU) return 0;

用WIN7可以搜的用命令行
进入到GRUB4DOS_SRC\STAGE2目录下。
find "safe_parse_maxint" *.c
还有
find "safe_parse_maxint" *.H
回复

使用道具 举报

88#
 楼主| 发表于 2010-10-4 16:26:50 | 显示全部楼层
欢迎tuxw加入....^_^
看了一下加入了很多注释,不错。

总算引出了一块玉,希望更多的人可以加入一起完善。

其实门槛并不高,只要装个可以LINUX用GCC编程就可以了(这都有现成的)。

只要懂些C语言的基础知识,你也可以。因为正常情况下只涉及很简单的语法。
回复

使用道具 举报

89#
 楼主| 发表于 2010-10-4 18:16:19 | 显示全部楼层
原帖由 tuxw 于 2010-10-4 17:10 发表


按wenv目前的设计结构负数不能直接运算。所我将wenv calc 的运算结果改为补码形式。
前面的 wenv calc 1-2 结果是32位补码,虽然看起来它不是-1,实际上它就是-1。这样改是为了让负数能够进行运算。


WENV 后面的版本是可以计算负数的呀.

看了一下好像你修改的WENV还是之前的版本.

试试我今天上传的WENV.C ,修改了grub_memcmp函数,使得参数可以更匹配
比如wenv getttt就不再相当于wenv get了.
但wenv get= 还是想当于wenv get因为使用了空格和制表符还有"="分隔参数.

在线查看
http://code.google.com/p/grubutils/source/browse/trunk/src/wenv.c

下载源码
http://grubutils.googlecode.com/svn/trunk/src/wenv.c

[ 本帖最后由 chenall 于 2010-10-4 18:17 编辑 ]
回复

使用道具 举报

90#
 楼主| 发表于 2010-10-4 19:50:16 | 显示全部楼层
晚上有些时间,我准备尝试在WENV中加入字符串提取的功能.(不知晚上能不能搞定)
和LINUX SHELL语法一样.
具体的语法介绍可以先看看这里.
http://blog.csdn.net/gumanren/archive/2010/05/17/5601544.aspx

可能会比较麻烦,先尝试实现其中一两个功能.
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-18 06:15

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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