|
写在前面的话
经过多次修改,我所能找到的错误基本上已经都修正了。为了方便大家纠错,本文已经发到wiki百科上,地址是zh.wikipedia.org/wee。wiki百科是人人都可以修改的,有人发现了错误可能直接修改,而不回来本帖通知,因此, wiki百科可能更正确,更权威。建议大家直接去wiki百科。
wee最新版的下载地址是:
http://code.google.com/p/grubutils/downloads/list
————————正文开始————————
asm
asm命令用来提供与dos里debug相类似的功能。
语法:
asm [地址] db [字节] [字节] ...
asm [地址] go
1. asm [地址] db [字节] [字节] ...
“地址” 和 “字节”都是整数。
如果存在“地址”参数,则从“地址”处开始汇编。如果不存在“地址”参数,则从当前汇编地址开始汇编。系统初始的默认汇编地址是在地址 16M 处。每执行汇编一条指令,当前汇编地址指针会随着发生变动。
“字节”参数主要意图是用来编写机器指令,只有最低的字节起作用,其余的高位字节都被忽略。
2. asm [地址] go
如果存在“地址”参数,则从“地址”开始运行汇编程序。如果不存在“地址”参数,则从地址 16M 处开始运行汇编程序。
==============
asm 命令只实现了必要的 db 和 go 子命令。真正的汇编指令,一个也没有实现。其实,由于 wee 的空间紧张,也确实无法实现了。需要等以后腾出空间了再实现。
db 伪指令可以实现机器码的编程。这对于熟悉机器码的人是有用的。
==============
注:
1. 汇编默认的地址正好是外部命令运行时的代码空间。如果运行外部命令,就毁掉了你的汇编程序。所以,汇编期间,不要执行外部命令。
2. 在执行 go 之前,应该用 hexdump 命令检查汇编代码是否正常。否则,盲目地执行 go,有可能发生死机。
3. 你的程序应该保护所有的寄存器,最后用一条 ret 指令返回到 wee 的环境下。
4. 尤其要注意堆栈,不可有丝毫差错,否则就要死机。
5. 作为 asm 命令的应用,你可以调用 wee 的 API。不过,目前你得自己用 db 来写机器码,而且要熟悉各个 API 的调用格式。
http://bbs.znpc.net/viewthread.php?tid=6107
示例:
asm 0x1000000 db 0xC3
asm go
#这个程序很简单,只有一个 ret 指令( C3 就是 ret),什么也不做,立即返回。
————————————————————————————————
command
command命令用来执行外部可执行文件。
语法:
command [FILE [ARGS]]
wee不再需要 chainloader 和 kernel 命令了,取而代之的是用 command 本身的功能。command 命令把可以引导的文件(示例如单扇区文件、NTLDR、IO.SYS、vmlinuz 等)都当作可执行文件来对待了。单单在命令行之下敲入 ntldr、 io.sys或者 vmlinuz 等,就可以启动相应的文件了,它们已经是wee的可执行程序了。这就是说,启动那些不同的格式,有了统一的调用方式,不再像以前那样分为 chainloader 和 kernel 两个不同的类别了。
http://bbs.znpc.net/viewthread.php?tid=5838&page=7&fromuid=12697#pid44230
注:
1. command 命令不支持 --set-path 参数。默认时,使用当前当前目录作为命令文件的路径。如果未找到,将提示 wee 17>。
2. 菜单文件不是可执行文件。
3. 在wee中也没有boot命令,command命令将立即执行,不再需要附加boot命令了。
4. wee支持 FAT、NTFS,EXT2/3/4文件系统。
示例1:
#启动linux
command (hd0,0)/vmlinuz (hd0,0)/initrd.img root=UUID=XXXXXXXXXXXXX ro quiet splash acpi=noirq
#注意,由于这不是 chainloader 启动的,所以,你需要在 vmlinuz 之后紧跟一个 initrd.img,然后才是命令行的其他参数。
#command 命令将同时加载两个文件到内存,一个是 vmlinuz,一个是 initrd.img。加载成功以后,把控制交给 vmlinuz。
http://bbs.znpc.net/viewthread.php?tid=5838&page=7&fromuid=12697#pid44101
示例2:
#启动mbr
(hd0)+1
示例3:
#启动dbr
(hd0,0)+1
————————————————————————————————
default
default命令用来设置默认启动的菜单项
default NUM
设置默认启动的菜单项为 NUM 号菜单。
注:
第一项菜单是0号菜单。
————————————————————————————————
exit
exit将立即终止当前命令的运行,将控制返回给调用者。
语法:
exit
当一个外部命令调用内部的命令处理器进入命令行手动输入命令的时候,如果没有 exit 命令,则永远无法退回到外部命令中。有了 exit 命令,当前的命令处理就可以结束了,控制可以回到调用者。
在wee和grub4dos中,每个命令都会返回一个ERRNUM。成功返回 0,如果返回一个非 0 值,通常情况下都会被认为是一个错误码,每个ERRNUM值都有特定的含义,详情请参阅grub4dos.h c/c++或bash的相关文档。一个编写良好的命令,程序,和工具都应当返回一个 0 来表示成功。
将来,wee可能会提供脚本功能。脚本中的函数和脚本本身都会返回ERRNUM。在脚本或者是脚本中的函数中执行的最后的命令会决定ERRNUM。
注:
在wee命令行中,提示符wee和>之间的数字就是上一个命令的错误码。
示例:
wee 0>echo
#echo是外部命令,如果当前目录下不存在echo,那么提示符将是:
wee 17>
————————————————————————————————
find
本命令用来查找符合条件的文件或分区。
语法:
find [--set-root] [--active] [FILENAME] [CONDITION]
1. 参数 --set-root,找到第一个匹配后马上停止,并且把该设备设为根设备。
2. 参数 --active,查找激活的主分区。grub4dos的find没有此参数。
3. CONDITION 是一个返回值是 true 或者 false 的命令。
注:
违反直觉的是,0代表true,非0代表false,但是却符合脚本语言的内部逻辑,大多数脚本也都是这么规定的。
示例 1:
find
这会列举所有的硬盘分区,软驱和 (cd) 等。
示例 2:
find +1
这会列举文件系统已知的所有设备。
————————————————————————————————
hexdump
本命令用来显示内存数据。
语法:
hexdump [地址] [长度]
地址和长度都是整数,以字节计算。
如果在一个命令行的开头按下 Delete 键,则此时也会执行 hexdump 命令。因此,可以认为 Delete 键是 hexdump 的快捷键。
————————————————————————————————
map
本命令是一个简单的设备映射命令
语法:
map (FROM_DRIVE) (TO_DRIVE) [--hook] [--unhook]
1. --hook 参数表示仿真立即生效,即使是在命令行模式中。
2. --unhook 参数仅仅是断开 INT13 的挂钩(在中断矢量表中),它不会影响到驱动器映射表。
map命令不支持--rehook,建议使用--unhook参数,并自行恢复驱动器映射表.
另外,127扇区版的wee127.mbr 之中所实现的 map 命令,几乎与 grub4dos 里面的 map 完全一样只有两点差别:
1. 不支持加载到 4G 以上。
2. 不支持加载压缩的映像(gz,lzma)格式。
注:
wee不支持从 iso9660 光盘文件系统中启动,因此,wee不能用作 ISO 的启动引导程序。
http://bbs.znpc.net/viewthread.php?tid=5838&page=19&fromuid=12697#pid47891
示例1:
map (hd0) (hd1)
map (hd1) (hd0)
map --hook
示例2:
map --unhook
map (hd0) (hd0)
map (hd1) (hd1)
map --hook
————————————————————————————————
pause
暂停,按任意键后继续。
语法:
pause [MESSAGE]
暂停,按任意键后继续。如果有MESSAGE,则把它输出到屏幕上
注:
pause命令不支持--wait参数。
示例1:
pause This is a test。
This is a test。
#按任意键后继续
————————————————————————————————
root
设置并加载根设备。
语法:
root [DEVICE_OR_PATH]
将指定设备(DEVICE_OR_PATH)设置为根设备,然后尝试挂接该分区以得到分区大小。
注:
根设备和根目录是两个容易混肴,但是实际上不同的两个概念。
示例:
root (hd0,0)/boot/grub
#这条命令执行之后,根设备是(hd0,0)/boot/grub,而根目录是(hd0,0)/boot/grub/,两者相似但是还是有一些细微的差别。
————————————————————————————————
rootnoverify
设置但不加载根设备。
rootnoverify [DEVICE]
类似 'root' 指令, 但不试图安装该设备。这用于有些系统装在 wee 不能访问的磁盘分区之上, 但仍需要设置正确的根分区的情况。有些需要安装分区才能确定的参数可能会有问题。
————————————————————————————————
timeout
timeout SEC
设置在自动启动缺省菜单前所等待的秒数。超时后,将启动默认菜单项。在菜单头部使用,不能用于菜单项中。
————————————————————————————————
title
title [NAME]
菜单标题,即加载菜单后菜单项的标题。
目前最多只支持 20 个有效的 title 行。
当存在连续的 title 时,仅仅把最后一个 title 作为有效的 title 来计算,其余的只显示出来而已,并且不能用箭头键来访问。这是一种添加注释的方法,这样,用户想怎么添加注释都很随意了。
这是与grub4dos不同的地方,grub4dos不支持此功能。
示例:
title
title Wee Boot Menu
title =============
title GRLDR
http://bbs.znpc.net/viewthread.php?tid=5838&page=13&fromuid=12697#pid46877
——————————————————————————————————
本文写作的过程中参考了grub4dos-help-2011-05-27、ABS_Guide(高级 Bash 脚本编程指南)、grub2入门基础教程修订版、批处理阶段教程奥运最终版[英雄出品]以及系统时空和无忧启动论坛的相关帖子,并得到了不点等人的帮助,在此一并致谢。
[ 本帖最后由 2011_dihuo0 于 2011-8-22 09:15 编辑 ] |
评分
-
查看全部评分
|