无忧启动论坛

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

GRUB4DOS更新建议、bug反馈专帖

    [复制链接]
1081#
发表于 2011-7-7 17:41:01 | 只看该作者
这个初始化的问题,很早就是这样子了,
下次再考虑添加代码启动的时候进行初始化。

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

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

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

使用道具 举报

1082#
 楼主| 发表于 2011-7-8 00:11:27 | 只看该作者
今天一不小心,在P处理中goto跳转,如:
:start
...
goto :start
----------
我在goto :start后面加了一个空格,跳转失败。
我认为这要处理一下。
回复

使用道具 举报

1083#
发表于 2011-7-8 10:58:12 | 只看该作者

nt5x增加grub4dos启动项的建议

nt5x系统增加grub4dos启动项需要在boot.ini中增加如下内容:
    c:\grldr="Start GRUB4DOS"
个人理解,这里的c:就是第1硬盘的主分区,而并非逻辑分区C(这是尚未加载系统,还未确定盘符吧?),所以,grldr必须位于第1硬盘的主分区根目录下。
建议修改为支持将grldr放在任意分区任意目录下,且能支持在boot.ini中指定menu.lst,如:
    multi(0)disk(0)rdisk(0)partition(2)\mygrub\grldr="Start GRUB4DOS" --mymenu.lst
回复

使用道具 举报

1084#
发表于 2011-7-8 17:12:31 | 只看该作者
把前几天的更改提交了,更新了一下。

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

使用道具 举报

1085#
发表于 2011-7-9 05:32:43 | 只看该作者
新版有问题。

ubuntu 的菜单上经常有一个 quiet 命令,这条命令应该忽略,也就是说,执行这样的命令,应该返回 errnum= 0,而不是返回一个错误。

如果返回 errnum != 0,那么无法兼容 ubuntu 的菜单了。7月8日之前是正常的,只有 7月8日的版本有此问题。
回复

使用道具 举报

1086#
发表于 2011-7-9 12:37:33 | 只看该作者

回复 #1089 不点 的帖子

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

使用道具 举报

1087#
发表于 2011-7-9 19:32:59 | 只看该作者

回复 #1090 chenall 的帖子

刚才测试过了,已经正常。
回复

使用道具 举报

1088#
 楼主| 发表于 2011-7-9 19:37:13 | 只看该作者
一个很小的文件,比如小于512字节的文件,下面语言会出错:
map --mem=0xb000 /srs/sif/txtsetup.sif (rd)

因为不知道文件大小,放到内存中中转一下COPY比较快。

================
经过测试,小于512字节会出错,大于512正常。

[ 本帖最后由 zhaohj 于 2011-7-9 19:40 编辑 ]
回复

使用道具 举报

1089#
发表于 2011-7-9 21:47:29 | 只看该作者
前面我提到的非标准变量的问题,经过再次测试,发现一种不正常情况,代码如下:
set @var=@var
set var=%@var%
if exist var  echo exist
而现在内部变量都正常。其他情况我尚未测试。这不影响使用可以忽略。
回复

使用道具 举报

1090#
发表于 2011-7-9 21:54:24 | 只看该作者
前面我提到的非标准变量的问题,经过再次测试,发现一种不正常情况,代码如下:
set @var=@var
set var=%@var%
if exist var  echo exist
而现在内部变量都正常。其他情况我尚未测试。这不影响使用可以忽略。
回复

使用道具 举报

1091#
发表于 2011-7-9 23:04:09 | 只看该作者

回复 #1094 2011_dihuo0 的帖子

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

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

所以....

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

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

使用道具 举报

1092#
发表于 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;
      }
    }
回复

使用道具 举报

1093#
发表于 2011-7-10 08:08:52 | 只看该作者

回复 #1096 chenall 的帖子

干得好,你找到毛病了。

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

其实 pd 之类的设备也没有 part_start 和 part_length 这样的概念,所以,可以通过设定特殊的 part_start 让条件不成立,这就可以跳过这段程序了。或者干脆直接加上判断设备类型的条件,如果是 pd 之类的,就不再执行这段程序。

具体怎么做,你可以试试。
回复

使用道具 举报

1094#
 楼主| 发表于 2011-7-10 12:09:36 | 只看该作者
对%~d1有点疑问:
按我的理解,象这样的路径是绝对路径,如:
(bd)/boot/srs/
()/boot/srs/
(pd)/boot/srs/

/boot/srs/应该没有盘符的
----------------

Snap1.jpg (20.8 KB, 下载次数: 119)

Snap1.jpg
回复

使用道具 举报

1095#
发表于 2011-7-10 13:03:53 | 只看该作者

回复 #1098 zhaohj 的帖子

糊涂了吧?此时,%~d1为root设备。
回复

使用道具 举报

1096#
 楼主| 发表于 2011-7-10 13:33:17 | 只看该作者
原帖由 zxw 于 2011-7-10 13:03 发表
糊涂了吧?此时,%~d1为root设备。


%~d1为root设备的理解也正确,从当前设备取值。
但从需求上来说,更偏向不带(*)的路径是没有盘符的。

你们都没有错,我只提出点想法。

