无忧启动论坛

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

[已解决] grub4dos如何处理近200个内存变量

[复制链接]
跳转到指定楼层
1#
发表于 2014-1-4 08:27:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qj_tzy 于 2014-1-8 13:51 编辑

如题,我在一个menu.lst中使用了很多个内存变量,按同样的取值方法,后面的变量内容就变为空了,由此,我想知道,grub4dos的内存变量个数是否有限制,最多能使用多少个,能处理近200个变量吗,我在置顶的帮助文件中又未找到说明。

诚请各位指点,谢谢!
2#
发表于 2014-1-4 14:52:58 | 只看该作者
由于偷懒也为了简化编程同时提高访问速度,采用的是扇区的访问方式.
变最名占用一个扇区,每个变量单独占用一个扇区,
其中每个变量名使用8个字节,所以有512/8 = 64个变量可以用,但是部份是系统保留的,实际上可用数量为60个.

一般情况下不建 议使用太多的变量,如果确实有必要还可以通过一个隐藏的功能来扩展(最多可以扩展到0XFFFF个)
set @extend BASE_ADDR SIZE

这里有英文的介绍,你可以参考下.
http://www.rmprepusb.com/tutoria ... ables-and-functions


点评

我试了试,菜单之前用set @extend BASE_ADDR SIZE命令后,有很多变量的值还是为空,不知怎样用此命令才能达到使用近200个变量的目的,还请指点,谢谢!  详情 回复 发表于 2014-1-4 18:55
谢谢,我试试  详情 回复 发表于 2014-1-4 16:11
回复

使用道具 举报

3#
 楼主| 发表于 2014-1-4 16:11:49 | 只看该作者
chenall 发表于 2014-1-4 14:52
由于偷懒也为了简化编程同时提高访问速度,采用的是扇区的访问方式.
变最名占用一个扇区,每个变量单独占用 ...

谢谢,我试试
回复

使用道具 举报

4#
 楼主| 发表于 2014-1-4 18:55:51 | 只看该作者
chenall 发表于 2014-1-4 14:52
由于偷懒也为了简化编程同时提高访问速度,采用的是扇区的访问方式.
变最名占用一个扇区,每个变量单独占用 ...

我试了试,菜单之前用set @extend BASE_ADDR SIZE命令后,有很多变量的值还是为空,不知怎样用此命令才能达到使用近200个变量的目的,还请指点,谢谢!

点评

