无忧启动论坛

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

GRUB4DOS更新建议、bug反馈专帖

    [复制链接]
871#
发表于 2011-5-11 13:51:59 | 只看该作者
我觉得,如果 Roy 找不出 gcc 的问题,我也很难找出来。我对编译器的熟悉程度,比 Roy 差远了。

另外,看到 Roy 在用 ubuntu,忽然想到,也许是 ubuntu 的问题吧?新版的 ubuntu 似乎不如老版的 ubuntu 兼容性好。

我用 ubuntu 9.04,编译什么都很顺利。但是没有试验过 chenall 的外部命令。
回复

使用道具 举报

872#
发表于 2011-5-11 14:15:25 | 只看该作者
原帖由 不点 于 2011-5-11 13:51 发表
我觉得,如果 Roy 找不出 gcc 的问题,我也很难找出来。我对编译器的熟悉程度,比 Roy 差远了。

另外,看到 Roy 在用 ubuntu,忽然想到,也许是 ubuntu 的问题吧?新版的 ubuntu 似乎不如老版的 ubuntu 兼容 ...

我在 Debian Wheezy, ubuntu 10.04 LTS 都不正常。
倒是 ttylinux 12.5 (gcc 4.4.4, binutils 2.20) 下正常編譯外部指令。
回复

使用道具 举报

873#
发表于 2011-5-11 14:21:36 | 只看该作者
汇报一个现象

(ud)区启动实机,U盘识别为(hd0),进行一次磁盘交换,U盘变为(hd1),再用configfile (绝对路径)调用(ud)区的lst,不能成功,只能到命令行,按ESC也没反应。如再进行一次磁盘交换,U盘为(hd0),则正常。

请问这正常吗?
回复

使用道具 举报

874#
发表于 2011-5-11 14:33:26 | 只看该作者
原帖由 fdd_ds 于 2011-5-11 14:21 发表
汇报一个现象

