无忧启动论坛

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

GRUB4DOS更新建议、bug反馈专帖

    [复制链接]
331#
发表于 2011-5-29 00:21:00 | 显示全部楼层

回复 #983 tuxw 的帖子

目前没有这样的设计,也许会考虑增强一下call命令,这样就和CMD类似了。
若非必要建议还是分开写。
回复

使用道具 举报

332#
发表于 2011-5-29 16:00:46 | 显示全部楼层

回复 #989 blithewind 的帖子

比较奇怪,我并没有针对这个作任何的改动呀。

你有空的话可以多试试几个版本。

注:我编译的版本,ROY编译的版本,不点编译的版本。

不点的上传在这里
http://nufans.net/grub4dos/tinybit/

googlecode上看下上传者就知道是谁编译的。

我怀疑和编译的环境可能有关系。
回复

使用道具 举报

333#
发表于 2011-5-29 23:57:48 | 显示全部楼层
为了支持(fdx,y)的格式的后遗症。

不过不影响使用,其实像上面的也不一定全是无效的,你可以试一下,有可能就有其中一个可以访问。^_^。

对这些比较熟的朋友可以改造一下next_partition函数来解决。

或者制作软盘镜像时,把第一扇区的分区表位置的值清零就不会了。
回复

使用道具 举报

334#
发表于 2011-5-30 11:01:22 | 显示全部楼层

回复 #996 tuxw 的帖子

@root后面是没有'/',因为内部保存的就是没有'/'。
像root (hd0,0)/boot 和 root (hd0,0)/boot/ 效果是完全一样的。

@path是后面增加的,为了编程方便有'/',因为输入不带'/'的外部命令会从这个目录下查找,这样就可以直接简单的把两个字符串连接起来就行了,而不用再特意去加'/'

批处理标签长度没有限制,因为在扫描批处理标签时只是标记了这一行是标签,得到的是一个指针。
另外标签中如果如出现空格、制表符,则只有前面的字符有效。

:test abcd
实际上是等于:test
标签不区分大小写,如果有同名的标签,以第一个为准。

不过有其它限制,比如一个批处理中不能超过128个标签,不能超过2048行(注释和标签不算)。
回复

使用道具 举报

335#
发表于 2011-5-30 16:26:10 | 显示全部楼层

回复 #1000 zhaohj 的帖子

需要空白软盘镜像可以用fat。
map --mem (md)+2880 (fd0)
map --hook
fat mkfs (fd0)

另外使用fat mkfs (fd0)格式化的磁盘可用空间也比较大(因为它只使用了一个FAT表,而非正常的两个,所以就节省了一个FAT表的空间)

[ 本帖最后由 chenall 于 2011-5-30 16:28 编辑 ]
回复

使用道具 举报

336#
发表于 2011-5-31 08:27:45 | 显示全部楼层

回复 #1002 zhaohj 的帖子

这个我也不懂,应该会有类拟的VEN_XXXX&DEV_XXXX的吧,你可以chkpci列出所有PCI看一下。
回复

使用道具 举报

337#
发表于 2011-5-31 17:20:43 | 显示全部楼层

回复 #1004 tuxw 的帖子

试了一下,好像确实如此,不过这是小问题影响不大。

@jianliulin
这是正常的,find命令查找光盘只会查找(cd)或当前root的光盘设备。

所以你这个是肯定找不到的。
回复

使用道具 举报

338#
发表于 2011-5-31 21:39:42 | 显示全部楼层

回复 #1008 hhh333 的帖子

你把menu.lst放在可见区那是肯定会一直变的,因为0x8280其实就是当前使用的menu.lst所在的磁盘。

如果把menu.lst放在ud那就一直都会是23.

要检测是不是从ud启动的,其实只要检测(0x23)是否存在就行了..

用以下命令就可以检测
find --devices=u && set bd=ud

[ 本帖最后由 chenall 于 2011-5-31 21:49 编辑 ]
回复

使用道具 举报

339#
发表于 2011-6-1 09:32:08 | 显示全部楼层

回复 #1011 hhh333 的帖子

很早就一直这样子了。

检测是否(fd0,0)用新版的比较简单
if "%@root%"=="(fd0,0)" echo (fd0,0)

如果对GRUB4DOS比较熟悉的话检测的方法还有很多种。关键是变通。
回复

使用道具 举报

340#
发表于 2011-6-6 20:26:37 | 显示全部楼层

回复 #1030 hhh333 的帖子

有一些东西看起来很简单,但是要实现的话代价是挺大的,而且并不一定能满足要求。

如果要按照你的想法,那变化会比较大,造成“不兼容”。

一般只要记住(bd)boot drive就是menu.lst所在磁盘就行了。如果是内置菜单就是GRLDR文件所在磁盘。

