无忧启动论坛

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

[求助] 关于 grldr 的大小问题——pauly请进

[复制链接]
跳转到指定楼层
1#
发表于 2011-2-26 05:36:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GRUB4DOS无疑是一款优秀的引导管理器。
不过有个问题一直没有弄明白。
原版的 grldr 文件大小是 217kB。如果要做内置菜单,也必须保证这个文件的大小不变,否则不能启动。这个也很好理解。
但是在论坛上看到有人做的 grldr 的大小却是 245kB。(地址 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=174621&extra=page%3D1
谁能解释一下?

[ 本帖最后由 2011barry 于 2011-2-26 07:50 编辑 ]
2#
发表于 2011-2-26 10:58:39 | 只看该作者
回复

使用道具 举报

3#
发表于 2011-2-26 11:06:03 | 只看该作者
GRLDR 的代码确实不能用十六进制编辑器改变,但考虑到大家使用的方便快捷,GRLDR 的结构曾经进行过调整,把内置菜单放在程序的尾部,而且是文本格式,这样就可以用十六进制编辑器徒手修改。菜单的长度是可变的,你可以放置很长的菜单,不过,真正起作用的只有菜单开头的 4K,多余的字节将被忽略。安全起见,要记住在菜单的结尾处放置一个 00 字节。

GRLDR 文件的大小是随着版本的不同而变化的。目前的 GRLDR 甚至有 270K 之大。
回复

使用道具 举报

4#
发表于 2011-2-26 12:36:47 | 只看该作者
安全起见,要记住在菜单的结尾处放置一个 00 字节。

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

使用道具 举报

5#
发表于 2011-2-26 13:36:29 | 只看该作者
原帖由 freesoft00 于 2011-2-26 12:36 发表

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


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

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

从而引发一些奇怪的问题...
回复

使用道具 举报

6#
发表于 2011-2-26 16:34:50 | 只看该作者
我的grldr就有270k 00以前倒是不知道要放 现在知道了 感谢c大
回复

使用道具 举报

7#
发表于 2011-2-26 17:16:35 | 只看该作者
我一直用jianliulin(我一直误以为是LIANGJIANG,汗……)做的GRLDR_Editer来修改内置菜单,刚才查看了一下,修改后的GRLDR文件结束处并没有00字节,却是两个0D0A,不知道有没有影响?

[ 本帖最后由 xianglang 于 2011-2-27 23:14 编辑 ]
回复

使用道具 举报

8#
发表于 2011-2-26 18:12:32 | 只看该作者
一般情况下是没有什么影响的,因为计算机开机的时候内存都被初始化了.

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

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

实际上发现问题的几率很小.使用00只是为了以防万一.
回复

使用道具 举报

9#
 楼主| 发表于 2011-2-26 20:44:46 | 只看该作者
多 谢 不 点 大 师
回复

使用道具 举报

10#
发表于 2011-2-26 21:27:09 | 只看该作者
是这样吗,如果是发现论坛里面有些都没有加。
回复

使用道具 举报

11#
发表于 2011-2-26 21:44:13 | 只看该作者

回复 #10 freesoft00 的帖子

00 可不是一般的文本,它是指一个十六进制的值,代表的是一个字符,而不是两个 0 字符。

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

而你手动添加的这两个 0 字符会被grub4dos当作一条非法的命令来处理的。
回复

使用道具 举报

12#
发表于 2011-2-26 21:52:13 | 只看该作者
如果软件没加,自己用winhex手工加一下吧。
回复

使用道具 举报

13#
发表于 2011-2-26 22:22:21 | 只看该作者

恩,天使的这个菜单没有00结尾,grub的官方样例菜单有00结束。
而pauly的bootice编辑过的grub文件也没有00结尾。
回复

使用道具 举报

14#
发表于 2011-2-26 22:23:36 | 只看该作者
后面 打一个 回车 保存就可以
回复

使用道具 举报

15#
发表于 2011-2-26 22:28:55 | 只看该作者
打一个回车的话,在bootice是添加到0D 0A
回复

使用道具 举报

16#
发表于 2011-2-26 22:48:34 | 只看该作者
严格来说,0D 是回车,0A 是换行。

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

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

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

0A 00

也就是一个换行,加上一个 NULL 字节。所谓 NULL 字节就是其 ASCII 码等于 0 的字节。
回复

使用道具 举报

17#
发表于 2011-2-27 10:04:54 | 只看该作者

回复 #16 不点 的帖子

原来末尾还要添加 00 啊,下次要修改一下,感谢不点指出这个问题
回复

使用道具 举报

18#
发表于 2011-2-27 16:35:51 | 只看该作者

也说回车、换行、空格

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处代码没被执行,运行效果不如意。
我一般写东西只是看看,很少实际调试的,因为许多分支情况很难遇到,只能尽量把代码写对。
但我看了很多遍都没看出问题。
回复

使用道具 举报

19#
发表于 2011-2-27 16:51:30 | 只看该作者
原帖由 pseudo 于 2011-2-27 16:35 发表



这两个有区别吗?看不出来。莫非是两个的“空格”不同???
回复

使用道具 举报

20#
发表于 2016-10-13 19:23:30 | 只看该作者
一个用20表示,一个用00了吧
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-30 19:44

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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