(ud)区启动实机,U盘识别为(hd0),进行一次磁盘交换,U盘变为(hd1),再用configfile (绝对路径)调用(ud)区的lst,不能成功,只能到命令行,按ESC也没反应。如再进行一次磁盘交换,U盘为(hd ...


这个很正常,ud就是U盘的一部份,你把U盘的位置改掉了,它当然找不到了。
回复

使用道具 举报

875#
发表于 2011-5-11 15:27:28 | 只看该作者

回复 #876 2010roytam1 的帖子

对于 Linux 发行版来说,有些发行版的开发很活跃,这本身是好事。可是,由于开发者可能来自世界各地,有可能带来很难以排解的冲突( bug)。一个小软件,倒是比较容易排解 bug。但是像操作系统这样的综合软件,则很难排解 bug。假如还有那么一两个恶意的捣乱者,混入开发团队的话(我个人倾向于认为存在这种可能性,而且,如果不存在的话,反而不正常,在我看来),那就更不容易对付了。
回复

使用道具 举报

876#
发表于 2011-5-12 09:28:08 | 只看该作者
原帖由 不点 于 2011-5-11 15:27 发表
对于 Linux 发行版来说,有些发行版的开发很活跃,这本身是好事。可是,由于开发者可能来自世界各地,有可能带来很难以排解的冲突( bug)。一个小软件,倒是比较容易排解 bug。但是像操作系统这样的综合软件, ...

好了,問題解決了。又是 --build-id 的問題。objcopy 會把 .note.gnu.build-id 抄到新的 binary 中,這樣就把 binary 搞爛了。
要看看系統的 ld 有沒有支援 --build-id,可以用 "ld --help|grep build" 看,沒有的話要用 "NOBUILDID=1 ./build" 來編譯。
回复

使用道具 举报

877#
发表于 2011-5-12 10:19:19 | 只看该作者
汇报一个现象

(ud)区启动实机,U盘识别为(hd0),进行一次磁盘交换,U盘变为(hd1),再用configfile (绝对路径)调用(ud)区的lst,不能成功,只能到命令行,按ESC也没反应。如再进行一次磁盘交换,U盘为(hd0),则正常。

请问这正常吗?


chenall  #878楼 回复
这个很正常,ud就是U盘的一部份,你把U盘的位置改掉了,它当然找不到了。



谢谢!原来是我概念不清

但先find --set-root /boot/grub/xx.lst定位(屏显“(ud)“),再configfile /boot/grub/xx.lst加载,仍然只能到命令行。
回复

使用道具 举报

878#
 楼主| 发表于 2011-5-12 10:55:54 | 只看该作者
原帖由 2010roytam1 于 2011-5-12 09:28 发表

好了,問題解決了。又是 --build-id 的問題。objcopy 會把 .note.gnu.build-id 抄到新的 binary 中,這樣就把 binary 搞爛了。
要看看系統的 ld 有沒有支援 --build-id,可以用 "ld --help|grep build" 看, ...


问题解决了?
适合任何版本吗?
回复

使用道具 举报

879#
发表于 2011-5-12 11:13:05 | 只看该作者
原帖由 zhaohj 于 2011-5-12 10:55 发表


问题解决了?
适合任何版本吗?

沒錯,但還是只能在 Linux 下編譯。
./build 如遇上 /usr/bin/ld: unrecognized option '--build-id=none' 的話請用 "NOBUILDID=1 ./build" 編譯。
回复

使用道具 举报

880#
发表于 2011-5-12 15:29:31 | 只看该作者
@chenall
可否考虑在 grub4dos 被加载后就自动内置一个变量 ComSpec=builtin(或为空或变量不存在),默认为内部命令解释器
然后 grub4dos 不认识的命令都交给 shell 执行,这样任一个外部命令都可以将自己注册为 shell,写外部命令菜单时会较方便,中途可以随时更换shell

外部命令子命令和内部命令同名时,内部命令优先,需要执行用外部子命令时不能省略外部命令名
如:
set,不管 CompSpec 是否设置,它是内部命令
wenv set,外部命令
setx,交给 ComSpec 解释

注册 ComSpec 时,它是一个已加载的模块名,不需要路径,即外部命令需要先insmod后才能被注册为命令解释器
外部命令 insmod 后,命令本身被识别为内部命令

==========================================

之所以有这个想法,我想在wee基础上发起一个 MiniG4D 项目,它具有 grldr.mbr 的功能,再加上命令行和Chainloader(可能的话还有configfile),能控制在63扇区内就再好不过了,其它功能都靠外部命令来扩展,但这个目前还不是我一个人的能力能完成的,所以只能先想想知识储备够了有精力就可以开始。
这个模式看起来有点像grub2,但它不是,grub2目前跟grub4dos并不算兼容,而且它的结构不易控制体积。

目前g4d功能已经很强了,但大家常用的其实就那么几条命令,很多继承下来的命令都没什么用处,杂在里面看代码有点晕,这种模式不利于壮大开发队伍。只有grub4dos有了足够的普及率和影响力,才不怕硬件厂商设置障碍(假定不点的“阴谋论”成立,老实说我想不出硬件厂商这样做的利益点在哪里)

[ 本帖最后由 tuxw 于 2011-5-12 16:41 编辑 ]
回复

使用道具 举报

881#
发表于 2011-5-12 16:03:07 | 只看该作者
@fdd_ds
好像你还是没有明白。
交换磁盘之后(ud)里面的文件已经不可以访问了,(ud)文件列表能用那是因为缓存。

@tuxw
好像目前就是这样子的啊。insmod之后这个命令就相当于内部命令了。
回复

使用道具 举报

882#
发表于 2011-5-12 16:08:47 | 只看该作者
我的意思是可以让外部命令的子命令直接执行,如 wenv reset 可以直接 reset,这种模式就跟DOS的command.com一样了,用起来方便点
回复

使用道具 举报

883#
发表于 2011-5-12 16:25:54 | 只看该作者
哦,明白了。这个应该可以通过一个扩展命令列表来实现。

不过DOS的COMMAND.COM可以做到这样吗?我印像中是不行的吧。
回复

使用道具 举报

884#
发表于 2011-5-12 16:35:30 | 只看该作者
我不是说原理,意思是用法外观上,外部命令直接在dos环境下运行

支持这个结构后,以后可以通过不同的解释器来实现某个方向的功能包,比如有可能开发一个外部的图形处理命令集,而并不需要用类似  graphics sub-cmd 这样的结构,只要 insmod 就相当于 grub4dos 多了一些命令。感觉就像DOS的外部命令只要将文件放在 path 下,就可以直用

[ 本帖最后由 tuxw 于 2011-5-12 16:36 编辑 ]
回复

使用道具 举报

885#
发表于 2011-5-12 17:07:01 | 只看该作者
原帖由 tuxw 于 2011-5-12 16:08 发表
我的意思是可以让外部命令的子命令直接执行,如 wenv reset 可以直接 reset,这种模式就跟DOS的command.com一样了,用起来方便点

外部命令,目前可以通过insmod实现这种想法。可能tuxw 的意思,就是让外部命令的子命令也可直接执行。
回复

使用道具 举报

886#
发表于 2011-5-12 18:37:26 | 只看该作者
原帖由 zxw 于 2011-5-12 17:07 发表

外部命令,目前可以通过insmod实现这种想法。可能tuxw 的意思,就是让外部命令的子命令也可直接执行。

這樣要考慮子命令派送(Dispatch)的問題了。
/aaa 提供 /aaa abc 和 /aaa def 子命令
/bbb 提供 /bbb abc 和 /bbb def 子命令

insmod /aaa
insmod /bbb
之後 grub> abc 會是執行哪個的 abc 呢?
回复

使用道具 举报

887#
发表于 2011-5-12 19:27:59 | 只看该作者
我觉得,加载mycom,并设置变量 ComSpec=mycom之后,运行环境将切换成mycom提供的shell环境,在该环境使用的命令都应当由该shell环境提供,与内部命令的冲突也应当由该shell程序自己解决,其他外部命令应使用原有的方式直到把运行环境切换回grub4dos或者其他外部命令。

[ 本帖最后由 2011_dihuo0 于 2011-5-12 22:59 编辑 ]
回复

使用道具 举报

888#
发表于 2011-5-12 20:25:55 | 只看该作者
tuxw大校是希望wee和grub4dos以适当的方式支持第三方shell,以更方便的形式提供内部所不支持的功能,并且能够随时切换shell环境。第三方shell如果提供了与内部命令同名的命令,通常是对内部命令的修正或扩充,语法应当与内部命令兼容,此时执行的应当是第三方shell提供的命令,同时shell应当提供显式地执行内部命令的方法,例如在命令名后面加“_”或前面加“@”等,对于外部命令也应当提供与内部命令兼容的语法。
回复

使用道具 举报

889#
发表于 2011-5-14 07:18:18 | 只看该作者
grub4dos下加一个edit命令吗?类似于dos/cmd下的edit
回复

使用道具 举报

890#
发表于 2011-5-14 09:20:29 | 只看该作者
grub4dos没有edit命令,edit命令可能因为误写而破坏用户的数据,但是有write命令,大多数情况下已经够用了。

write
用法: write [--offset=SKIP] ADDR_OR_FILE INTEGER_OR_STRING
描述:

write a 32-bit value to memory or write a string to file(or device!).

使用 'write' 命令将字符串写入设备或文件中

write [--offset=SKIP] ADDR_OR_FILE INTEGER_OR_STRING

SKIP 是一个整数,默认值是 0 。

如果 ADDR_OR_FILE 选项被指定为一个整数,那么它被作为一个内存地址对待,并且 INTEGER_OR_STRING 选项也必须是一个整数值。

整数 INTEGER_OR_STRING 将被写入(ADDR_OR_FILE 加上 SKIP 值)的地址处。

如果 ADDR_OR_FILE 选项 指定的是一个设备或一个文件,那么 INTEGER_OR_STRING 选项将被作为一个字符串对待,

它将被写入跳过 SKIP 个字节(字节计数)的指定的设备或文件当中。



注: 1、字符串不需要被引用,也就是说,不需要单引号(') 也不用 双引号(") 来引用它。

2、空格符不需要使用反斜杠(\)引用。但如果字符串以空格开头,开头的这个空格符还是需要反斜杠引用。

3、单引号(')和双引号(")不用特别说明并且可以直接使用到字符串中。

4、下面是一些 C 语言风格的引用序列说明:

\NNN (1到3位)八进制值 NNN 表示的字符
\\ 反斜杠
\a 警报 (声音)
\b 退格符
\f 换页符
\n 换行符
\r 回车符
\t 水平制表符
\v 垂直制表符
\xHH (1到2位)十六进制值为 HH 的字节

注意:1、就像 dd 命令一样,write 命令既不扩大也不缩小目标文件的文件大小,字符串的剩余部分将被丢弃。目标文件也不能是一个压缩过的文件。

2、还是和 dd 类似,write 命令也具有危险性,使用风险你自己承担。作为一种安全方面的考虑,你应当只向内存中的文件写入。

3、某些情况下当写入 NTFS 中的文件时,write命令可能失败。

4、0.4.5版grub4dos不再限制在菜单中执行 write 命令来写入一个不是内存中的设备或者块文件。

     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     !!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!
     !!!! Caution! Both IF and OF can be a device name which stands for   !!!!
     !!!! all the sectors on the device. Take utmost care!                !!!!
     !!!!_________________________________________________________________!!!!
     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     警告!IF 和 OF 都可以是一个设备名,即它代表了设备上全部的扇区。慎之又慎

摘自 grub4dos-help-2011-05-04.chm
回复

使用道具 举报

891#
发表于 2011-5-14 16:37:00 | 只看该作者
批处理参数里 = 当参数分隔符处理的?

今天写个批处理,这样执行始终不正常
ghost.bat -clone,mode=pdump,src=1:1,dst=1:5\t.gho -z2 -sure
进去后=号信息没有了,没法还原命令行了
对这个特定的应用,还有办法恢复,ghost只有几个参数是带=的,其它情况就没办法恢复了


========
试了下,原来CMD也是这样处理的,这个有点麻烦。目前只有%9以前的参数是处理了=的,后面的则不会处理
想写个批处理与ghost.exe采用完全相同的语法和参数,转过去不好搞。主要是 -pwd 这个参数处理麻烦些,因为它有可参是带=号,也有可能没有=。

[ 本帖最后由 tuxw 于 2011-5-15 13:03 编辑 ]
回复

使用道具 举报

892#
发表于 2011-5-17 09:21:19 | 只看该作者
@tuxw
可以使用“”,“”之内的参数都算是一个。

另外关于SHELL的问题,我觉得与其让GRUB4DOS处理,还不如自己处理。
WENV也可以有自己的SHELL,比如执行WENV SH之后进入的SHELL就是WENV自己的SHELL,
这时的命令处理是完全就WENV来处理的。想怎么办就怎么办。

另外要实现一个SHELL就比较简单的。
1.获取用户的输入get_cmdline
2.命令处理器再处理上面输入的内容。
3.属于自己的命令由自己解释,不认识的直接丢给GRUB4DOS处理就行了。
回复

使用道具 举报

893#
发表于 2011-5-17 15:11:21 | 只看该作者
@chenall:
能否给cat 命令增加一个参数,设置搜索范围的最大偏移?若超过该偏移就不再搜索。
假设该参数是--count:
cat --locate=\xEB\x3C  --count=0xA --number=1  (hd0,0)/boot/grub/file
意即搜索file开始10个字节内是否有16进制的EB3C字节。

当然也可以:
cat --locate=\xEB\x3C  --number=1  (hd0,0)/boot/grub/file | set tmp=
然后再判断tmp的值,可以得到想要的结果。
但当tmp的值很大时,无疑会花相当多的时间来搜索获取这个值,有点不划算。

[ 本帖最后由 zxw 于 2011-5-17 15:31 编辑 ]
回复

使用道具 举报

894#
发表于 2011-5-17 20:05:25 | 只看该作者
很早之前就已经有了
--length参数指定要查找的文件长度。
回复

使用道具 举报

895#
发表于 2011-5-17 21:42:10 | 只看该作者

回复 #898 chenall 的帖子

我原先认定--length参数能达到这个要求。但这个长度,与我建议的长度有区别,请看图:



第一条命令,返回B;而我建议的是最多搜索到0x4处即为停止。

[ 本帖最后由 zxw 于 2011-5-17 22:00 编辑 ]
回复

使用道具 举报

896#
发表于 2011-5-17 21:52:59 | 只看该作者
原帖由 zxw 于 2011-5-17 21:42 发表
我原先认定--length参数能达到这个要求。但请看图:

121568

第一条命令,返回B,显示超出--length所控制的范围了。


因为查找是以16个字节为基数的,所以最好是16的倍数。

我记得之前曾经尝试过修正这个情况的,改天抽空再看一下。
回复

使用道具 举报

897#
发表于 2011-5-17 23:14:17 | 只看该作者

回复 #900 chenall 的帖子

查找是以16个字节为基数

哦,原来是这样,为此迷糊了一阵时间。这样就理解了,期待更精确的控制。
回复

使用道具 举报

898#
发表于 2011-5-18 10:21:48 | 只看该作者
弱弱的问下:

在有多个(hd)设备时,需要让 find 在指定查找范围,该何编写?谢谢!

例如:

--------在(hd2)下查找/xxx/123.123    即:分区号不定; 类似:find (hd2,?)/xxx/123.123

--------在 5 分区下查找/xxx/123.123   即,设备号不定; 类似:find (hd?,5)/xxx/123.123
回复

使用道具 举报

899#
发表于 2011-5-18 11:44:35 | 只看该作者
原帖由 fdd_ds 于 2011-5-18 10:21 发表
弱弱的问下:

在有多个(hd)设备时,需要让 find 在指定查找范围,该何编写?谢谢!

例如:

--------仅在(hd2)下查找/xxx/123.123    即:分区号不定; 类似:find (hd2,?)/xxx/123.123

--------仅 ...


目前不支持,也许以后会支持。

http://bbs.znpc.net/viewthread.php?tid=6098&extra=page%3D2
回复

使用道具 举报

900#
发表于 2011-5-18 13:46:06 | 只看该作者
谢谢 C大 回复!


再请问下:

在有多个(hd)设备条件下,将任意分区下,唯一存在/xxx/123.123 的(hd)设备,映射成(hd0),该如何编写?

谢谢!
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-25 03:14

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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