关键还是应用,只要应用得当一切都不是问题。
回复

使用道具 举报

341#
发表于 2011-7-1 16:53:48 | 显示全部楼层

回复 #1047 2011_dihuo0 的帖子

1、之前曾经有一个版本有支持,不过出现了其它方面的问题恢复了,在没有比较好的解决方法之前,还是保留现状
2、为了减小代码量,实际上有很多地方的限制都只是约定,代码中并没有限制。
3、很多情况下还是区分大小写的,内部变量不区分大小写是为了方便使用,我觉得目前一切使用上还是很正常。
4、处理起来比较麻烦。浪费代码空间,最终可能还达不到理想效果。
5、嗯,这是一个疏忽,谢谢提醒。

我之前就是因为和你目前的情况差不多,因为某些方面达不到我想要的效果,所以才决定自己修改让它达到我想要的效果,最终加入了GRUB4DOS开发。并且从中学习到了很多东西。

对于编程我也只是业余的,很多东西都是临时去学习的。

我觉得你应该有能力自己修改,完全可以去尝试一下。
回复

使用道具 举报

342#
发表于 2011-7-3 15:05:02 | 显示全部楼层
尝试解决批处理%~0,%~d0...等替换的问题。
修正if命令的一个bug.
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=179738&page=54#pid2268728

其它代码调整。

改动比较大,我自己时间有限,麻烦有条件的朋友做更多的测试。

[ 本帖最后由 chenall 于 2011-7-4 10:41 编辑 ]
回复

使用道具 举报

343#
发表于 2011-7-4 10:41:29 | 显示全部楼层
试试这个。

grub4dos-0.4.5b-2011-07-04.7z

265.07 KB, 下载次数: 38, 下载积分: 无忧币 -2

回复

使用道具 举报

344#
发表于 2011-7-4 15:41:17 | 显示全部楼层

回复 #1058 zhaohj 的帖子

看起来是正常的呀

#1059
为什么要大写?只为了某个特定的环境?我觉得没有这个必要,而且只是徒增麻烦罢了。

返回真实的路径,这个正要修改。
回复

使用道具 举报

345#
发表于 2011-7-5 00:09:06 | 显示全部楼层
尝试解决%~d0,%~dp0的问题。

可以试试这个,如果没有意外的话应该是正常的。
比如test.bat放在commnad_path目录下。

直接执行tes.bat

这时获取到的%~dp0应该是command_path.

如果这个test.bat放在当前root,则获取到的%~dp0就是当前的@root.

注意:外部命令查找顺序,command_path目录里面的文件优先使用。

grldr.zip

140.53 KB, 下载次数: 26, 下载积分: 无忧币 -2

回复

使用道具 举报

346#
发表于 2011-7-5 14:14:43 | 显示全部楼层
这个应该比较完善了。
对于%~d0会自动处理成友好的形式。比如(hd0,x)或(fdx),(pd)之类的。

先放着试两天没有问题再更新源码。

grub4dos-0.4.5b-2011-07-05.7z

265.3 KB, 下载次数: 149, 下载积分: 无忧币 -2

回复

使用道具 举报

347#
发表于 2011-7-5 17:45:19 | 显示全部楼层

回复 #1069 zxw 的帖子

中文提示忘了改了,,
回复

使用道具 举报

348#
发表于 2011-7-7 17:41:01 | 显示全部楼层
这个初始化的问题,很早就是这样子了,
下次再考虑添加代码启动的时候进行初始化。

刚看了一下,也没有什么比较好的位置放置初始化代码。算了,暂时还是保持原状吧。

因为如果把强制初始化的代码放在GRLDR主体程序中,则很容易破坏环境,比如configfile命令,将会导致重新初始化。

[ 本帖最后由 chenall 于 2011-7-7 17:52 编辑 ]
回复

使用道具 举报

349#
发表于 2011-7-8 17:12:31 | 显示全部楼层
把前几天的更改提交了,更新了一下。

请大家使用最新版进行测试。
回复

使用道具 举报

350#
发表于 2011-7-9 12:37:33 | 显示全部楼层

回复 #1089 不点 的帖子

一个疏忽,已经更正.
回复

使用道具 举报

351#
发表于 2011-7-9 23:04:09 | 显示全部楼层

回复 #1094 2011_dihuo0 的帖子

非标准的变量本来就是不受支持的。
set @var=xxxx 这个语句肯定会返回失败值。

当然这个@var变量也不会存在。

所以....

@zhaohj
我记得以前的某个版本有修改了这个情况的。对于map到(rd)是没有限制的,我查一下,看看是哪个版本又改到了。
试了下原来只有PXE会出现这种情况。

[ 本帖最后由 chenall 于 2011-7-9 23:09 编辑 ]
回复