扩展一下也可以,如:%~D1
/test/test.bat /boot/srs/

得到:
%~d1=(pd)
%~D1=

[ 本帖最后由 zhaohj 于 2011-7-10 13:42 编辑 ]
回复

使用道具 举报

1097#
发表于 2011-7-10 17:28:04 | 只看该作者

回复 #1095 chenall 的帖子

原帖由 2011_dihuo0 于 2011-7-1 14:35 发表
在变量名中也可以使用特殊字符,只是有一些限制。
  受内部变量%@root%,%@path%,?_uuid的启发,我猜测在变量名中也可以使用特殊字符,经测试我发现:
   (1)变量名的第一个字符可以是@?`~[]{}|等字符,set无法显示以@?开头的变量,
   (2)在变量名中还可以使用<.>/等字符,
   (3)除内部变量外,以@开头的变量事实上是存在的,但是它们的值永远为空,无论你如何设置都不管用,即"%@variable%"将被替换成"",其他的变量都正常。变量不存在和变量的值是空值在语义上还是有所区别的,例如如果@variable不存在,那么echo "%@variable%"执行的结果将是"%@variable%",而如果@variable的值为空,那么echo "%@variable%"执行的结果将是""。
   (4)if命令的子命令exist无法识别非标准的变量名,甚至是内部变量也无法识别,即if exist @root echo @root exist ! echo @root not exist的执行结果始终是@root not exist
  现在我可以说,变量命中不准使用特殊符号只是一个编程规范,而不是语法的强制要求。

我正在测试其他情况,如果没问题就完全可以忽略它。
回复

使用道具 举报

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

使用道具 举报

1099#
发表于 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;
回复

使用道具 举报

1100#
 楼主| 发表于 2011-7-10 18:36:23 | 只看该作者
新版本引入了新的bug,估计是处理空格字符引起的,导致WENV判断失误
下面文件是(fd1)/oem
id        =        "PCI\VEN_104B&DEV_1040", "VMscsi"
------------
WENV for /f "tokens=1-3 delims==," %i in ( (fd1)/OEM ) do (set a=$u,%i ; set b=%u,%j ; set c=%k ; check $${a)==ID echo $${b}=$${c})
结果b="PCI\VEN_104B&DEV_1040"   <---前面有空格导致的
      c=VMscsi                                  <--前面没有空格正常
---------------
经过测试,空格是tab键空格

[ 本帖最后由 zhaohj 于 2011-7-10 19:24 编辑 ]

Snap1.jpg (15.05 KB, 下载次数: 114)

Snap1.jpg
回复

使用道具 举报

1101#
发表于 2011-7-10 18:41:22 | 只看该作者
来自 bootland 的反馈说,时空论坛上有关 lbacache 的问题已经解决。可以更新 svn 了。
回复

使用道具 举报

1102#
发表于 2011-7-10 19:23:54 | 只看该作者

回复 #1104 zhaohj 的帖子

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

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

使用道具 举报

1103#
 楼主| 发表于 2011-7-10 19:26:16 | 只看该作者
原帖由 chenall 于 2011-7-10 19:23 发表
这个应该是WENV的原因吧,最近我所做的修改都和这个没有任何的关系。

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


测试过了,是wenv的问题,不会去掉tab键空格。wenv把tab键空格作为字符处理了。
回复

使用道具 举报

1104#
发表于 2011-7-10 19:36:16 | 只看该作者

回复 #1107 zhaohj 的帖子

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

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

使用道具 举报

1105#
 楼主| 发表于 2011-7-11 12:00:56 | 只看该作者
下面的菜单是运行一个P处理后做下一步:
title TEST Bat command “exit 1"
/boot/test.bat
echo Bat command already finish
commandline
--------------------------
test.bat 内容:
!BAT
echo test
exit 1
-------------------
选中菜单后运行
出现:
command /boot/test.bat
press any key to  continue...

按任何键直接返回到原菜单,而没有执行下面两个命令。
----------------------
也就是说,P处理中的exit 1命令会跳过菜单中后续的命令。
回复

使用道具 举报

1106#
发表于 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;
还有变量;
回复

使用道具 举报

1107#
发表于 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 编辑 ]
回复

使用道具 举报

1108#
 楼主| 发表于 2011-7-11 15:09:20 | 只看该作者
原帖由 chenall 于 2011-7-11 14:30 发表
因为exit 1会使得errnum的值大于0,以后的版本中会进行改进。

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


哇,这样太好了。
1:启动设备(bd)  0x8280,0x8208
2:当前设备()     0x82a0,0x829c
3:当前目录,这个不常用,一般都用根
4:@path
5:变量 (md)0x228+65

另外,把debug状态也保存一下。
回复

使用道具 举报

1109#
发表于 2011-7-11 15:11:41 | 只看该作者

回复 #1112 zhaohj 的帖子

嗯,记录一下。

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

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

使用道具 举报

1110#
发表于 2011-7-11 15:17:09 | 只看该作者
呵,真是太好了,这个要支持。
建议terminal的状态也保存一下。

[ 本帖最后由 zxw 于 2011-7-11 15:30 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-24 02:32

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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