楼主发的命令是不是 set @extend BASE_ADDR SIZE 红色部分直接使用字符串“BASE_ADDR”和“SIZE”,没换成具体数字? 如果是这样,那大家错怪楼主了。 如果不是这样,即楼主使用的是具体数字(类似超版给出的s  详情 回复 发表于 2014-1-6 16:28
回复

使用道具 举报

5#
发表于 2014-1-5 08:14:48 | 只看该作者
我讨厌回复这种挤牙膏式的问题,,

我现在都很少上无忧了,只是偶尔过来看下..没有太多时间.,,回复这种挤牙膏式的问题真是太浪费时间了.

上面我的链接中,有使用的例子,还有具体的说明.英文看不懂可以google翻译下,

你不能用至少贴一下你使用的命令,还有执行的命令的结果,当然GRUB4DOS问题报告同样少不了版本号,

搞不好来回几天后才发现原来用的是个旧版,那纯粹是浪费时间.

一个好提问者, 应该主动交待所有相关的一切,包括你尝试解决的方法等,很多时候一眼就可以看出问题所在...

挤牙膏式呢,就是比如,我要版本号,你才我版本号,要截图你才能截图,....

点评

已看了你说的那段英文说明,不过象我这种近50岁的人了,Y文看起来确实很吃力,懂了个大概。 在set @extend BASE_ADDR SIZE命令中,BASE_ADDR值不论用0x50000或0x40000,至0x7fff处,最多扩展的内部变量的个数size值  详情 回复 发表于 2014-1-6 09:15
回复

使用道具 举报

6#
 楼主| 发表于 2014-1-6 09:15:10 | 只看该作者
chenall 发表于 2014-1-5 08:14
我讨厌回复这种挤牙膏式的问题,,

我现在都很少上无忧了,只是偶尔过来看下..没有太多时间.,,回复这种挤牙 ...

已看了你说的那段英文说明,不过象我这种近50岁的人了,Y文看起来确实很吃力,懂了个大概。
在set @extend BASE_ADDR SIZE命令中,BASE_ADDR值不论用0x50000或0x40000,至0x7fff处,最多扩展的内部变量的个数size值只有20来个。若扩展的变量较多,你好象说最多可至65,536个,BASE_ADDR取何值比较安全且容量又足够呢,还望指点。
不过话说回来,大师的火气是大了点。

点评

没看到你写的具体命令 不过估计是把参数弄错了 set @extend BASE_ADDR SIZE 中 SIZE的值就是想要增加的变量的数量 比如你想扩展至200个 那SIZE值就应该是200 相应的缓存就需要至少104448字节 也就是10  详情 回复 发表于 2014-1-6 10:07
回复

使用道具 举报

7#
发表于 2014-1-6 10:07:00 | 只看该作者
qj_tzy 发表于 2014-1-6 09:15
已看了你说的那段英文说明,不过象我这种近50岁的人了,Y文看起来确实很吃力,懂了个大概。
在set @exte ...

没看到你写的具体命令  不过估计是把参数弄错了  

set @extend BASE_ADDR SIZE 中 SIZE的值就是想要增加的变量的数量  比如你想扩展至200个  那SIZE值就应该是200  

相应的缓存就需要至少104448字节  也就是100多K的空间才可以  这个只能放置在超过64M处了  也就是0x4000000处起始

完整的命令就是set @extend 0x4000000 200

注意这样设置后 (md)0x20000+0xCC  这段内存都是变量值的缓存区  不能再用作其他用途  也不能被其他程序所破坏

点评

但若真要一次将所有数据提取出来赋给变量,达到近200个时,按sratlf大师在7楼所说办法,是不是安全性有些问题。  详情 回复 发表于 2014-1-6 17:09
回复

使用道具 举报

8#
发表于 2014-1-6 11:09:03 | 只看该作者
本帖最后由 不点 于 2014-1-6 11:18 编辑
大师的火气是大了点


我觉得那是一种形式的抱怨而已。无论谁都有 “抱怨” 权。这是平等的。

他如果不抱怨,那么他的想法、他的感受就有可能不被别人了解。

别人首先需要了解,然后,才会有理解和谅解。

近50岁的人了


我觉得,果真如此,那么你的最后一句话似乎是有些多余的。我是说,假如你省略最后一句话,更像是一个岁数比较大的人。岁数大了,看问题通常比较淡定,有很多问题,那是视而不见的,抱怨也相对会减少的。
回复

使用道具 举报

9#
发表于 2014-1-6 16:28:31 | 只看该作者
qj_tzy 发表于 2014-1-4 18:55
我试了试,菜单之前用set @extend BASE_ADDR SIZE命令后,有很多变量的值还是为空,不知怎样用此命令才能 ...

楼主发的命令是不是
set @extend BASE_ADDR SIZE
红色部分直接使用字符串“BASE_ADDR”和“SIZE”,没换成具体数字?
如果是这样,那大家错怪楼主了。

如果不是这样,即楼主使用的是具体数字(类似超版给出的set @extend 0x4000000 200那样),则楼主欠妥。
因为楼主没给出一个像超版那样的有具体数字的命令,没给出报错屏幕信息等等,在信息匮乏情况下有多种可能,别人很难猜出确切原因,如果把多种可能一一说出又太累,于是难以回复。
可能要发帖向楼主索要更多信息,然后等楼主回复提供信息,那一来一回太花时间了。
就是说,楼主作为提问人,最好多主动提供详细信息,不要等别人问起才提供,或者问一句只答一句。

个人感觉这样的提问者最受欢迎:
1、主动提供详细信息,为分析问题提供更多线索
2、愿意反复交流直到水落石出,而不是回复者还志在必得,提问者已经放弃了。
3、不因某些回复对自己无价值而嫌弃回复者,急功近利

点评

我用了下句命令 set @extend 0x38000 30 #希望用grub4dos占用且供以后扩展的地址及留给用户使用的地址段0x38000至0x7fff,感觉这样要安全一点,但我粗约计算了一下,好象只能扩展30个内部变量,加上除原供用户使用  详情 回复 发表于 2014-1-6 17:03
回复

使用道具 举报

10#
 楼主| 发表于 2014-1-6 17:03:06 | 只看该作者
pseudo 发表于 2014-1-6 16:28
楼主发的命令是不是
set @extend BASE_ADDR SIZE
红色部分直接使用字符串“BASE_ADDR”和“SIZE”,没 ...

我用了下句命令
set @extend 0x38000 30
#希望用grub4dos占用且供以后扩展的地址及留给用户使用的地址段0x38000至0x7fff,感觉这样要安全一点,但我粗约计算了一下,好象只能扩展30个内部变量,加上除原供用户使用的60个,现扩展至90个。

由于我要一次提取的数据全部赋给变量的话,要用近200个,为了实现在90个变量内解决这一问题,我眠思苦想,以至昨晚基本未睡好觉,终于想出分次提取数据的办法,今天很早就起来,编grub4dos实现之,现在已基本达到目的,但要认真调试后才知是否已真正实现。

点评

30个的话也需要15872字节 15K多呢 放在0x38000位置肯定不行 会和grub4dos所使用的内存块冲突 最好还是放在64M开外的地方 肯定不会影响grub4dos的运行 风险就是可能会被某些也使用64M开外内存的批处理破坏。。  详情 回复 发表于 2014-1-6 17:28
回复

使用道具 举报

11#
 楼主| 发表于 2014-1-6 17:09:35 | 只看该作者
sratlf 发表于 2014-1-6 10:07
没看到你写的具体命令  不过估计是把参数弄错了  

set @extend BASE_ADDR SIZE 中 SIZE的值就是想要增 ...

但若真要一次将所有数据提取出来赋给变量,达到近200个时,按sratlf大师在7楼所说办法,是不是安全性有些问题。
回复

使用道具 举报

12#
发表于 2014-1-6 17:28:55 | 只看该作者
qj_tzy 发表于 2014-1-6 17:03
我用了下句命令
set @extend 0x38000 30
#希望用grub4dos占用且供以后扩展的地址及留给用户使用的地址 ...

30个的话也需要15872字节  15K多呢  放在0x38000位置肯定不行  会和grub4dos所使用的内存块冲突  最好还是放在64M开外的地方  肯定不会影响grub4dos的运行  风险就是可能会被某些也使用64M开外内存的批处理破坏。。。  这个还是自己把握吧

点评

chenall 在2楼提供的一个链接文档介绍中说,若扩展10个内部变量,需要的内存是“this needs memory (((10+63)/64) + 10)*512 = 5632”,即如何计算扩展变量所需的内存数没有搞明白。 可否这样简单计算,扩展的变  详情 回复 发表于 2014-1-8 08:02
好的,  详情 回复 发表于 2014-1-6 17:57
回复

使用道具 举报

13#
 楼主| 发表于 2014-1-6 17:57:47 | 只看该作者
本帖最后由 qj_tzy 于 2014-1-6 17:59 编辑
sratlf 发表于 2014-1-6 17:28
30个的话也需要15872字节  15K多呢  放在0x38000位置肯定不行  会和grub4dos所使用的内存块冲突  最好还 ...


好的,我就在grub4dos模块中把它改为64M处调试一下,有什么问题再请教,谢谢!
回复

使用道具 举报

14#
 楼主| 发表于 2014-1-8 08:02:47 | 只看该作者
sratlf 发表于 2014-1-6 17:28
30个的话也需要15872字节  15K多呢  放在0x38000位置肯定不行  会和grub4dos所使用的内存块冲突  最好还 ...

chenall 在2楼提供的一个链接文档介绍中说,若扩展10个内部变量,需要的内存是“this needs memory (((10+63)/64) + 10)*512 = 5632”,即如何计算扩展变量所需的内存数没有搞明白。

可否这样简单计算,扩展的变量数SIZE*512字节即可。若是这样,因0x50000~7FFFF段是grub4dos保留给用户使用的,(0x7fff-0x50000)=196607(十进制),再196607/512/8=47,也就是说,可否用set @extend 0x50000 47这句,将grub4dos提供给用户使用的地址0x50000至0x7ffff段来扩展47个内部变量?

点评

如果确定这段地址都是空的 没有人使用的话 应该最多可以容纳377个变量 占用内存是196096 占用内存= (((N+63)/64) + N)*512 两个N换成想增加的变量数量就可以了  详情 回复 发表于 2014-1-8 11:09
回复

使用道具 举报

15#
发表于 2014-1-8 10:00:10 | 只看该作者
发表点个人的看法。我认为没必要像这样 “满负荷” 地使用 grub4dos,或者甚至 “超负荷” 使用 grub4dos。当然了,什么事情都不是绝对的,如果有人像 zw2312914 那样专门是来为 grub4dos 找毛病和排解 bug 的,那就是另外一个性质的问题了。我认为,普通的使用者应该尽量远离 “极限”,更不应该去 “超限”。一个东西,能用、够用,那就行了。今天能用,今天就是缘分。明天不能用,明天就没有缘分。事物是动态的,是不断变化的。没有必要死抠住一门技术不放,没有必要吊死在一棵树上。当然也不要误会,我不是想让人远离 grub4dos,我只是谈谈个人的哲学罢了,而且也不是教训、教导别人,我没这权利,没这资格(谁有这资格?或许上帝有吧)。任何事情都有一个 “度” 在里头,要适度,不要走极端,不要超限。为什么呢?因为超限了的话,往往就容易碰钉子、走弯路、不顺利。我们生活在地球,这多好,有厚厚的大气层保护我们。如果离开地球,跑到别的星球去,那就处处是危险了。我们在大气层的极限以内,可以生存,而且只有在远离大气层边缘的地面附近,生存的质量才比较高。鸟兽鱼虾也大都生存在这个范围。

点评

我是在实际中确有这样的运用才来了解的,不然也不会花这些时间。谢谢  详情 回复 发表于 2014-1-8 13:49
回复

使用道具 举报

16#
发表于 2014-1-8 11:09:24 | 只看该作者
qj_tzy 发表于 2014-1-8 08:02
chenall 在2楼提供的一个链接文档介绍中说,若扩展10个内部变量,需要的内存是“this needs memory (((10 ...

如果确定这段地址都是空的  没有人使用的话  应该最多可以容纳377个变量  占用内存是196096

占用内存= (((N+63)/64) + N)*512    两个N换成想增加的变量数量就可以了

点评

谢谢指点,到此为止,这一问题应该说可以得到基本解决了。  详情 回复 发表于 2014-1-8 13:51
回复

使用道具 举报

17#
 楼主| 发表于 2014-1-8 13:49:14 | 只看该作者
不点 发表于 2014-1-8 10:00
发表点个人的看法。我认为没必要像这样 “满负荷” 地使用 grub4dos,或者甚至 “超负荷” 使用 grub4dos。 ...

我是在实际中确有这样的运用才来了解的,不然也不会花这些时间。谢谢
回复

使用道具 举报

18#
 楼主| 发表于 2014-1-8 13:51:29 | 只看该作者
sratlf 发表于 2014-1-8 11:09
如果确定这段地址都是空的  没有人使用的话  应该最多可以容纳377个变量  占用内存是196096

占用内存= ...

谢谢指点,到此为止,这一问题应该说可以得到基本解决了。
回复

使用道具 举报

19#
发表于 2014-1-11 00:21:27 | 只看该作者
2、愿意反复交流直到水落石出,而不是回复者还志在必得,提问者已经放弃了。
这样的人少,当然我不是说楼主。以前在ff论坛求助区咱还很热心的帮人回答问题,结果问题解决不少人直接拍拍屁股走人了。连句礼貌性的谢谢都不会说。
现在都基本直接无视。看了也懒得回了呵呵。
回复

使用道具 举报

20#
发表于 2014-1-11 06:44:39 | 只看该作者
我记得前不久有人在英文论坛上要求 dos 下运行的 grub.exe 支持加载超过 4K 的菜单。站在他的立场上,他当然认为他的要求是理所当然的。但是,站在开发者以及大众的角度,那就有不同的结论。增加缓冲区长度,带来的是不兼容,带来的是用户可用内存的减少。经过一番讨论之后,提问者决定自己写程序把自己的大菜单加载在物理地址 64M 处。

开发者写程序,就有一个反复修改和优化的过程。用户使用软件,也有一个相同的过程,那就是要反复优化自己的方案,避免过度地消耗掉有限的系统资源。资源总是有限的,如果不考虑节约,那总是不够用的。我们要节约资源,要低碳环保。开发者不可能照顾到每一个角落。有些细节照顾不到。少数人的特殊需要,照顾不到。用户在各种软件以及自己的应用之间,应该找到一个平衡点。究竟是要修改软件来适应自己,还是要修改自己去适应软件,那就需要用户在自己的心目中作一个权衡。

点评

再次感谢yjd及不点大师的指点,我同意不点大师的说法,我现把我的解决方案报告如下,不知妥否,现在还在进一步调试中: 若我一次性从一个文本文件提供所需的全部数据赋给内部变量,所需的变量数较多,所以为节约内  详情 回复 发表于 2014-1-11 11:05
回复

使用道具 举报

21#
 楼主| 发表于 2014-1-11 11:05:47 | 只看该作者
本帖最后由 qj_tzy 于 2014-1-11 11:08 编辑
不点 发表于 2014-1-11 06:44
我记得前不久有人在英文论坛上要求 dos 下运行的 grub.exe 支持加载超过 4K 的菜单。站在他的立场上,他当 ...


再次感谢yjd及不点大师的指点,我同意不点大师的说法,我现把我的解决方案报告如下,不知妥否,现在还在进一步调试中:
若我一次性从一个文本文件提供所需的全部数据赋给内部变量,所需的变量数较多,所以为节约内存资源、不超负载运行,我采取了分次提取数据的办法:
一是用set @extend 0x50000 45命令在0x50000处扩展45个变量(不知内存够否?),从文本文件中提取各个模块运行显示菜单前所需的公共变量。
二是各模块运行显示菜单待用户选择后,再从文本文件中提取已选择项所需的数据赋緥变量;待本模块结束前,删除在本模块中新设定的变量。
回复

使用道具 举报

22#
发表于 2014-1-11 11:11:42 | 只看该作者
我个人觉得或许你可以重新考虑你的战略部署。到底是否需要把 txt 文件读入内存?嗯??有没有可以完全避免读入内存的做法?或者至少完全避免使用变量的方法?

当然这不是干涉你的行为方式,而是提供一个思路,至于说对与不对、合适不合适、能否采用,你需要自己加以权衡和认定。

点评

就是想让用户将本机安装的windows系统定义在文本文件中,再从文件文件中读出信息让用户选择启动。如果采取直接搜索启动的话,若是VHD系统,同一系统有多个文件,不知启动哪一个。所以采取直接搜索启动的办法,由于本  详情 回复 发表于 2014-1-12 13:48
回复

使用道具 举报

23#
 楼主| 发表于 2014-1-12 13:48:57 | 只看该作者
不点 发表于 2014-1-11 11:11
我个人觉得或许你可以重新考虑你的战略部署。到底是否需要把 txt 文件读入内存?嗯??有没有可以完全避免 ...

就是想让用户将本机安装的windows系统定义在文本文件中,再从文件文件中读出信息让用户选择启动。如果采取直接搜索启动的话,若是VHD系统,同一系统有多个文件,不知启动哪一个。所以采取直接搜索启动的办法,由于本人水平有限,难以实现。
回复

使用道具 举报

24#
发表于 2014-1-12 20:21:55 | 只看该作者
没有看明白具体的要求.

不过感觉应该可以参考我的那个硬盘工具箱的ADDONS组件的加载方式.
每个组件都有一个对应的文件,该文件包含了启动的菜单和命令.

启动时自动根据这些文件来生成菜单,不需要用到任何变量.

点评

不好意思,我今天在本论坛中搜索关键字ADDONS未找到,能否告诉我一下下载该组件的链接吗?谢谢!  详情 回复 发表于 2014-1-13 12:14
感谢指点,我有空时学习一下该组件,到时遇到不懂的地方还请您多指点。  详情 回复 发表于 2014-1-12 20:31
回复

使用道具 举报

25#
 楼主| 发表于 2014-1-12 20:31:39 | 只看该作者
chenall 发表于 2014-1-12 20:21
没有看明白具体的要求.

不过感觉应该可以参考我的那个硬盘工具箱的ADDONS组件的加载方式.

感谢指点,我有空时学习一下该组件,到时遇到不懂的地方还请您多指点。
回复

使用道具 举报

26#
 楼主| 发表于 2014-1-13 12:14:29 | 只看该作者
chenall 发表于 2014-1-12 20:21
没有看明白具体的要求.

不过感觉应该可以参考我的那个硬盘工具箱的ADDONS组件的加载方式.

不好意思,我今天在本论坛中搜索关键字ADDONS未找到,能否告诉我一下下载该组件的链接吗?谢谢!
回复

使用道具 举报

27#
发表于 2014-1-13 13:32:25 | 只看该作者
好像叫grub4dos硬盘工具箱。最新版本应该在C大的blog上。
回复

使用道具 举报

28#
发表于 2014-1-13 18:20:17 | 只看该作者

点评

谢谢楼上两位,我已下载。在学习时不懂之处,请各位多指教。  详情 回复 发表于 2014-1-13 18:43
回复

使用道具 举报

29#
 楼主| 发表于 2014-1-13 18:43:16 | 只看该作者
dihuo0 发表于 2014-1-13 18:20
http://www.chenall.net/post/g4d_hd_tools/

谢谢楼上两位,我已下载。在学习时不懂之处,请各位多指教。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-21 06:02

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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