使用道具 举报

352#
发表于 2011-7-10 00:57:37 | 显示全部楼层

回复 #1091 不点 的帖子

@不点

map_func以下的代码可能有问题。(在10206行)
如果目标是(pd)或其它的文件系统,并且刚好sector_count也等于1时就会出错。
例子:从pxe启动,test.txt文件小于或等于512字节

map --mem /test.txt (rd)
    if (start_sector == part_start /* && part_start */ && sector_count == 1)
    {
      if (mem != -1ULL)
      {
        char buf[32];

        grub_close ();
        sector_count = part_length;
        grub_sprintf (buf, "(%d)%ld+%ld", to, (unsigned long long)part_start, (unsigned long long)part_length);
        if (! grub_open (buf))
                return 0;
        filepos = SECTOR_SIZE;
      } else if (part_start) {
        sector_count = part_length;
      }
    }
回复

使用道具 举报

353#
发表于 2011-7-10 17:33:19 | 显示全部楼层
@zhaohj
%~d总是可以得到一个设备名。
为什么要得到一个空字符?如果只是为了一时的方便,建议使用其它方法解决。
回复

使用道具 举报

354#
发表于 2011-7-10 18:04:43 | 显示全部楼层
原帖由 不点 于 2011-7-10 08:08 发表
干得好,你找到毛病了。

当 sector 只有 1 个的时候,会被当作整个磁盘或者整个分区来处理。(pd) 之类的设备没有磁盘结构,所以,在试图解释为整个磁盘时,出现问题。

其实 pd 之类的设备也没有 part_sta ...


我刚修改上传了源码,解决方法如下。

增加part_length判断。
变成
if (part_length && start_sector == part_start ....

在real_partition_open函数中对于pd,ud之类的磁盘设置
part_length = 0;
回复

使用道具 举报

355#
发表于 2011-7-10 19:23:54 | 显示全部楼层

回复 #1104 zhaohj 的帖子

这个应该是WENV的原因吧,最近我所做的修改都和这个没有任何的关系。

你可以换下最近的几个版本,看看哪个版本开始这样子的。
回复

使用道具 举报

356#
发表于 2011-7-10 19:36:16 | 显示全部楼层

回复 #1107 zhaohj 的帖子

哦,那就是正常的了,如果没有指定分隔符,则默认的分隔符就是空格和制表符(tab)。

如果有指定分隔符,则只使用指定的分隔符。所以TAB也会是变量%I的一部份。
回复

使用道具 举报

357#
发表于 2011-7-11 14:30:10 | 显示全部楼层

回复 #1109 zhaohj 的帖子

因为exit 1会使得errnum的值大于0,以后的版本中会进行改进。

为了方便,下个版本准备添加简易的setlocal和endlocal命令。
用于保存、恢复当前环境
保存的内容暂定为如下
boot_drive;
install_partition;
saved_drive;
saved_partition;
saved_dir;
command_path;
还有变量;
回复

使用道具 举报

358#
发表于 2011-7-11 15:08:52 | 显示全部楼层
先传一个测试版。

刚整理的添加了setlocal和endlocal命令的版本。

setlocal和endlocal的用法和批处理类似。

具体使用方法请参考WINDOWS CMD批处理的帮助介绍。

注:只是简单的处理,执行一次setlocal太概需要占用0x8400字节内存,并且对执行的次数没有限制。
请尽量不要执行太多次的setlocal,否则可能会导致内存冲突。

另外在批处理中许行setlocal时(不管执行了几个,有没有全部endlocal),在批处理退出时会完全释放(和WINDOWS CMD下的一样)。
比如,以下批处理不会改动系统变量,里面的变量只有在批处理里面有效。
!BAT
setlocal
set aa=bb
setlocal
set aa=cc


对批处理比较熟悉的可以测试一下,会不会有什么问题。

[ 本帖最后由 chenall 于 2011-7-11 17:32 编辑 ]
回复

使用道具 举报

359#
发表于 2011-7-11 15:11:41 | 显示全部楼层

回复 #1112 zhaohj 的帖子

嗯,记录一下。

只要基本框架正常,其它就比较好说了。

另外需要说明的是setlocal之后用wenv设置的变量只有用wenv的方法才能读取,因为WENV不支持。
回复

使用道具 举报

360#
发表于 2011-7-11 16:57:05 | 显示全部楼层

回复 #1115 zhaohj 的帖子

是动态分配的。因为变量是直接整块复制的(这样比较简单),所以单单变量就需要65*512的内存。

懂得使用SETLOCAL的人才会需要用到,否则,嘿嘿....

一般情况下经常用WINDOWS批处理的会比较清楚情况。

[ 本帖最后由 chenall 于 2011-7-11 21:59 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-3 20:56

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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