无忧启动论坛

标题: 关于 grldr 的大小问题——pauly请进 [打印本页]

作者: 2011barry    时间: 2011-2-26 05:36
标题: 关于 grldr 的大小问题——pauly请进
GRUB4DOS无疑是一款优秀的引导管理器。
不过有个问题一直没有弄明白。
原版的 grldr 文件大小是 217kB。如果要做内置菜单,也必须保证这个文件的大小不变,否则不能启动。这个也很好理解。
但是在论坛上看到有人做的 grldr 的大小却是 245kB。(地址 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=174621&extra=page%3D1
谁能解释一下?

[ 本帖最后由 2011barry 于 2011-2-26 07:50 编辑 ]
作者: sratlf    时间: 2011-2-26 10:58
http://code.google.com/p/grub4dos-chenall/downloads/list
作者: 不点    时间: 2011-2-26 11:06
GRLDR 的代码确实不能用十六进制编辑器改变,但考虑到大家使用的方便快捷,GRLDR 的结构曾经进行过调整,把内置菜单放在程序的尾部,而且是文本格式,这样就可以用十六进制编辑器徒手修改。菜单的长度是可变的,你可以放置很长的菜单,不过,真正起作用的只有菜单开头的 4K,多余的字节将被忽略。安全起见,要记住在菜单的结尾处放置一个 00 字节。

GRLDR 文件的大小是随着版本的不同而变化的。目前的 GRLDR 甚至有 270K 之大。
作者: freesoft00    时间: 2011-2-26 12:36
安全起见,要记住在菜单的结尾处放置一个 00 字节。

最后一行打一个空格就可以了吧?
作者: chenall    时间: 2011-2-26 13:36
原帖由 freesoft00 于 2011-2-26 12:36 发表

最后一行打一个空格就可以了吧?


最好是00,空格并不代表结束...

如果尾部没有结束符"\0",并且刚好对应的内存里面有数据,则这些有可能会被当成菜单的一部份进行处理..

从而引发一些奇怪的问题...
作者: lvmenbo    时间: 2011-2-26 16:34
我的grldr就有270k 00以前倒是不知道要放 现在知道了 感谢c大
作者: xianglang    时间: 2011-2-26 17:16
我一直用jianliulin(我一直误以为是LIANGJIANG,汗……)做的GRLDR_Editer来修改内置菜单,刚才查看了一下,修改后的GRLDR文件结束处并没有00字节,却是两个0D0A,不知道有没有影响?

[ 本帖最后由 xianglang 于 2011-2-27 23:14 编辑 ]
作者: chenall    时间: 2011-2-26 18:12
一般情况下是没有什么影响的,因为计算机开机的时候内存都被初始化了.

使用00截断,可以保证即使内存没有初始化也可以正常..

具体的你可以自己多试试,在进入GRLDR之后修改一下内置菜单尾部处的内存内容.然后再次启动GRLDR
也许你就会碰到问题了..

实际上发现问题的几率很小.使用00只是为了以防万一.
作者: 2011barry    时间: 2011-2-26 20:44
多 谢 不 点 大 师
作者: freesoft00    时间: 2011-2-26 21:27
是这样吗,如果是发现论坛里面有些都没有加。

作者: 不点    时间: 2011-2-26 21:44
标题: 回复 #10 freesoft00 的帖子
00 可不是一般的文本,它是指一个十六进制的值,代表的是一个字符,而不是两个 0 字符。

你用的软件应该会为你自动添加这个 00 字节在尾部的(如果它没有自动添加,你可以要求这个软件的作者去修改这个软件)。

而你手动添加的这两个 0 字符会被grub4dos当作一条非法的命令来处理的。
作者: Plantsoot    时间: 2011-2-26 21:52
如果软件没加,自己用winhex手工加一下吧。
作者: freesoft00    时间: 2011-2-26 22:22

恩,天使的这个菜单没有00结尾,grub的官方样例菜单有00结束。
而pauly的bootice编辑过的grub文件也没有00结尾。
作者: 2011rabbit    时间: 2011-2-26 22:23
后面 打一个 回车 保存就可以
作者: freesoft00    时间: 2011-2-26 22:28
打一个回车的话,在bootice是添加到0D 0A
作者: 不点    时间: 2011-2-26 22:48
严格来说,0D 是回车,0A 是换行。

0D 0A 合在一起,叫做“回车换行”。

其实,对于 grub4dos 的命令来说,“回车换行” 可以用一个“换行”来代替。也就是说,只要有 0A 就行了。

因此,你可以在菜单的尾部(在 十六进制编辑器中)这样写:

0A 00

也就是一个换行,加上一个 NULL 字节。所谓 NULL 字节就是其 ASCII 码等于 0 的字节。
作者: Pauly    时间: 2011-2-27 10:04
标题: 回复 #16 不点 的帖子
原来末尾还要添加 00 啊,下次要修改一下,感谢不点指出这个问题
作者: pseudo    时间: 2011-2-27 16:35
标题: 也说回车、换行、空格
0D是回车,0A是换行。C语言里分别用'\r'和'\n'表示。加上\表示转义,即不作字符r、n解。

回车、换行大概是英文打字机时代的术语。从屏幕显示角度看,
换行就是使光标跑到下一行的同一列,'\n'跟英文单词newline(新的行)首字母有关。
回车就是使光标返回本行行首,'\r'跟英文单词return(返回)的首字母有关。
回车换行合起来,就是使光标跑到下一行的行首。

作为两行之间的间隔符,其实理应只要换行就够了。
类UNIX的风格就是如此,认为回车跟换行是两种大不相同的东西,严格区分。大多只使用换行。

而dos/windows风格惯于使用回车+换行作为两行之间的间隔。只接触windows的人许多分不清它们。
当你用记事本打开0PE的菜单文件MENU.0PE,或者打开grub4dos官方提供的menu.lst文件(grub4dos-0.4.5b-2011-02-20.7z里有)时,你会看到每行都很长,似乎没分行。其实这就是UNIX风格跟DOS风格的差异。

J大曾经提供一个操作简单的grldr 内置菜单编辑工具 ,很好用,使用者众。但它是按dos/windows风格处理换行的。
早期grub4dos的菜单普遍很短,自从0PE发明程式菜单的用法,将菜单当程序来写后,菜单一下子变得很长。
0PE的grldr内置菜单一度差几个字节就达到4096字节的上限。我已经不说4KB(大约4000字节)了,我按字节来精打细算,96这个尾数也不放过。

那么,用这个工具打开grldr,哪怕不做任何修改,只保存一下,就出问题了,因为它把原来菜单里的换行符,全部换成回车换行了,就是说,每行多出一个回车字符。这下就超过4096字节了,结果菜单被截断,PE启动不了。

这个也不算是J大的错,是UNIX、windows风格的差异,还有就是出现这么长的菜单恐怕出乎许多人,包括不点、J大的预料吧。
要是普通短菜单,即使加入些回车符也离4KB上限远着呢。

目前修改grldr内置菜单,个人推荐用J大的fbinsttool工具,它也是上述工具的升级版。如果是制作菜单,则用批处理调用grubmenu为好。

至于空格,它的十六进制编码为20,与编码为00的“空”字符(C语言里好像用'\0'表示)不同。后者经常用作结束标志。

我最近弄个工具USB_ACC,就遇到一个跟空格有关的问题,
我想写
  1. goto FREE
复制代码

却笔误写成
  1. goto FREE
复制代码

结果因为找不到标号,导致标号FRRE处代码没被执行,运行效果不如意。
我一般写东西只是看看,很少实际调试的,因为许多分支情况很难遇到,只能尽量把代码写对。
但我看了很多遍都没看出问题。
作者: tubaozi    时间: 2011-2-27 16:51
原帖由 pseudo 于 2011-2-27 16:35 发表



这两个有区别吗?看不出来。莫非是两个的“空格”不同???
作者: eaglefly    时间: 2016-10-13 19:23
一个用20表示,一个用00了吧




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3