本文档来源:http://bbs.znpc.net/viewthread.php?tid=5587 感谢zw2312914提供 原版是中英文对照的版本,这里已经经过删改。 需要看原版的可以从上面的贴子下载. 一些旧的网址已经删除,只保留目前在用的. 注:本文仅供参考,可能有一些更新没有在这里说明.如果有发现错误可以到论坛发贴或email联系我(grub4dos@chenall.net) 其它命令用法请参考 http://grub4dos.sourceforge.net/wiki/ 处的 GRUB4DOS 有关文档。 外部命令的用法请参考 http://chenall.net/post/tag/grub4dos/ 项目主页 http://code.google.com/p/grub4dos-chenall/ 下载网址: http://code.google.com/p/grub4dos-chenall/downloads/list http://nufans.net/grub4dos/ 工具和外部命令: http://code.google.com/p/grubutils/downloads/list 通过匿名 svn 服务器获取最新源代码的方法: svn co http://grub4dos-chenall.googlecode.com/svn/trunk/ grub4dos 通过你的 web 浏览器在线查看源代码: http://code.google.com/p/grub4dos-chenall/source/browse/ GRUB4DOS 邮件列表(未用): grub4dos-devel@gna.org 订阅页面: https://mail.gna.org/listinfo/grub4dos-devel/ 论坛(官方技术支持站点): http://bbs.znpc.net/forumdisplay.php?fid=4 http://reboot.pro/forum/66/ ****************************************************************************** *** GCC 黑名单 *** ****************************************************************************** 已知 gcc-4.6.x 所产生的程序在某些机器上无法正常运作。 来源: http://bbs.wuyou.net/viewthread.php?tid=274070 已知 gcc-4.7.x 所产生的程序无法运行 memtest86。 来源: http://bbs.wuyou.net/redirect.php?tid=180142&pid=2669810&goto=findpost#pid2669810 ---------------------近期更新记录----------------------------------------------- 最新更新记录请查看,ChangeLog_chenall.txt 2011-01-03 添加了GRUB4DOS的变量用法及相关介绍。 2011-01-02 1.为了方便pause命令添加--test-key参数,显示按键扫描码. 2010-12-31 更新: 1.pause命令增强,增加了显示按键扫描码的功能。需要debug 为-1. 例子:显示一个按键扫描码 debug -1 && pause && debug 1 注:此功能已为被参数--test-key代替。 2.hiddenmenu命令增强。增加一个--chkpass参数 功能: 在隐藏菜单的时候按Esc键要输入正确的密码才可以显示菜单。 注意: 1.该功能启用之后,如果按了其它按键则直接启动默认菜单。 默认的Esc按键可以自由设置。使用--chkpass=KEY 2.菜单初始化有password命令时才需要输入密码。 3.按键代码如果不清楚可以使用上面的功能来获取。 例子: hiddenmenu --chkpass=0x8500 按F11键才可以显示菜单。 hiddenmenu --chkpass 按Esc键才可以显示菜单。 hiddenmenu --chkpass=0x2200 按Alt+G显示菜单。 ------------------------------------------------------------------------------ GRUB.EXE 用法: GRUB [--bypass] [--time-out=T] [--hot-key=K] [--config-file=FILE] 旁路 暂停时间 热键 配置文件 这里的 FILE ,例如,可以是 (hd0,0)/menu.lst 在 CONFIG.SYS 中,其配置行类似于: install=c:\some\where\grub.exe --config-file=FILE 如果没有使用选项,GRUB.EXE简单的使用(hd0,0)/menu.lst 来作为配置文件,只要它存在的话。(注意!我们最终将默认的配 置文件从 (hd0,0)/boot/grub/menu.lst 变更为 (hd0,0)/menu.lst) (更新于2006-12-23。参见更新3) 这里的分区(hd0,0)可以是一个Windows分区或者是一个linux分区, 或者是被 GRUB 支持的其他任意分区。 这里的FILE只接受GRUB风格的文件名。DOS风格的文件名不被调用 (很明显,我们应该使用GRUB风格的文件名,原因是比如在Linux ext2分区中不能使用DOS风格的文件名来访问文件 )。 (参见更新2) 更新:FILE 可以是菜单的内容。使用分号来分隔嵌入 FILE 中的命 令。FILE 可以被一对双引号括起来,示例: GRUB --config-file="root (hd0,0);chainloader +1" 这条命令将启动(hd0,0)上的系统。 另一个例子: GRUB --config-file="reboot" 这条命令将令机器重启。 再例如: GRUB --config-file="halt" 这条命令将令机器关闭。 如果选项--bypass 被指定,GRUB将在暂停时间截止后从DOS退出。 选项'--time-out=T' 指定了以秒计时的暂停值。如果指定了--bypass 则T的默认值为5 ,而--bypass选项没有被指定时默认值为0 。 默认的热键值是 0x3920 (即空格键)。如果此键被按下,GRUB将正常 启动。如果其他键被按下,GRUB 将立即终止并返回到DOS。参见下面 的“int16 键盘扫描码” 每个选项最多只能被指定一次。 更新 2:DOS风格的文件名已经被支持(由John Cobb先生提供此补丁)。 如果 FILE 的起始两个字符是“ #@ ”,那么 FILE 中其余的部分将被视 为一个DOS风格的文件名。例如: GRUB --config-file="#@c:\menu.lst" DOS风格的文件只有起始的4kB被使用。此文件应当是一个未被压缩的文 本文件。 注意:你也可以在SHELL或者在CONFIG.SYS的INSTALL配置行使用‘DOS 风格文件直接访问’。但不要在DEVICE 配置行使用它。DOS文档中表述 了DOS设备驱动不能使用'打开文件'的DOS调用。 更新 3(2006-12-23): 作为默认,GRUB.EXE将按以下顺序查找它的配置文件: (DOS风格文件) .\menu.lst, 当前目录下的MENU.LST。 (DOS风格文件) \menu.lst, 当前驱动器根目录下的MENU.LST (GRUB风格文件) /menu.lst, 启动设备根目录下的MENU.LST 默认的启动设备还是(hd0,0)。 -------------------------------------------------------- 更新 1 : 版本0.2.0 同时带来一个新的东西。GRUB for NTLDR ,它能够从 Windows NT/2000/XP的启动菜单启动到GRUB。复制GRLDR到Windows NT/2000/XP的C盘根目录,并在C:\BOOT.INI中加入这样一行: C:\GRLDR="Start GRUB" 这样就完成了安装。GRLDR应该与 BOOT.INI及NTLDR 位于相同的目录。 注意 BOOT.INI 通常是隐藏的因而你要看见它必须取消隐藏。如果GRLDR 在一个NTFS分区,应该将它复制到一个非NTFS分区的根目录(并且menu.lst 文件应当同样这样做)。假如GRLDR被压缩了,比如在NTFS分区中对它启 用了压缩的情况下,它将不能运行。 即使这个磁盘的驱动器号已经被Windows设备管理器改变为另外的不同 于 C 的盘号 ,你仍然需要在 BOOT.INI 中使用盘符 C ,否则,NTLDR 将查找不到 GRLDR 文件。 也就表示,如果你从一个软盘上启动NTLDR,你也需要把A:\BOOT.INI 中的 GRLDR 的所在行这样写: C:\GRLDR="Start GRUB" 而不能象下面这样使用盘符 A : A:\GRLDR="Start GRUB" (注意在 BOOT.INI 位于软盘 A 的这个例子中,标记“C:\GRLDR” 实际将访问 A:\GRLDR ) 更新 2: GRUB for linux 也一起被引入到版本0.2.0。 你可以使用使用linux的引导程序 KEXEC,LILO,SYSLINUX 或者别的 GRUB来启动它。(GRUB4LIN 已经合并到 GRUB.EXE 中) 从Linux中直接启动到GRUB ,使用这样一组命令: kexec -l grub.exe kexec -e 经由GRUB启动到GRUB,使用如下的命令: kernel (hd0,0)/grub.exe boot 经由LILO启动到GRUB,在lilo.conf中加入这样几行: image=/boot/grub.exe label=grub.exe 经由syslinux启动到GRUB,在syslinux.cfg中加入这样几行: label grub.exe kernel grub.exe LOADLIN在引导GRUB.EXE时可能会遇到问题,原因是grub.exe需要一些 未更改的原始的BIOS中断向量,但是DOS破坏了这些中断向量,而loadlin 在将控制权交给grub.exe前并没有恢复它们。 更新 3: 从版本0.4.0开始,DOS下的GRUB支持内存驱动器。示例: # boot into a floppy image map --mem (hd0,0)/floppy.img (fd0) map --hook chainloader (fd0)+1 rootnoverify (fd0) map --floppies=1 boot 由于镜像将被拷贝到一个内存区域,所以镜像本身可以是非连续的, 甚至可以是被gzip压缩过的。 另一个例子: map --mem=-2880 (hd0,0)/floppy.img (fd0) 这个内存驱动器(fd0)将占用至少1440 KB的内存。 这也对那些小于1440 KB的1.44M 软盘镜像有用。 再例如: map --mem --read-only (hd0,0)/hd.img (hd1) 这个内存驱动器成为了一个硬盘驱动器,并且只读。 这表示你不能向这个(hd1)中写入数据。 你可以同时使用多个内存驱动器和多个原来的基于磁盘虚拟的仿真驱动器。 如果BIOS不支持中断int15/EAX=e820h,你将不能使用任何内存驱动器。 更新 4: 对于内存驱动器仿真,一个单一的分区镜像可以被转换为整个硬盘镜像来 map --mem (hd0,7)/win98.img (hd0) map --hook chainloader (hd0)+1 rootnoverify (hd0) map --harddrives=1 boot 这里的win98.img是一个头部不含主引导记录和分区表的分区镜像。 GRUB for DOS 确实会为这个内存驱动器(hd0)建立一个MBR和分区表。 更新 5: 现在GRLDR可以作为一个非模拟模式的可启动光盘的启动映像文件来使 用。Linux用户使用示例: mkdir iso_root cp grldr iso_root mkisofs -R -b grldr -no-emul-boot -boot-load-seg 0x1000 -o bootable.iso iso_root 另一种选择是,grldr也可以用同样的方法作为stage2_eltorito来使用。 -boot-info-table选项是被允许使用的,但你可以省略它: mkdir iso_root cp grldr iso_root mkisofs -R -b grldr -no-emul-boot -boot-load-size 4 -o grldr.iso iso_root 也要注意上面的可启动iso镜像是使用-boot-load-seg 0xHHHH选项来建立的话, 就必须令HHHH大于或者等于1000(十六进制) 如果HHHH小于1000(十六进制),虚拟机 QEMU 会死机。这是QEMU的一个缺陷。一 个grldr.iso镜像可以使用也可以不使用-boot-load-seg 0xHHHH选项来创建。 menu.lst文件应该被放置在光盘的根目录。 更新 6: 中文专用版被建立在"chinese"子目录中。 ( 由Gandalf先生提供此补丁,2005-06-27) 中文专用版同时内附了scdrom 功能。 (更新:scdrom 从2006-07-20起已被删除) 更新 7: 增加了内存驱动器(md) 。就像(nd)代表网络驱动器 (cd) 代表光驱一样, 新的驱动器(md)实现了将整个内存作为一个磁盘驱动器来访问。 (md)只工作在支持BIOS中断int15/EAX=E820h的系统上。 现在,cat命令已经有了一个十六进制转储的新选项:--hex 以及通过--locate=STRING 在文件中找查找字符串。 典型示例: cat --hex (hd0)+1 这将用十六进制的表格显示 MBR 扇区。 cat --hex (md)+2 这将显示你内存起始处的1 KB内容(实际,这就是实模式的IDT表),也是 使用十六进制的转储表。 cat --hex (md)0x800+1 这将显示你的扩展内存的第一个扇区。 cat --hex (hd0,0)+1 这将显示(hd0,0)分区的第一扇区。通常这个扇区包含操作系统的引导记录。 更新 8: 增加了随机存贮驱动器 (rd) 。(md) 设备访问内存是从物理地址 0 开始,而 (rd) 可以访问起始于任何基地址的内存。随机存贮器的基 址与长度可以通过 map 命令指定。详情请使用 "help map" 命令。 你甚至能够为(rd)驱动器指定一个BIOS驱动器号。比如: map --ram-drive=0xf0。默认的 (rd) 驱动器号是使用0x7F的软驱号。 如果 (rd) 是硬盘驱动器镜像,你应该用大于或等于0x80的值来改变 它的驱动器号。(但应防止使用0xffff,因为0xffff是预留给(md)设 备的。) (rd)+1这个标志始终代表文件,它包含存储在(rd)中的所有字节。 更新 9: 直接启动 WinNT/2K/XP 的 NTLDR 和 Win9x/ME 的 IO.SYS, 以及 FreeDOS 的 KERNEL.SYS. 例如: chainloader --edx=0xPPYY (hd0,0)/ntldr boot chainloader --edx=0xYY (hd0,0)/io.sys boot chainloader --ebx=0xYY (hd0,0)/kernel.sys boot 十六进制的YY 指定了启动驱动器号,十六进制的PP指定了 NTLDR 的 启动分区号。如果启动驱动器是软驱,PP应该是一个十六进制的值ff, 即十进制的255. 对于 Freedos 的 KERNEL.SYS , 选项--edx不能执行,请使用--ebx 。 当文件位于它们平常的位置时,选项 --edx (--ebx)可以省略。但某些 情况下,这些选项是必需的。 例如,假设被调用的ntldr文件在ext2分区(hd2,8)中,而你又希望它认 为(hd0,7)的 windows 分区是启动分区,那么--edx就是必需的: chainloader --edx=0x0780 (hd2,8)/ntldr 对于DOS核心(即,IO.SYS和KERNEL.SYS),启动分区号是没有意义的, 因此你只需指定恰当的启动驱动器号YY(不过指定了启动分区号也是 无害的)。 上面的PPYY也可以在chainloader命令之后通过root和rootnoverify命 令来指定。例如: chainloader (hd2,6)/kernel.sys rootnoverify (hd0) <-------- YY=80 boot chainloader (hd0,0)/ntldr rootnoverify (hd0,5) <-------- YY=80, PP=05 boot 提示:CMLDR (the ComMan LoaDeR,它被用于加载Windows的故障 恢复控制台)可以像NTLDR一样被良好的加载。 Bean 成功地解压和启动了WinME的IO.SYS,感谢这个出色的工作。 更新 10: isolinux.bin (版本 3.73) 可以被自2009-02-09 起建立的版本加载。 chainloader (cd)/isolinux.bin isolinux.bin必须是存在于在真实或虚拟的光驱之中的。 更新 11: Grub 传统版的 stage2 文件可以通过下面的方法加载: chainloader --force --load-segment=0 --load-offset=0x8000 --boot-cs=0 --boot-ip=0x8200 (...)/.../stage2 -------------------------------------------------------- 这里用一些示例来演示磁盘仿真命令的用法: 1. 仿真硬盘分区C:为软驱A:并从C:中启动win98: map --read-only (hd0,0)+1 (fd0) chainloader (hd0,0)+1 rootnoverify (hd0) boot 在上面的示例中,(hd0,0)是一个装有win98的C:盘 。当win98启动完成后,你会发 现A:中包含了C:的所有文件,而且如果你删除A:中的文件,C:上的相应文件也会消 失。 在map命令行中,(hdm,n)+1式的写法被解释成代表整个(hdm,n)分区,而不仅仅是 此分区的第一扇区。 2. 将硬盘分区C:仿真为软驱A:并从A:中启动win98: map --read-only (hd0,0)+1 (fd0) map --hook chainloader (fd0)+1 rootnoverify (fd0) map --floppies=1 boot 在“map --hook”命令之后,仿真立即生效,即使是在GRUB的命令行模式中。 Note that the (fd0) in "chainloader (fd0)+1" is the emulated virtual floppy A:, not the real floppy diskette(because map is hooked now). 注意“chainloader (fd0)+1” 中的(fd0)是仿真后的虚拟软驱 A:,而不是真 实的软盘(因为映射现在已经被挂载了)。 3. 仿真镜像文件为软驱A:并从C:盘中启动win98: map --read-only (hd0,0)/floppy.img (fd0) chainloader (hd0,0)+1 rootnoverify (hd0) map --floppies=1 map --harddrives=1 boot 4. 仿真硬盘分区为第一硬盘并从中启动DOS: map --read-only (hd2,6)+1 (hd0) map --hook chainloader (hd0,0)+1 rootnoverify (hd0) map --harddrives=1 boot 在这个示例中,(hd2,6)+1代表BIOS序号为3的(hd2)硬盘中的,扩展的DOS逻辑分区。 如果一个DOS分区被仿真为一个硬盘,GRUB for DOS将首先定位分区表,通常, 是在DOS分区的开头63个扇区中。如果那里没有分区表,GRUB for DOS将拒绝仿真。 5. 仿真一个镜像文件为第一硬盘然后从中启动DOS: map --read-only (hd0,0)/harddisk.img (hd0) chainloader --load-length=512 (hd0,0)/harddisk.img rootnoverify (hd0) map --harddrives=1 boot 如果一个镜像文件被仿真为硬盘,此镜像文件必须包含MBR。也就是说, HARDDISK.IMG的第一扇区必须包含被仿真的虚拟硬盘的分区表。 注意: BIOS数据区中的软盘和硬盘的总数在映射期间没有被改变。当主板上没有配置真 实的软驱时,你通常应该专门使用诸如‘map --floppioes=’以及 map --harddrives=’来设置它们。如果不这样做,DOS可能会启动失败。 ‘map --status’可以报告出一些有价值的东西。同时要注意‘map --floppies=’ 和‘map --harddrives=’需要在没有执行映射前单独使用。 版本0.4.2引入了一个新参数,memdisk_raw,用以模拟和内存驱动器类似的原生模式。 如果BIOS不支持中断int15/87h,或者int18/87h的支持有缺陷,你应该在任何内 存盘被使用前设置这个变量。这里是一个示例: map --memdisk-raw=1 map --mem (hd0,0)/floppy.img (fd0) map --hook chainloader (fd0)+1 rootnoverify (fd0) boot 如果你碰到内存驱动器故障而又没有使用map --memdisk-raw=1时,你应当用 ‘map --memdisk-raw=1’来尝试一次。 你一执行‘map --memdisk-raw=0’之后,就应该执行一次‘map --unhook’ (如果需要的话在这之后再执行‘map --hook’)。 更新:memdisk_raw 现在默认值为1 。如果你希望使用中断int15/87h来访问内存 驱动器,你应当令‘map --memdisk-raw=0 ’。 -------------------------------------------------------- 任意大小的软盘或硬盘可以被 GRUB for DOS 0.2.0 版仿真。 镜像文件必须是连续的,否则GRUB for DOS 将拒绝执行。 ‘blocklist’命令可以列举一个文件的碎片或者分块。 在GRUB提示符下输入“help map”可以获得简要的命令说明。 这样的形式 map ... (fd?) 是一个软盘仿真,而下面的形式 map ... (hd?) 是一个硬盘仿真。 使用硬盘仿真时,基于安全因素最好不要去启动Windows 。 Windows甚至可能会破坏掉所有的数据和你硬盘上的所有资料!!!!!!!! 关于--mem的更新 :当使用--mem时,甚至是在进入Windows的时候,它看 来都相当安全。Win98可以正常运行内存驱动器。 Windows NT/2000/XP不能识别仿真的驱动器,不管是否使用了--mem选项。 ****************************************************************************** *** grldr可启动的软盘或硬盘分区的说明 *** ****************************************************************************** 1. Ext2 引导扇区/引导记录的布局 (用于载入grldr) ------------------------------------------------------------------------------ 一个EXT2/EXT3的卷可以是GRUB可启动的。复制grldr和可选的menu.lst文件到这个EXT2/EXT3 卷的根目录,并按照grldr的第五扇区建立它的引导扇区(一些需要更改的字段在下面的表 中做了详细注释)。那么,这个EXT2/EXT3的卷就是GRUB可启动的。 更新: bootlace.com是一个dos/linux下的工具,它可以把GRLDR的引导记录安装到一个 EXT2/EXT3卷的第一扇区。 偏移 长度 说明 ====== ====== ============================================================== 00h 2 Machine code for short jump over the data. 近转移指令的机器码 02h 1 LBA indicator. Valid values are 0x02 for CHS mode, or 0x42 for LBA mode. LBA指示码。CHS模式时,有效值是0x02;LBA模式时有效值为0x42。 If the BIOS int13 supports LBA, this byte can be safely set to 0x42. 如果BIOS的int13支持LBA,此字节可以安全地设置为0x42。 Some USB BIOSes might have bugs when using CHS mode, so the format program should set this byte to 0x42. It seems that (generally) all USB BIOSes have LBA support. 某些 USB 设备的BIOS在使用CHS寻址模式时可能有缺陷,所以格式化程 序应当设置这个字节为0X42 。似乎所有(多数)的USB BIOS都能支持LBA 。 If the format program does not know whether the BIOS has LBA support, it may operate this way: 如果格式化程序不知道BIOS是否具有LBA支持,它可以采用以下方法: if (partition_start + total_sectors_in_partition) exceeds the CHS addressing ability(especially when it is greater than 1024*256*63), the caller should set this byte to 0x42, otherwise, set to 0x02. 如果(分区的起始地址加上分区的总扇区)超过了CHS的寻址能力。 (特别是当它大于1024*256*63时),调用程序应当设置此字节为0x42, 否则,要设为0x02。 Note that Windows98 uses the value 0x0e as the LBA indicator. 注意 Windows98 使用0x0e作为LBA指示码。 Update: this byte of LBA indicator is ignored. The boot record can probe the LBA support of BIOS. 更新:LBA指示码这个字节已被忽略。引导记录能够探测BIOS的LBA支持。 03h 10 OEM name string (of OS which formatted the disk). Update: this field is now used for error message of "I/O error" OEM 名称字符串(对该磁盘进行格式化的操作系统的名字)。 更新:此字段现在被用于错误提示信息“I/O error” 0Dh 1 Sectors per block. Valid values are 2, 4, 8, 16 and 32. 每块扇区数。有效值是2, 4, 8, 16 和 32。 0Eh 2 Bytes per block. Valid values are 0x400, 0x800, 0x1000, 0x2000 and 0x4000. 每块字节数。有效值是0x400, 0x800, 0x1000, 0x2000 和 0x4000。 10h 4 Pointers in pointers-per-block blocks, that is, number of blocks covered by a double-indirect block. 在pointers-per-block块中的指针数,即一个二级间接块包含的块数。 Valid values are 0x10000, 0x40000, 0x100000, 0x400000 and 0x1000000. 有效值是0x10000, 0x40000, 0x100000, 0x400000 和 0x1000000。 14h 4 Pointers per block, that is, number of blocks covered by an indirect block. 每块指针数,即一个间接块包含的块数。 Valid values are 0x100, 0x200, 0x400, 0x800, 0x1000. 有效值是0x100, 0x200, 0x400, 0x800, 0x1000 。 18h 2 Sectors per track. 每磁道的扇区数。 1Ah 2 Number of heads/sides. 磁头数/面数 1Ch 4 Number of hidden sectors (those preceding the boot sector). 隐藏扇区数(它们位于引导扇区之前) Also referred to as the starting sector of the partition. 也被成为是分区的起始扇区。 For floppies, it should be 0. 对于软盘,它应当为0 。 20h 4 Total number of sectors in the filesystem(or in the partition). 文件系统中的扇区总数(或者是分区的扇区总数)。 24h 1 BIOS drive number of the boot device. 启动设备的 BIOS 驱动器号码。 Actually this byte is ignored for read. The boot code will write DL onto this byte. The BIOS or the caller should set drive number in DL. 实际此字节在读入时被忽略。引导代码将把DL的值写入到此字节中。 BIOS或者调用程序应当在DL中设置磁盘号码。 We assume all BIOSes pass correct drive number in DL. Buggy BIOSes are not supported!! 我们假定所有的BIOS在DL中能传递正确的磁盘号码。 糟糕的BIOS不被支持!! 25h 1 Partition number of this partition on the boot drive. 此分区在启动驱动器上的分区号 0, 1, 2, 3 are primary partitions. 4, 5, 6, ... are logical partitions in the extended partition. 0, 1, 2, 3 是主分区 。4, 5, 6, ... 等等是扩展分区中的逻辑分区。 0xff is for whole drive. So for floppies, it should be 0xff. 0xff代表整个磁盘。所以对于软盘,其分区号码应当是0xff 。 26h 2 inode size in bytes. (Notice! We use the formerly reserved word here for inode size!) 字节计数的索引节点大小。(注意!我们在此处为索引节点大小使用 了以前被保留的一个字,即两个字节) 28h 4 Number of inodes per group. 每组的i节点数 Normally a 1.44M floppy has only one group, and the total number of inodes is 184. So the value should be 184 or greater. 通常,1.44M软盘只有一个组,并且总的i节点数是184。所以此值 应为184或者更大。 2Ch 4 The block number for group descriptors. 组描述符的块号码。 Valid values are 2 for 1024-byte blocks, and 1 otherwise. 对于1024字节的块有效值是2 ,否则是1 。 The value here is equal to (s_first_data_block + 1). 这里的值等于(s_first_data_block + 1)。 30h 1 code for "cld"(0xFC). 指令“cld”(即0xFC)。 31h 2 code for "xor ax,ax"(0x31, 0xC0). 指令“xor ax,ax”(即0x31,0xC0) 33h 1 code for "nop"(0x90) or "cwd"(0x99) 指令“nop”(即0x90)或“cwd”(即0x99) 34h 458 The rest of the machine code. 机器码部分。 1FEh 2 Boot Signature AA55h. 引导签名AA55h 。 2. FAT12/FAT16 Boot Sector/Boot Record Layout (for loading grldr) 2. FAT12/FAT16 引导扇区/引导记录的布局 (用于载入grldr) ------------------------------------------------------------------------------ A FAT12/16 volume can be GRUB-bootable. Copy grldr and an optional menu.lst to the root dir of the FAT12/16 volume, and build the boot sector based on the fourth sector of grldr(some fields need to be changed as detailed in the following table). And then the FAT12/16 volume is GRUB-bootable. 一个FAT12/16的卷是GRUB可启动的。复制grldr和可选的menu.lst文件到这个FAT12/16 卷 的根目录,并按照grldr的第四扇区建立它的引导扇区(一些需要更改的字段在下面的表中 做了详细注释)。然后这个FAT12/16的卷就是GRUB可启动的。 Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot record onto the boot sector of an FAT12/16 volume. 更新: bootlace.com 是一个dos/linux下的工具,而它能把GRLDR的引导记录安装到一个 FAT12/16卷的引导扇区。 Offset Length Description 偏移 长度 说明 ====== ====== ============================================================== 00h 2 Machine code for short jump over the data. 近转移指令的机器码 02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for LBA mode. LBA指示码。CHS模式时,有效值为0x90;LBA模式时,有效值为0x0e 。 If the BIOS int13 supports LBA, this byte can be safely set to 0x0e. 如果BIOS int13支持LBA,此字节可以安全地设置为0x0e 。 Some USB BIOSes might have bugs when using CHS mode, so the format program should set this byte to 0x0e. It seems that (generally) all USB BIOSes have LBA support. 某些USB设备的BIOS在使用CHS寻址模式时可能有缺陷,所以格式化程序 应当设置这个字节为0X0e 。似乎所有的(多数)USB BIOS都能支持 LBA 。 If the format program does not know whether the BIOS has LBA support, it may operate this way: 如果格式化程序不知道BIOS是否具有LBA支持,它可以采用以下方法: if (partition_start + total_sectors_in_partition) exceeds the CHS addressing ability(especially when it is greater than 1024*256*63), the caller should set this byte to 0x0e, otherwise, set to 0x90. 如果(分区的起始地址加上分区的总扇区)超过了CHS 的寻址能力。 (特别是当它大于1024*256*63),调用程序应当设置此字节为0x0e, 否则,要设为0x90。 Update: this byte of LBA indicator is ignored. The boot record can probe the LBA support of BIOS. 更新:LBA 指示码这个字节已被忽略。引导记录能探测BIOS的LBA支持。 Update(2006-07-31): Though GRLDR won't use this LBA-indicator byte, Windows 98 uses it. Usually this byte should be 0x90 for CHS mode(especially for floppies). If this byte is not set properly, Windows 98 will not recognize the floppy or partition. This problem was reported by neiljoy. Many thanks! 更新 (2006-07-31):尽管GRLDR不再使用LBA指示码这个字节, 但Windows 98会使用它。通常这个字节在 CHS 模式中应当设置为0x90 (软盘尤其如此)。如果此字节未被正确设置,Windows 98将不能识别 软盘或分区。这一问题由neiljoy先生报告。非常感谢! 03h 8 OEM name string (of OS which formatted the disk). OEM名称字符串 (对该磁盘进行格式化的操作系统的名称) 0Bh 2 Bytes per sector. Must be 512. 每扇区字节数。必须为512 。 0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 and 128. But a cluster size larger than 32K should not occur. 每簇的扇区数。有效值是1, 2, 4, 8, 16, 32, 64和128 。但是簇大小 大于32K的情况不应发生。 0Eh 2 Reserved sectors(number of sectors before the first FAT, including the boot sector), usually 1. 保留的扇区数(第一文件分配表之前的扇区数,包括引导扇区),通常是1。 10h 1 Number of FATs(nearly always 2). 文件分配表数(几乎总是2)。 11h 2 Maximum number of root directory entries. 根目录项的最大个数。 13h 2 Total number of sectors (for small disks only, if the disk is too big this is set to 0 and offset 20h is used instead). 扇区总数(仅用于小磁盘,如果磁盘太大此处被设置为0,而偏移 20h 处 则替代它使用)。 15h 1 Media descriptor byte, pretty meaningless now (see below). 媒体描述符字节,现在该此节已经没有太大意义了(参见后面)。 16h 2 Sectors per FAT. 每个文件分配表的扇区数。 18h 2 Sectors per track. 每个磁道的扇区数 1Ah 2 Total number of heads/sides. 磁头或面的总数。 1Ch 4 Number of hidden sectors (those preceding the boot sector). 隐藏扇区数(位于引导扇区之前)。 Also referred to as the starting sector of the partition. 也被称为是分区的开始扇区。 For floppies, it should be 0. 对于软盘,它应当为0 。 20h 4 Total number of sectors for large disks. 大磁盘的扇区总数。 24h 1 BIOS drive number of the boot device. 引导设备的BIOS磁盘号。 Actually this byte is ignored for read. The boot code will write DL onto this byte. The BIOS or the caller should set drive number in DL. 实际此字节在读入时被忽略。引导代码将把DL中的值写入此字节。 BIOS或者调用程序应当在DL中设置磁盘号码。 We assume all BIOSes pass correct drive number in DL. Buggy BIOSes are not supported!! 我们假定所有的BIOS在DL中能传递正确的磁盘号码。 糟糕的BIOS不被支持!! 25h 1 Partition number of this filesystem in the boot drive. 启动驱动器上此文件系统的分区号码。 This byte is ignored for read. The boot code will write partition number onto this byte. See offset 41h below. 此字节在读入时被忽略。引导代码将分区号码写到此字节。 见下述偏移41h 。 26h 1 Signature (must be 28h or 29h to be recognised by NT). 签名(必须是28h或者29h以便能被 NT 识别) 27h 4 Volume serial number. 卷的序列号。 2Bh 11 Volume label. 卷标签。 36h 8 File system ID. "FAT12 ", "FAT16 " or "FAT ". 文件系统ID。“FAT12”, “FAT16”或 “FAT”。 3Eh 1 code for "cli". 指令“cli”。 3Fh 1 code for "cld". 指令“cld”。 40h 1 code for "mov dh, imm8". 指令“mov dh, imm8”。 41h 1 Partition number of this partition on the boot drive. 此分区在启动驱动器的分区号。 0, 1, 2, 3 are primary partitions. 4, 5, 6, ... are logical partitions in the extended partition. 0, 1, 2, 3 是主分区。4, 5, 6, ... 等等是扩展分区中的逻辑分区。 0xff is for whole drive. So for floppies, it should be 0xff. 0xff代表整个磁盘。所以对于软盘,其分区号码应当是0xff 。 42h 442 The rest of the machine code. 机器码部分。 1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) 引导签名AA550000h 。(Win9x 使用4字节作为魔数值。) 3. FAT32 Boot Sector/Boot Record Layout (for loading grldr) 3. FAT32 引导扇区/引导记录的布局 (用于载入grldr) ------------------------------------------------------------------------------ A FAT32 volume can be GRUB-bootable. Copy grldr and an optional menu.lst to the root dir of the FAT32 volume, and build the boot sector based on the third sector of grldr(some fields need to be changed as detailed in the following table). And then the FAT32 volume is GRUB-bootable. 一个FAT32的卷是GRUB可启动的。复制grldr和可选的menu.lst文件到这个FAT32卷的根 目录,并按照grldr的第三扇区建立它的引导扇区(一些需要更改的字段在下面的表中 做了详细注释)。然后这个FAT32的卷就是GRUB可启动的。 Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot record onto the boot sector of an FAT32 volume. 更新: bootlace.com 是一个dos及linux下的工具而它能把 GRLDR 的引导记录安装 到一个FAT32卷的引导扇区。 Offset Length Description 偏移 长度 说明 ====== ====== ============================================================== 00h 2 Machine code for short jump over the data. 近转移指令的机器码。 02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for LBA mode. LBA指示码。CHS模式时,有效值为0x90,而LBA模式时,有效值为0x0e。 If the BIOS int13 supports LBA, this byte can be safely set to 0x0e. 如果BIOS的int13支持LBA,此字节可以安全地设置为0x0e。 Some USB BIOSes might have bugs when using CHS mode, so the format program should set this byte to 0x0e. It seems that (generally) all USB BIOSes have LBA support. 某些USB设备的BIOS在使用CHS寻址模式时可能有缺陷,所以格式化程 序应当设置这个字节为0X0e。似乎所有(多数)的USB BIOS都能支持LBA 。 If the format program does not know whether the BIOS has LBA support, it may operate this way: 如果格式化程序不知道BIOS是否具有LBA支持,它可以采用以下方法: if (partition_start + total_sectors_in_partition) exceeds the CHS addressing ability(especially when it is greater than 1024*256*63), the caller should set this byte to 0x0e, otherwise, set to 0x90. 如果(分区的起始地址加上分区的总扇区)超过了CHS 的寻址能力。 (特别是当它大于1024*256*63),调用程序应当设置此字节为0x0e, 否则,要设为0x90。 Update: this byte of LBA indicator is ignored. The boot record can probe the LBA support of BIOS. 更新: LBA 指示码这个字节已被忽略。引导记录能探测BIO的LBA支持。 Update(2006-07-31): Though GRLDR won't use this LBA-indicator byte, Windows 98 uses it. Usually this byte should be 0x90 for CHS mode(especially for floppies). If this byte is not set properly, Windows 98 will not recognize the floppy or partition. This problem was reported by neiljoy. Many thanks! 更新 (2006-07-31):尽管GRLDR不再使用 LBA 指示码这个字节, 但Windows 98会使用它。通常这个字节在 CHS 模式中应当设置为0x90 (软盘尤其如此)。如果此字节未被正确设置,Windows 98 将不能识别 软盘或分区。这一问题由neiljoy先生报告。非常感谢! 03h 8 OEM name string (of OS which formatted the disk). OEM名称字符串 (对该磁盘进行格式化的操作系统的名称) 0Bh 2 Bytes per sector. Must be 512. 每扇区字节数。必须为512 。 0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 and 128. But a cluster size larger than 32K should not occur. 每簇的扇区数。有效值是1, 2, 4, 8, 16, 32, 64 和 128 。 但是簇大小大于32K的情况不应发生。 0Eh 2 Reserved sectors(number of sectors before the first FAT, including the boot sector), usually 1. 保留的扇区数(第一文件分配表之前的扇区数,包括引导扇区), 通常是1 。 10h 1 Number of FATs(nearly always 2). 文件分配表数(几乎总是2)。 11h 2 (Maximum number of root directory entries)Must be 0. (根目录项的最大个数)必须为0 。 13h 2 (Total number of sectors for small disks only)Must be 0. (仅用于小磁盘的扇区总数)必须为0 。 15h 1 Media descriptor byte, pretty meaningless now (see below). 媒体描述符字节,现在该此节已经没有太大意义了(参见后面)。 16h 2 (Sectors per FAT)Must be 0. (每个文件分配表的扇区数)必须为0 。 18h 2 Sectors per track. 每个磁道的扇区数 1Ah 2 Total number of heads/sides. 磁头或面的总数。 1Ch 4 Number of hidden sectors (those preceding the boot sector). 隐藏扇区数(它们位于引导扇区之前)。 Also referred to as the starting sector of the partition. 也被称作是分区的起始扇区。 For floppies, it should be 0. 对于软盘,它应当为0 。 20h 4 Total number of sectors for large disks. 大磁盘的扇区总数。 24h 4 FAT32 sectors per FAT. 每个文件分配表的 FAT32 扇区数。 28h 2 If bit 7 is clear then all FATs are updated, otherwise bits 0-3 give the current active FAT, all other bits are reserved. 如果第7位被清零,所有文件分配表将被更新,否则0-3位给出当前活 动的文件分配表,所有其它位被保留。 2Ah 2 High byte is major revision number, low byte is minor revision number, currently both are 0. 高字节是主修订号码,低字节是小修订号码,现在都是0 。 2Ch 4 Root directory starting cluster. 根目录起始簇。 30h 2 File system information sector. 文件系统信息扇区。 32h 2 If non-zero this gives the sector which holds a copy of the boot record, usually 6. 如果非零它给出具有引导记录的备份扇区,通常是6。 34h 12 Reserved, set to 0. 保留,设为0 。 40h 1 BIOS drive number of the boot device. 启动设备的 BIOS 驱动器号码。 80h is first HDD, 00h is first FDD. 第一硬盘是80h,第一软盘是00h。 Actually this byte is ignored for read. The boot code will write DL onto this byte. The BIOS or the caller should set drive number in DL. 实际此字节在读入时被忽略。引导代码将把DL中的值写入此字节。 BIOS或者调用程序应当在DL中设置磁盘号码。 We assume all BIOSes pass correct drive number in DL. Buggy BIOSes are not supported!! 我们假定所有的 BIOS 在DL中能传递正确的磁盘号码。 糟糕的BIOS不被支持!! 41h 1 Partition number of this filesystem in the boot drive. 启动驱动器上此文件系统的分区号码。 This byte is ignored for read. The boot code will write partition number onto this byte. See offset 5Dh below. 此字节在读入时被忽略。引导代码将分区号码写到此字节。 见下述的偏移5Dh 。 42h 1 Signature (must be 28h or 29h to be recognised by NT). 签名(必须是 28h 或者 29h 以便能被 NT 识别) 43h 4 Volume serial number. 卷的序列号。 47h 11 Volume label. 卷标签。 52h 8 File system ID. "FAT32 ". 文件系统标识。“FAT32 ”。 5Ah 1 opcode for "cli". 指令 “cli”。 5Bh 1 opcode for "cld". 指令 “cld” 。 5Ch 1 opcode for "mov dh, imm8". 指令 “mov dh, imm8”。 5Dh 1 Partition number of this partition on the boot drive. 此分区在启动驱动器上的分区号。 0, 1, 2, 3 are primary partitions. 4, 5, 6, ... are logical partitions in the extended partition. 0, 1, 2, 3 是主分区。4, 5, 6, ...等等是扩展分区中的逻辑分区。 0xff is for whole drive. So for floppies, it should be 0xff. 0xff 代表整个磁盘。所以对于软盘,其分区号码应当是0xff 。 5Eh 414 The rest of the machine code. 机器码部分。 1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) 引导签名AA550000h 。(Win9x 使用4字节作为魔数值。) 4. NTFS Boot Sector/Boot Record Layout (for loading grldr) NTFS 引导扇区/引导记录的布局 (用于载入grldr) ------------------------------------------------------------------------------ An NTFS volume can be GRUB-bootable. Copy grldr and an optional menu.lst to the root dir of the NTFS volume, and build the boot sector based on the 6th-9th sectors of grldr(some fields need to be changed as detailed in the following table). And then the NTFS volume is GRUB-bootable. 一个FAT32的卷是GRUB可启动的。复制grldr和可选的menu.lst文件到这个FAT32卷的根 目录,并按照grldr的第6至9扇区建立它的引导扇区(一些需要更改的字段在下面的表 中做了详细注释)。然后这个FAT32的卷就是GRUB可启动的。 Update: bootlace.com is a DOS/Linux utility that can install the GRLDR boot record onto the leading 4 sectors of an NTFS volume. 更新: bootlace.com是一个在dos/linux下的工具,而它能把GRLDR的引导记录安装到 一个NTFS卷的开头4个扇区。 Offset Length Description 偏移 长度 说明 ====== ====== ============================================================== 00h 2 Machine code for short jump over the data. 近转移指令的机器码。 02h 1 LBA indicator. Valid values are 0x90 for CHS mode, or 0x0e for LBA mode. LBA指示码。CHS模式时,有效值为0x90;LAB模式时,有效值为0x0e。 If the BIOS int13 supports LBA, this byte can be safely set to 0x0e. 如果BIOS的int13支持LBA,此字节可以安全地设置为0x0e 。 Some USB BIOSes might have bugs when using CHS mode, so the format program should set this byte to 0x0e. It seems that (generally) all USB BIOSes have LBA support. 某些USB设备的BIOS在使用CHS寻址模式时可能有缺陷,所以格式化程 序应当设置这个字节为0X0e 。似乎所有(多数)的USB BIOS 都能支持LBA。 If the format program does not know whether the BIOS has LBA support, it may operate this way: 如果格式化程序不知道BIOS是否具有LBA支持,它可以采用以下方法: if (partition_start + total_sectors_in_partition) exceeds the CHS addressing ability(especially when it is greater than 1024*256*63), the caller should set this byte to 0x0e, otherwise, set to 0x90. 如果(分区的起始地址加上分区的总扇区)超过了CHS 的寻址能力。 (特别是当它大于1024*256*63),调用程序应当设置此字节为0x0e, 否则,要设为0x90。 Update: this byte of LBA indicator is ignored. The boot record can probe the LBA support of BIOS. 更新: LBA 指示码这个字节已被忽略。引导记录能探测BIOS的LBA支持。 Update(2006-07-31): Though GRLDR won't use this LBA-indicator byte, Windows 98 uses it. Usually this byte should be 0x90 for CHS mode(especially for floppies). If this byte is not set properly, Windows 98 will not recognize the floppy or partition. This problem was reported by neiljoy. Many thanks! 更新 (2006-07-31):尽管GRLDR不再使用 LBA 指示码这个字节,但 Windows 98会使用它。通常这个字节在 CHS 模式中应当设置为0x90 (软盘尤其如此)。如果此字节未被正确设置,Windows 98 将不能识别 软盘或分区。这一问题由neiljoy先生报告。非常感谢! 03h 8 OEM name string (of OS which formatted the disk). OEM名称字符串 (对该磁盘进行格式化的操作系统的名称) 0Bh 2 Bytes per sector. Must be 512. 每扇区字节数。必须为512 。 0Dh 1 Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 and 128. But a cluster size larger than 32K should not occur. 每簇的扇区数。有效值是1, 2, 4, 8, 16, 32, 64 和 128 。 但是簇大小大于32K的情况不应发生。 0Eh 2 (Reserved sectors)Unused. (保留的扇区数)未被使用。 10h 1 (Number of FATs)Must be 0. (文件分配表数)必须为 0 。 11h 2 (Maximum number of root directory entries)Must be 0. (根目录项的最大个数)必须为0 。 13h 2 (Total number of sectors for small disks only)Must be 0. (仅用于小磁盘的扇区总数)必须为0 。 15h 1 Media descriptor byte, pretty meaningless now (see below). 媒体描述符字节,现在该此节已经没有太大意义了(参见后面)。 16h 2 (Sectors per FAT)Must be 0. (每个文件分配表的扇区数)必须为0 。 18h 2 Sectors per track. 每个磁道的扇区数。 1Ah 2 Total number of heads/sides. 磁头/面的总数。 1Ch 4 Number of hidden sectors (those preceding the boot sector). 隐藏扇区数(它们位于引导扇区之前)。 Also referred to as the starting sector of the partition. 也被称作是分区的起始扇区。 For floppies, it should be 0. 对于软盘,它应当为0 。 20h 4 (Total number of sectors for large disks)Must be 0. (大磁盘的扇区总数)必须为 0 。 24h 4 (FAT32 sectors per FAT) - Usually 80 00 80 00, A value of 80 00 00 00 has been seen on a USB thumb drive which is formatted with NTFS under Windows XP. Note this is removable media and is not partitioned, the drive as a whole is NTFS formatted. (每个文件分配表的 FAT32 扇区数)- 通常是 80 00 80 00 ,值 为80 00 00 00将被看作是由Windows XP格式化为NTFS的USB拇指碟 28h 8 Number of sectors in the volume. 此卷的扇区号。 30h 8 LCN of VCN 0 of the $MFT. $MFT的逻辑簇号。 38h 8 LCN of VCN 0 of the $MFTMirr. $MFTMirr的逻辑簇号。 40h 4 Clusters per MFT Record. 每个MFT记录的簇数。 44h 4 Clusters per Index Record. 每个索引的簇数。 48h 8 Volume serial number. 卷序列号 50h 4 Checksum, usually 0. 校验和,通常为 0 。 54h 1 opcode for "cli". 指令 “cli”。 55h 1 opcode for "cld". 指令 “cld”。 56h 1 opcode for "mov dh, imm8". 指令 “mov dh, imm8”。 57h 1 Partition number of this partition on the boot drive. 此分区在启动驱动器上的分区号。 0, 1, 2, 3 are primary partitions. 4, 5, 6, ... are logical partitions in the extended partition. 0, 1, 2, 3 是主分区。4, 5, 6, ...等等是扩展分区中的逻辑分区。 0xff is for whole drive. So for floppies, it should be 0xff. 0xff 代表整个磁盘。所以对于软盘,其分区号码应当是0xff 。 58h 420 The rest of the machine code in the first sector. 机器码部分。 1FCh 4 Boot Signature AA550000h. (Win9x uses 4 bytes as magic value) 引导签名AA550000h 。(Win9x 使用4字节作为魔数值。) 200h 1536 The rest of the machine code in the last 3 sectors. 末尾 3 个扇区为机器码部分。 ------------------------------------------------------------------------------ 附录A:FAT32 的文件系统信息扇区(不用于引导grldr) Offset Length Description 偏移 长度 说明 ====== ====== ============================================================== 0h 4 Leading Signature 41615252h. 起始处签名 41615252h 。 4h 480 Reserved, set to 0. 被保留,设为 0 。 1E4h 4 FSI structure signature 61417272h. 故障征兆指数结构签名 61417272h 1E8h 4 Contains the last known count of free clusters, if this is equal to FFFFFFFFh, then the count is unknown. 最后已知的空闲簇数,如果它等于FFFFFFFFh,簇数是未知的。 1ECh 4 Cluster number at which you should begin a search for a free cluster, if this is equal to FFFFFFFFh then the field has not been set. 假如它等于FFFFFFFFh的话,你应当去寻找一个空闲簇的簇号码 。 此字段没有被设置。 1F0h 12 Reserved, set to 0. 被保留,设为 0 。 1FCh 4 Trailing Signature AA550000h. 结尾签名AA550000h 。 ------------------------------------------------------------------------------ Appendix B: Media Descriptor Byte(not used by grldr) 附录B:媒体描述字节(非用于grldr) The Media descriptor byte is meaningless because of the duplications, F0h for example. 此媒体描述字节没有意义,因为有些字节具有多重意义,例如 F0h 。 Byte Type of disk Sectors Heads Tracks Capacity 字节 磁盘种类 扇区 头 磁道 容量 ---- ------------ ------- ----- ------ -------- FFh 5 1/4" 8 2 40 320KB FEh 5 1/4" 8 1 40 160KB FDh 5 1/4" 9 2 40 360KB FCh 5 1/4" 9 1 40 180KB FBh both 9 2 80 640KB FAh both 9 1 80 320KB F9h 5 1/4" 15 2 80 1200KB F9h 3 1/2" 9 2 80 720KB F0h 3 1/2" 18 2 80 1440KB F0h 3 1/2" 36 2 80 2880KB F8h hard disk NA NA NA NA ****************************************************************************** *** grldr.mbr - 怎样将grldr.mbr写到硬盘的主引导磁道 *** ****************************************************************************** grldr.mbr包含能够用作主引导记录的代码。此代码负责搜索所有分区的grldr,并且在发现 它后装载它。现在被支持的分区种类是:FAT12/FAT16/FAT32,NTFS,EXT2/EXT3。在扩展分区 上的逻辑分区也被支持,条件是此扩展分区与微软兼容。实际上,搜索机制没有充分地测试 分区类型(0x85 )的Linux 的扩展分区。 怎样将 GRLDR.MBR 写到硬盘的主引导磁道? 首先,读入 Windows 磁盘签名及分区信息字节(总共72字节,从主引导记录的偏移 0x01b8到0x01ff处),并且放置到GRLDR.MBR的开始扇区的相同范围的偏移0x01b8 到0x01ff处。 如果硬盘上的主引导记录是由微软的FDISK产生的单一的扇区主引导记录, 可以选择把它复制到GRLDR.MBR的第二扇区。 GRLDR.MBR的第二扇区叫作“原先的主引导记录”。当找不到GRLDR后,将从“原先的主引 导记录”开始引导。 不需要其它的步骤,当所有的上述的必要的改变已经完成后,现在只要将GRLDR.MBR写到 主引导磁道。这就全部完成了。 注意:主引导磁道表示的是硬盘的第一条磁道。 注意:GRLDR.MBR 的自举代码只在分区的根目录寻找GRLDR。你最好把menu.lst文件和GRLDR 放置在一起。(就是说放在和 GRLDR 相同分区的相同根目录下。) “grldr” 文件名在ext2分区中必须是小写字母,而且grldr的文件种类必须是纯普通文件。 其它种类,例如,符号链接文件也是不行的。 更新: bootlace.com 是一个在 DOS/LINUX 下的能把 grldr.mbr 安装到主引导记录 的工具。整个grldr.mbr被嵌入到bootlace.com工具内部,因此 bootlace.com可以独 立使用。参见后面。 以下内容供开发人员参考..... ****************************************************************************** *** grldr.mbr - Details about the control bytes *** ****************************************************************************** grldr.mbr - 其控制字节的详述 Six bytes can be used to control the boot process of GRLDR.MBR. 有六个字节可以控制GRLDR.MBR引导过程。 Offset Length Description 偏移量 长度 说明 ====== ====== ============================================================== 02h 1 bit0=1: disable the search for GRLDR on floppy bit0=0: enable the search for GRLDR on floppy 第 0 位=1 :允许搜索软盘上的GRLDR 。 第 0 位=0 :禁止搜索软盘上的GRLDR 。 bit1=1: disable the boot of PREVIOUS MBR with invalid partition table(usually an OS boot sector) bit1=0: enable the boot of PREVIOUS MBR with invalid partition table(usually an OS boot sector) 第 1 位=1 :禁止引导分区表无效的原主引导记录 (通常是一个操作系统的引导扇区) 第 1 位=0 :允许引导分区表无效的原主引导记录 (通常是一个操作系统的引导扇区) bit2=1: disable the feature of unconditional entrance to the command-line(See below `--duce') bit2=0: enable the feature of unconditional entrance to the command-line(See below `--duce') 第 2 位 = 1 :禁止无条件进入命令行 (见下面的`--duce') 第 2 位 = 0 :允许无条件进入命令行(见下面的`--duce') bit3=1: disable geometry tune(See below `--chs-no-tune') bit3=0: enable geometry tune(See below `--chs-no-tune') 第 3 位= 1 :禁止改变磁盘几何参数(见下面的 `--chs-no-tune') 第 3 位= 0 :允许改变磁盘几何参数(见下面的 `--chs-no-tune') bit4 - bit6: reserved 第 4 位到第 6 位:被保留 bit7=1: try to boot PREVIOUS MBR after the search for GRLDR bit7=0: try to boot PREVIOUS MBR before the search for GRLDR 第 7 位=1:在搜索 GRLDR 之后尝试引导原先的主引导记录 第 7 位=0:在搜索 GRLDR 之前尝试引导原先的主引导记录 03h 1 timeout in seconds to wait for a key press. 0xff stands for waiting all the time(endless). 等待键被按下时的暂停秒数。0xff代表始终暂停(即无休止的)。 04h 2 hot-key code. high byte is scan code, low byte is ASCII code. the default value is 0x3920, which stands for the space bar. if this key is pressed, GRUB will be started prior to the boot of previous MBR. See "int 16 keyboard scan codes" below. 热键代码。高字节是扫描码,低字节是ASCII码。默认值是0x3920,代 表的是空格键。如果此键被按下,GRUB将在引导原先的主引导记录之前 启动。见“ int16 键盘扫描码”。 06h 1 preferred boot drive number, 0xff for no-drive 优先引导的驱动器号,0xff 代表没有。 07h 1 preferred partition number, 0xff for whole drive 优先引导的分区号,0xff 代表整个驱动器。 if the preferred boot drive number is 0xff, the order of the search for GRLDR will be: 如果优先引导的驱动器号是0xff,搜索 GRLDR 的顺序是: (hd0,0), (hd0,1), ..., (hd0,L),(L=max partition number) (hd1,0), (hd1,1), ..., (hd1,M),(M=max partition number) ... ... ... ... ... ... ... ... (hdX,0), (hdX,1), ..., (hdX,N),(N=max partition number) (X=max harddrive number) (fd0) otherwise, if the preferred boot drive number is Y(not equal to 0xff) and the preferred partition number is K, then the order of the search for GRLDR will be: 否则,如果优先引导的驱动器号假定为Y (且不等于0xff),而优先引导 的分区号为K,那么搜索 GRLDR 的顺序是: (Y) if K=0xff; or (Y,K) otherwise (hd0,0), (hd0,1), ..., (hd0,L),(L=max partition number) (hd1,0), (hd1,1), ..., (hd1,M),(M=max partition number) ... ... ... ... ... ... ... ... (hdX,0), (hdX,1), ..., (hdX,N),(N=max partition number) (X=max harddrive number) (fd0) Note: if Y < 0x80, then (Y) is floppy, else (Y) is harddrive, and (Y,K) is partition number K on harddrive (Y). 注意:如果Y小于0x80 ,那么这个(Y)驱动器代表软驱,否则就是硬盘驱动器。 而(Y,K)代表Y号硬盘驱动器上的 k 号分区。 ****************************************************************************** *** bootlace.com - 安装GRLDR.MBR自举代码到MBR *** ****************************************************************************** BOOTLACE.COM 能将GRLDR的引导记录安装到硬盘驱动器或硬盘映像文件的主引导记录中, 或者安装到软盘或者软盘映像的引导扇区。 用法: bootlace.com [OPTIONS] DEVICE_OR_FILE 选项 设备或文件 选项: --read-only 对指定的设备或文件执行所有操作,但是并不不真正地写入。 --restore-mbr 恢复原先的主引导记录。 --mbr-no-bpb 即使最靠前的是一个FAT分区,也不复制BPB表到主引导记录。 --no-backup-mbr 不复制旧的主引导记录到设备或文件的第二扇区。 --force-backup-mbr 强行复制主引导记录到设备或文件的第二扇区。 --mbr-enable-floppy 允许搜索软盘上的GRLDR 。 --mbr-disable-floppy 禁止搜索软盘上的GRLDR 。 --mbr-enable-osbr 允许引导分区表无效的原先的主引导记录(通常是 操作系统的引导扇区) --mbr-disable-osbr 禁止引导分区表无效的原先的主引导记录(通常是 操作系统的引导扇区) --duce 禁止无条件进入命令行功能。 任何人按‘C’键都可以正常取得命令行控制台,绕 过了所有的配置文件。(包括预置的配置文件)。 这是一种安全漏洞。所以我们需要这一选项来禁止这 种情况。 DUCE 即 Disable Unconditional Command-line Entrance 的缩写,意为无条件的(或不受控的)命令行入口。 --chs-no-tune 禁止磁盘几何参数修正功能。 --boot-prevmbr-first 在搜索GRLDR之前,先尝试引导原先的主引导记录。 --boot-prevmbr-last 在搜索GRLDR之后,再尝试引导原先的主引导记录。 --preferred-drive=D 优先引导的驱动器号,驱动器号D应大于0而小于255 。 --preferred-partition=P 优先引导的分区号,分区号P应大于0 而小于255 。 --serial-number=SN 为硬盘驱动器设置一个新的序列号码。SN必须是非零的数。 --time-out=T 在引导原先的主引导记录前等待 T 秒钟。如果T是0xff, 则始终等待。默认值是 5 。 --hot-key=K 如果热键被按下,在引导原先的主引导记录之前启动 GRUB 。K 是一个双字节的值,如同 int16/AH=1 返回 到AX寄存器的值一样。高字节是扫描码,低字节是ASCII 码。默认值是 0x3920,即空格键。参见“int16键盘扫描码”。 --floppy 如果设备或文件是软盘,使用这一选项。 --floppy=N 如果设备或文件是一个硬盘驱动器上的分区,使用此选项。 N用于指定分区号码:0 ,1,2 和 3 为主分区,而 4,5, 6,...等等为逻辑分区。 --sectors-per-track=S 为--floppy 选项指定每磁道扇区数。S 应大于1且小于63, 默认值是63 。 --heads=H 为--floppy选项指定磁头数,H应大于1且小于256 。默认值是255 。 --start-sector=B 为--floppy=N 选项指定隐藏扇区。 --total-sectors=C 为--floppy 选项指定总扇区数。默认值是 0 。 --lba 对--floppy 选项使用 lba 模式。如果软盘BIOS支持LBA, 你可以在这里指定--lba选项。理论上所有的软盘BIOS 都 支持CHS。因此你指定--chs选项更适当。如果--chs和--lba 选项都未被指定,那么LBA指示码(即引导扇区的第三字节) 将不被修改。 --chs 为--floppy选项使用chs模式。如果软盘BIOS不支持 LBA,你应当指定--chs选项。我们假定所有的软盘BIOS 都能支持CHS。所以你需要指定--chs 选项更为恰当。 如果既不指定--chs选项又不指定--lba选项,那么LBA 指示码(即,引导扇区的第三字节)将不被改变。 --fat12 --floppy选项使用时,确认安装到FAT12系统。 --fat16 --floppy选项使用时,确认安装到FAT16系统。 --fat32 --floppy选项使用时,确认安装到FAT32系统。 --vfat --floppy选项使用时,确认安装到FAT12/16/32等系统。 --ntfs --floppy选项使用时,确认安装到NTFS系统。 --ext2 --floppy选项使用时,确认安装到EXT2系统。 --install-partition=I 将引导记录安装到指定的硬盘驱动器或硬盘映像(设备或文件) 的第 I 号分区的引导区中。 DEVICE_OR_FILE: 设备或者映像文件的文件名。对于DOS,BIOS驱动器号(两位的十六进制 或三位的十进制数)可以被用来访问驱动器。BIOS驱动器号0表示第一软盘,1表示第二硬盘; 0x80 表示第一硬盘驱动器,0x81表示第二硬盘驱动器,等等。 注意:BOOTLACE.COM 仅仅是把引导代码写到MBR中。引导代码需要加载GRLDR作为GRUB启动 过程的第二(最后)阶段。因而在BOOTLACE.COM成功执行前或者是执行后,GRLDR应当被复 制到任一受支持分区的根目录下,当前受支持分区的文件系统类型仅有FAT12,FAT16,FAT32, NTFS,EXT2以及EXT3 。 注意 2:如果DEVICE_OR_FILE是硬盘设备或是硬盘映像文件,它必须包含有效的分区表, 否则,BOOTLACE.COM 将安装失败。如果设备或文件是指向软驱或者软盘映像文件,那么 他必须包含一个受支持的文件系统(FAT12/FAT16/FAT32/NTFS/EXT2/EXT3 等之一)。 注意 3:如果DEVICE_OR_FILE是软驱或软盘映像文件,而它又被格式化为EXT2或EXT3, 那么你必须明确指定--sectors-per-track 和 --heads 选项。 重要!! 如果你安装grldr的引导代码到一个软盘或者一个分区,此软盘或分区将只能从 grldr引导 ,而你原本的IO.SYS(DOS/Win9x/Me)和NTLDR(WinNT/2K/XP)将变为不能 引导。这是由于软盘或分区的原始引导记录被覆盖了。而把GRLDR的引导记录安装到MBR 则没有这个问题。 更新:在最新版本的GRUB4DOS中NTLDR,IO.SYS或KERNEL.SYS等文件,可以被直接加载。 提示:如果文件名的开始是短划线(-)或数字,你可以在它前面加上目录名(./) 或 (.\)。 示例: 在Linux下安装GRLDR的引导代码到MBR: bootlace.com /dev/hda 在DOS下安装GRLDR的引导代码到MBR: bootlace.com 0x80 在DOS或Linux下安装GRLDR的引导代码到硬盘映像: bootlace.com hd.img 在Linux下安装GRLDR的引导代码到软盘: bootlace.com --floppy --chs /dev/fd0 在DOS下安装GRLDR的引导代码到软盘: bootlace.com --floppy --chs 0x00 在DOS或Linux下安装GRLDR的引导代码到软盘映像: bootlace.com --floppy --chs floppy.img BOOTLACE.COM 无法在Windows NT/2000/XP/2003下正常运行。它被希望(和设计)用于 DOS/Win9x和Linux中。 更新:对于映像文件,在Windows NT/2000/XP/2003下,bootlace.com 可以正常使用。 bootlace.com不能在 Windows NT/2000/XP/2003 中运行的原因是,bootlace.com是一个DOS工具而 Windows NT/2000/XP/2003 不认可它对设备的访问,你可以通过WINHEX/DISKRW之类的工具来间接的完全这个操作. 一个DISKRW的例子在这里: http://bbs.znpc.net/viewthread.php?tid=5447 ****************************************************************************** *** kexec-tools should be patched for the 1.101 release *** ****************************************************************************** kexec-tools 应当打上1.101发布的补丁 The file kexec-tools-1.101-patch is a patch to the kexec-tools-1.101 release. Kexec might fail to load grub.exe without this patch. kexec-tools-1.101-patch 是为kexec-tools-1.101发布的补丁。没有这个补丁Kexec 加载 grub.exe 会失败。 The home page of kexec-tools is: kexec-tools 的主页是: http://www.xmission.com/~ebiederm/files/kexec/ Note: The Linux kernel should be KEXEC enabled before kexec can be run. 注意: 在使用 kexec 前应该使 Linux 核心支持 KEXEC 系统调用。 !! Important Update !! 重要更新 The patch `kexec-tools-1.101-patch' is not needed now and has been deleted. Even worse, it fails in `kexec -l grub.exe --initrd=imgfile'. So please do not use it any more. 现在不再需要`kexec-tools-1.101-patch'补丁而且它已经被删除了。很糟糕的是,执行 `kexec -l grub.exe --initrd=imgfile'竟会失败。所以请不要再使用它。 ****************************************************************************** *** Direct transition to DOS/Win9x from within Linux *** ****************************************************************************** 从Linux直接转换到DOS/Win9x 使用kexec,我们能够轻易地从运行中的 Linux 系统启动到 DOS/Win9x 。 假如 WIN98.IMG 是一个可引导的硬盘映像,按照如下操作: kexec -l grub.exe --initrd=WIN98.IMG --command-line="--config-file=map (rd) (hd0); map --hook; chainloader (hd0)+1; rootnoverify (hd0)" kexec -e 如果DOS.IMG是一个可引导的软盘映像,按照以下方法: kexec -l grub.exe --initrd=DOS.IMG --command-line="--config-file=map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" kexec -e 注意,按照这种方式,我们可以不用使用真实的 DOS/Win9x 磁盘就启动到 DOS/Win9x 。 我们不需要FAT分区而只需要一个映像文件。 我们已经注意到通过使用 kexec 和 grub.exe,Linux本身就能够成为一个大的引导管理器。 这给安装程序或者引导程序或者初始化程序的开发者带来了方便。 当然,grub.exe和可引导的磁盘映像也能够被运行中的GRUB 或LILO 或syslinux 加载。例如: 1.通过 GRUB 加载: kernel (hd0,0)/grub.exe --config-file="map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" initrd (hd0,0)/DOS.IMG boot 2.通过 LILO 加载: image=/boot/grub.exe label=grub.exe initrd=/boot/DOS.IMG append="--config-file=map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" 3.通过 SYSLINUX 加载: label grub.exe kernel grub.exe append initrd=DOS.IMG --config-file="map (rd) (fd0); map --hook; chainloader (fd0)+1; rootnoverify (fd0)" 注意:如果使用上面的‘map (rd) (...)’失败,你可以使用‘map (rd)+1 (...)’代替, 然后再试一次。 ****************************************************************************** *** Keyboard BIOS Scan Code/ASCII code tables *** ****************************************************************************** 键盘 BIOS 扫描码和 ASCII 码表 Keyboard bios scan code and ascii character code tables can be obtained from the web by, for example, googling for "3920 372A 4A2D 4E2B 352F". Here are 2 main results: 键盘 bios 扫描码和 ASCII 字符码表能够通过 web 网获取,例如,使用 google 查找 "3920 372A 4A2D 4E2B 352F"。这里有两项主要的结果: 1. From "http://heim.ifi.uio.no/~stanisls/helppc/scan_codes.html": 转自“http://heim.ifi.uio.no/~stanisls/helppc/scan_codes.html”: INT 16 - Keyboard Scan Codes INT 16 - 键盘扫描码 Key Normal Shifted w/Ctrl w/Alt 键位 常态 上档态 控制态 变更态 A 1E61 1E41 1E01 1E00 B 3062 3042 3002 3000 C 2E63 2E43 2E03 2E00 D 2064 2044 2004 2000 E 1265 1245 1205 1200 F 2166 2146 2106 2100 G 2267 2247 2207 2200 H 2368 2348 2308 2300 I 1769 1749 1709 1700 J 246A 244A 240A 2400 K 256B 254B 250B 2500 L 266C 264C 260C 2600 M 326D 324D 320D 3200 N 316E 314E 310E 3100 O 186F 184F 180F 1800 P 1970 1950 1910 1900 Q 1071 1051 1011 1000 R 1372 1352 1312 1300 S 1F73 1F53 1F13 1F00 T 1474 1454 1414 1400 U 1675 1655 1615 1600 V 2F76 2F56 2F16 2F00 W 1177 1157 1117 1100 X 2D78 2D58 2D18 2D00 Y 1579 1559 1519 1500 Z 2C7A 2C5A 2C1A 2C00 Key Normal Shifted w/Ctrl w/Alt 键位 常态 上档态 控制态 变更态 1 0231 0221 7800 2 0332 0340 0300 7900 3 0433 0423 7A00 4 0534 0524 7B00 5 0635 0625 7C00 6 0736 075E 071E 7D00 7 0837 0826 7E00 8 0938 092A 7F00 9 0A39 0A28 8000 0 0B30 0B29 8100 Key Normal Shifted w/Ctrl w/Alt 键位 常态 上档态 控制态 变更态 - 0C2D 0C5F 0C1F 8200 = 0D3D 0D2B 8300 [ 1A5B 1A7B 1A1B 1A00 ] 1B5D 1B7D 1B1D 1B00 ; 273B 273A 2700 ' 2827 2822 ` 2960 297E \ 2B5C 2B7C 2B1C 2600 (same as Alt L) , 332C 333C . 342E 343E / 352F 353F Key Normal Shifted w/Ctrl w/Alt 键位 常态 上档态 控制态 变更态 F1 3B00 5400 5E00 6800 F2 3C00 5500 5F00 6900 F3 3D00 5600 6000 6A00 F4 3E00 5700 6100 6B00 F5 3F00 5800 6200 6C00 F6 4000 5900 6300 6D00 F7 4100 5A00 6400 6E00 F8 4200 5B00 6500 6F00 F9 4300 5C00 6600 7000 F10 4400 5D00 6700 7100 F11 8500 8700 8900 8B00 F12 8600 8800 8A00 8C00 Key Normal Shifted w/Ctrl w/Alt 键位 常态 上档态 控制态 变更态 BackSpace 0E08 0E08 0E7F 0E00 Del 5300 532E 9300 A300 Down Arrow 5000 5032 9100 A000 End 4F00 4F31 7500 9F00 Enter 1C0D 1C0D 1C0A A600 Esc 011B 011B 011B 0100 Home 4700 4737 7700 9700 Ins 5200 5230 9200 A200 Keypad 5 4C35 8F00 Keypad * 372A 9600 3700 Keypad - 4A2D 4A2D 8E00 4A00 Keypad + 4E2B 4E2B 4E00 Keypad / 352F 352F 9500 A400 Left Arrow 4B00 4B34 7300 9B00 PgDn 5100 5133 7600 A100 PgUp 4900 4939 8400 9900 PrtSc 7200 Right Arrow 4D00 4D36 7400 9D00 SpaceBar 3920 3920 3920 3920 Tab 0F09 0F00 9400 A500 Up Arrow 4800 4838 8D00 9800 一些组合键不是在所有系统中都能获取。PS/2 包括了很多不能在PC, XT和 AT上获取的组合键。 - To retrieve the character from a scan code logical AND the word with 0x00FF. 由扫描码检索出字符可以用 0x00FF 和该字符进行逻辑与操作。 - see INT 16 MAKE CODES 参见INT16 通码 2. From "http://www.hoppie.nl/ivan/keycodes.txt": 转自“http://www.hoppie.nl/ivan/keycodes.txt”: Keystroke Keypress code -------------------------------------------------- Esc 011B 1 0231 2 0332 3 0433 4 0534 5 0635 6 0736 7 0837 8 0938 9 0A39 0 0B30 - 0C2D = 0D3D Backspace 0E08 Tab 0F09 q 1071 w 1177 e 1265 r 1372 t 1474 y 1579 u 1675 i 1769 o 186F p 1970 [ 1A5B ] 1B5D Enter 1C0D Ctrl ** a 1E61 s 1F73 d 2064 f 2166 g 2267 h 2368 j 246A k 256B l 266C ; 273B ' 2827 ` 2960 Shift ** \ 2B5C z 2C7A x 2D78 c 2E63 v 2F76 b 3062 n 316E m 326D , 332C . 342E / 352F Gray * 372A Alt ** Space 3920 Caps Lock ** F1 3B00 F2 3C00 F3 3D00 F4 3E00 F5 3F00 F6 4000 F7 4100 F8 4200 F9 4300 F10 4400 F11 8500 F12 8600 Num Lock ** Scroll Lock ** White Home 4700 White Up Arrow 4800 White PgUp 4900 Gray - 4A2D White Left Arrow 4B00 Center Key 4C00 White Right Arrow 4D00 Gray + 4E2B White End 4F00 White Down Arrow 5000 White PgDn 5100 White Ins 5200 White Del 5300 SysReq ** Key 45 [1] 565C Enter (number keypad) 1C0D Gray / 352F PrtSc ** Pause ** Gray Home 4700 Gray Up Arrow 4800 Gray Page Up 4900 Gray Left Arrow 4B00 Gray Right Arrow 4D00 Gray End 4F00 Gray Down Arrow 5000 Gray Page Down 5100 Gray Insert 5200 Gray Delete 5300 Shift Esc 011B ! 0221 @ 0340 # 0423 $ 0524 % 0625 ^ 075E & 0826 * (white) 092A ( 0A28 ) 0B29 _ 0C5F + (white) 0D2B Shift Backspace 0E08 Shift Tab (Backtab) 0F00 Q 1051 W 1157 E 1245 R 1352 T 1454 Y 1559 U 1655 I 1749 O 184F P 1950 { 1A7B } 1B7D Shift Enter 1C0D Shift Ctrl ** A 1E41 S 1F53 D 2044 F 2146 G 2247 H 2348 J 244A K 254B L 264C : 273A " 2822 ~ 297E | 2B7C Z 2C5A X 2D58 C 2E43 V 2F56 B 3042 N 314E M 324D < 333C > 343E ? 353F Shift Gray * 372A Shift Alt ** Shift Space 3920 Shift Caps Lock ** Shift F1 5400 Shift F2 5500 Shift F3 5600 Shift F4 5700 Shift F5 5800 Shift F6 5900 Shift F7 5A00 Shift F8 5B00 Shift F9 5C00 Shift F10 5D00 Shift F11 8700 Shift F12 8800 Shift Num Lock ** Shift Scroll Lock ** Shift 7 (number pad) 4737 Shift 8 (number pad) 4838 Shift 9 (number pad) 4939 Shift Gray - 4A2D Shift 4 (number pad) 4B34 Shift 5 (number pad) 4C35 Shift 6 (number pad) 4D36 Shift Gray + 4E2B Shift 1 (number pad) 4F31 Shift 2 (number pad) 5032 Shift 3 (number pad) 5133 Shift 0 (number pad) 5230 Shift . (number pad) 532E Shift SysReq ** Shift Key 45 [1] 567C Shift Enter (number pad) 1C0D Shift Gray / 352F Shift PrtSc ** Shift Pause ** Shift Gray Home 4700 Shift Gray Up Arrow 4800 Shift Gray Page Up 4900 Shift Gray Left Arrow 4B00 Shift Gray Right Arrow 4D00 Shift Gray End 4F00 Shift Gray Down Arrow 5000 Shift Gray Page Down 5100 Shift Gray Insert 5200 Shift Gray Delete 5300 Ctrl Esc 011B Ctrl 1 -- Ctrl 2 (NUL) 0300 Ctrl 3 -- Ctrl 4 -- Ctrl 5 -- Ctrl 6 (RS) 071E Ctrl 7 -- Ctrl 8 -- Ctrl 9 -- Ctrl 0 -- Ctrl - 0C1F Ctrl = -- Ctrl Backspace (DEL) 0E7F Ctrl Tab 9400 Ctrl q (DC1) 1011 Ctrl w (ETB) 1117 Ctrl e (ENQ) 1205 Ctrl r (DC2) 1312 Ctrl t (DC4) 1414 Ctrl y (EM) 1519 Ctrl u (NAK) 1615 Ctrl i (HT) 1709 Ctrl o (SI) 180F Ctrl p (DEL) 1910 Ctrl [ (ESC) 1A1B Ctrl ] (GS) 1B1D Ctrl Enter (LF) 1C0A Ctrl a (SOH) 1E01 Ctrl s (DC3) 1F13 Ctrl d (EOT) 2004 Ctrl f (ACK) 2106 Ctrl g (BEL) 2207 Ctrl h (Backspace) 2308 Ctrl j (LF) 240A Ctrl k (VT) 250B Ctrl l (FF) 260C Ctrl ; -- Ctrl ' -- Ctrl ` -- Ctrl Shift ** Ctrl \ (FS) 2B1C Ctrl z (SUB) 2C1A Ctrl x (CAN) 2D18 Ctrl c (ETX) 2E03 Ctrl v (SYN) 2F16 Ctrl b (STX) 3002 Ctrl n (SO) 310E Ctrl m (CR) 320D Ctrl , -- Ctrl . -- Ctrl / -- Ctrl Gray * 9600 Ctrl Alt ** Ctrl Space 3920 Ctrl Caps Lock -- Ctrl F1 5E00 Ctrl F2 5F00 Ctrl F3 6000 Ctrl F4 6100 Ctrl F5 6200 Ctrl F6 6300 Ctrl F7 6400 Ctrl F8 6500 Ctrl F9 6600 Ctrl F10 6700 Ctrl F11 8900 Ctrl F12 8A00 Ctrl Num Lock -- Ctrl Scroll Lock -- Ctrl White Home 7700 Ctrl White Up Arrow 8D00 Ctrl White PgUp 8400 Ctrl Gray - 8E00 Ctrl White Left Arrow 7300 Ctrl 5 (number pad) 8F00 Ctrl White Right Arrow 7400 Ctrl Gray + 9000 Ctrl White End 7500 Ctrl White Down Arrow 9100 Ctrl White PgDn 7600 Ctrl White Ins 9200 Ctrl White Del 9300 Ctrl SysReq ** Ctrl Key 45 [1] -- Ctrl Enter (number pad) 1C0A Ctrl / (number pad) 9500 Ctrl PrtSc 7200 Ctrl Break 0000 Ctrl Gray Home 7700 Ctrl Gray Up Arrow 8DE0 Ctrl Gray Page Up 8400 Ctrl Gray Left Arrow 7300 Ctrl Gray Right Arrow 7400 Ctrl Gray End 7500 Ctrl Gray Down Arrow 91E0 Ctrl Gray Page Down 7600 Ctrl Gray Insert 92E0 Ctrl Gray Delete 93E0 Alt Esc 0100 Alt 1 7800 Alt 2 7900 Alt 3 7A00 Alt 4 7B00 Alt 5 7C00 Alt 6 7D00 Alt 7 7E00 Alt 8 7F00 Alt 9 8000 Alt 0 8100 Alt - 8200 Alt = 8300 Alt Backspace 0E00 Alt Tab A500 Alt q 1000 Alt w 1100 Alt e 1200 Alt r 1300 Alt t 1400 Alt y 1500 Alt u 1600 Alt i 1700 Alt o 1800 Alt p 1900 Alt [ 1A00 Alt ] 1B00 Alt Enter 1C00 Alt Ctrl ** Alt a 1E00 Alt s 1F00 Alt d 2000 Alt f 2100 Alt g 2200 Alt h 2300 Alt j 2400 Alt k 2500 Alt l 2600 Alt ; 2700 Alt ' 2800 Alt ` 2900 Alt Shift ** Alt \ 2B00 Alt z 2C00 Alt x 2D00 Alt c 2E00 Alt v 2F00 Alt b 3000 Alt n 3100 Alt m 3200 Alt , 3300 Alt . 3400 Alt / 3500 Alt Gray * 3700 Alt Space 3920 Alt Caps Lock ** Alt F1 6800 Alt F2 6900 Alt F3 6A00 Alt F4 6B00 Alt F5 6C00 Alt F6 6D00 Alt F7 6E00 Alt F8 6F00 Alt F9 7000 Alt F10 7100 Alt F11 8B00 Alt F12 8C00 Alt Num Lock ** Alt Scroll Lock ** Alt Gray - 4A00 Alt Gray + 4E00 Alt 7 (number pad) # Alt 8 (number pad) # Alt 9 (number pad) # Alt 4 (number pad) # Alt 5 (number pad) # Alt 6 (number pad) # Alt 1 (number pad) # Alt 2 (number pad) # Alt 3 (number pad) # Alt Del -- Alt SysReq ** Alt Key 45 [1] -- Alt Enter (number pad) A600 Alt / (number pad) A400 Alt PrtSc ** Alt Pause ** Alt Gray Home 9700 Alt Gray Up Arrow 9800 Alt Gray Page Up 9900 Alt Gray Left Arrow 9B00 Alt Gray Right Arrow 9D00 Alt Gray End 9F00 Alt Gray Down Arrow A000 Alt Gray Page Down A100 Alt Gray Insert A200 Alt Gray Delete A300 ------------------------------------------------------------------------- Footnotes 脚注 [1] In the United States, the 101/102-key keyboard is shipped with 101 keys. Overseas versions have an additional key sandwiched between the left Shift key and the Z key. This additional key is identified by IBM (and in this table) as "Key 45." 在美国,101/102键键盘有101 个键。海外版本有一个附加的键,夹在 左上档键和Z 键之间。此附加键是由IBM 确定的(在本表中是 45 键)。 [**] Keys and key combinations marked ** are used by the ROM BIOS but do not put values into the keyboard buffer. 键及键组合若有 ** 标记,则被ROM BIOS所使用,但不会将键值放入键盘 缓冲区。 [--] Keys and key combinations marked -- are ignored by the ROM BIOS. 键及键组合若有 -- 标记,则被ROM BIOS所忽略。 3. From "http://heim.ifi.uio.no/~stanisls/helppc/make_codes.html": 转自“http://heim.ifi.uio.no/~stanisls/helppc/make_codes.html”: INT 9 - Hardware Keyboard Make/Break Codes INT 9 - 硬件键盘的通/断码 Key Make Break Key Make Break 键位 通码 断码 键位 通码 断码 Backspace 0E 8E F1 3B BB Caps Lock 3A BA F2 3C BC Enter 1C 9C F3 3D BD Esc 01 81 F4 3E BE Left Alt 38 B8 F7 41 C1 Left Ctrl 1D 9D F5 3F BF Left Shift 2A AA F6 40 C0 Num Lock 45 C5 F8 42 C2 Right Shift 36 B6 F9 43 C3 Scroll Lock 46 C6 F10 44 C4 Space 39 B9 F11 57 D7 Sys Req (AT) 54 D4 F12 58 D8 Tab 0F 8F Keypad Keys Make Break 数字小键盘键位 通码 断码 Keypad 0 (Ins) 52 D2 Keypad 1 (End) 4F CF Keypad 2 (Down arrow) 50 D0 Keypad 3 (PgDn) 51 D1 Keypad 4 (Left arrow) 4B CB Keypad 5 4C CC Keypad 6 (Right arrow) 4D CD Keypad 7 (Home) 47 C7 Keypad 8 (Up arrow) 48 C8 Keypad 9 (PgUp) 49 C9 Keypad . (Del) 53 D3 Keypad * (PrtSc) 37 B7 Keypad - 4A CA Keypad + 4E CE Key Make Break Key Make Break 键位 通码 断码 键位 通码 断码 A 1E 9E N 31 B1 B 30 B0 O 18 98 C 2E AE P 19 99 D 20 A0 Q 10 90 E 12 92 R 13 93 F 21 A1 S 1F 9F G 22 A2 T 14 94 H 23 A3 U 16 96 I 17 97 V 2F AF J 24 A4 W 11 91 K 25 A5 X 2D AD L 26 A6 Y 15 95 M 32 B2 Z 2C AC Key Make Break Key Make Break 键位 通码 断码 键位 通码 断码 1 02 82 - 0C 8C 2 03 83 = 0D 8D 3 04 84 [ 1A 9A 4 05 85 ] 1B 9B 5 06 86 ; 27 A7 6 07 87 ' 28 A8 7 08 88 ` 29 A9 8 09 89 \ 2B AB 9 0A 8A , 33 B3 0 0B 8B . 34 B4 / 35 B5 Enhanced Keyboard Keys (101/102 keys) 键盘扩展键 (101/102 键) Control Keys Make Break 控制键 通码 断码 Alt-PrtSc (SysReq) 54 D4 Ctrl-PrtSc E0 37 E0 B7 Enter E0 1C E0 9C PrtSc E0 2A E0 37 E0 B7 E0 AA Right Alt E0 38 E0 B8 Right Ctrl E0 1D E0 9D Shift-PrtSc E0 37 E0 B7 / E0 35 E0 B5 Pause E1 1D 45 E1 9D C5 (not typematic) Ctrl-Pause (Ctrl-Break) E0 46 E0 C6 (not typematic) - Keys marked as "not typematic" generate one stream of bytes without corresponding break scan code bytes (actually the break codes are part of the make code). 键位是以未使用断码扫描码字节信息的“非机器自动连续打印的"所 生成的一种扫描码字节流来标记的。(实际上断码是通码的一部分) (译注:typematic 有人翻译为‘机打’) Normal Mode or Shift w/Numlock 常态或上档态及 数字键盘锁定态模式 Key Make Break |----- Numlock on ------. 数字键盘锁定 Make Break 键位 通码 断码 通码 断码 Del E0 53 E0 D3 E0 2A E0 53 E0 D3 E0 AA Down arrow E0 50 E0 D0 E0 2A E0 50 E0 D0 E0 AA End E0 4F E0 CF E0 2A E0 4F E0 CF E0 AA Home E0 47 E0 C7 E0 2A E0 47 E0 C7 E0 AA Ins E0 52 E0 D2 E0 2A E0 52 E0 D2 E0 AA Left arrow E0 4B E0 CB E0 2A E0 4B E0 CB E0 AA PgDn E0 51 E0 D1 E0 2A E0 51 E0 D1 E0 AA PgUp E0 49 E0 C9 E0 2A E0 49 E0 C9 E0 AA Right arrow E0 4D E0 CD E0 2A E0 4D E0 CD E0 AA Up arrow E0 48 E0 C8 E0 2A E0 48 E0 C8 E0 AA Key |--Left Shift Pressed--. |--Right Shift Pressed--. 键位 左上档键按下时 右上档键按下时 Make Break Make Break 通码 断码 通码 断码 Del E0 AA E0 53 E0 D3 E0 2A E0 B6 E0 53 E0 D3 E0 36 Down arrow E0 AA E0 50 E0 D0 E0 2A E0 B6 E0 50 E0 D0 E0 36 End E0 AA E0 4F E0 CF E0 2A E0 B6 E0 4F E0 CF E0 36 Home E0 AA E0 47 E0 C7 E0 2A E0 B6 E0 47 E0 C7 E0 36 Ins E0 AA E0 52 E0 D2 E0 2A E0 B6 E0 52 E0 D2 E0 36 Left arrow E0 AA E0 4B E0 CB E0 2A E0 B6 E0 4B E0 CB E0 36 PgDn E0 AA E0 51 E0 D1 E0 2A E0 B6 E0 51 E0 D1 E0 36 PgUp E0 AA E0 49 E0 C9 E0 2A E0 B6 E0 49 E0 C9 E0 36 Right arrow E0 AA E0 4D E0 CD E0 2A E0 B6 E0 4D E0 CD E0 36 Up arrow E0 AA E0 48 E0 C8 E0 2A E0 B6 E0 48 E0 C8 E0 36 / E0 AA E0 35 E0 B5 E0 2A E0 B6 E0 35 E0 B5 E0 36 - The PS/2 models have three make/break scan code sets. The first set matches the PC & XT make/break scan code set and is the one listed here. Scan code sets are selected by writing the value F0 to the keyboard via the 8042 (port 60h). The following is a brief description of the scan code sets (see the PS/2 Technical Reference manuals for more information on scan code sets 2 and 3): PS/2 类型有三套通断扫描码。其中第一套是适用于PC & XT 的通断码扫描码集, 并列在了这里。扫描码集可以通过向8042 键盘控制器(端口60)写入值 F0 来 选择。下面是扫描码集的简要介绍(更多第2,3套扫描码集的信息见PS/2 技术 参考手册) / set 1, each key has a base scan code. Some keys generate extra scan codes to generate artificial shift states. This is similar to the standard scan code set used on the PC and XT. 第一套扫描码集,每个键具有一个基本的扫描码。一些键产生扩展扫 描码以便人工生成上档状态。它与 PC 和 XT 机上的标准扫描码相似。 / set 2, each key sends one make scan code and two break scan codes bytes (F0 followed by the make code). This scan code set is available on the IBM AT also. 第二套扫描码集,每个键发送一个通码扫描码和两个断码扫描码字节 (通码在F0之后)。这套扫描码集在 IBM AT 机上也有效。 / set 3, each key sends one make scan code and two break scan codes bytes (F0 followed by the make code) and no keys are altered by Shift/Alt/Ctrl keys. 第三套扫描码集,每个键发送一个通码扫描码和两个断码扫描码字节 (通码在F0之后)并且键位不随 Shift/Alt/Ctrl 等键的使用而改变。 / typematic scan codes are the same as the make scan code “非机器自动连续打印的”扫描码和通码扫描码是相同的。 - Some Tandy 1000's do not handle Alt key combinations when multiple shift keys are pressed. The Alt-Shift-H combination loses the Alt. 一些 Tandy 1000 机器在多重组合键的 shift 键被按下时不能处理 ALT 键。 使用键组合 Alt-Shift-H 时会丢失 ALT 键。 - extended keys like (F11, F12) can only be read with systems that have extended keyboard BIOS support (or INT 9 extensions); to read these special keys on these systems INT 16,10 must be used 扩展键比如(F11,F12)等只能在具有 BIOS 键盘扩展支持(或 INT 9 扩展) 的系统上被读取。用INT16读取这些系统上的特别的键时,必须使用10号功能 。 ****************************************************************************** *** GRLDR Error messages *** ****************************************************************************** GRLDR 错误提示信息 1. Missing MBR-helper. 缺少主引导辅助记录。 紧接在主引导记录后的辅助功能程序不见了,或者是它已经被病毒或 Windows XP/Vista等删除了。 运行 bootlace.com 工具来解决这个问题。 2. Buggy BIOS! 缺陷太多的BIOS! 你的 BIOS 太糟糕了。它甚至不能支持 INT 13/AH=8 。 除了升级你的 BIOS 没有办法解决。未来,缺陷多的 BIOS 将会很常见而且 会对 grub4dos 造成很多问题。 3. This partition is NTFS but with unknown boot record. Please install Microsoft NTFS boot sectors to this partition correctly, or create an FAT12/16/32 partition and place the same copy of GRLDR and MENU.LST there. 此分区系统是 NTFS 但包含未知的引导记录。请安装正确的微软 NTFS 引导扇区到 这个分区,或者建立一个FAT12/16/32的分区并将GRLDR 及MENU.LST 的相同的备份 文件放到那里。 The boot record was changed or erased by Microsoft Windows XP Service Pack 2. 引导记录已经被微软 Windows XP Service Pack 2 改变或删除。 You may install the old boot record introduced with the original clean Windows 2K/XP. As another solution, you may create an FAT partition for your system, and copy GRLDR and your MENU.LST to its root dir. 你可以用原来的引导记录来安装,以清理掉Windows 2K/XP的记录。另一个解决办 法是,你可以在系统上建立一个FAT分区,并且将GRLDR 和你的MENU.LST复制到它 的根目录。 While the startup code of grldr might fail to load GRLDR in NTFS partitions, it always successfully loads GRLDR in FAT partitions(and even in ext2/ext3 partitions). 在NTFS分区grldr的自举代码在加载GRLDR时可能会失败,但在FAT分区(甚至在 ext2/ext3分区)它总能成功加载 GRLDR 。 Note that NTLDR only loads the startup code of grldr(i.e., the leading 16 sectors of grldr), not the whole grldr file. 注意 NTLDR只能加载grldr的自举代码(即,grldr开头的16个扇区),而不能将 整个grldr载入。 Thus, C:\GRLDR must exist(here C: can be NTFS), since it is used for BOOT.INI and NTLDR. If C: is NTFS, X:\GRLDR should exist as well, where X: stands for a certain FAT partition. 因此,自从它用于 BOOT.INI 和 NTLDR 以来 ,C 盘根目录下必须存在有GRLDR (这里的C盘可以是 NTFS 文件系统)。 ****************************************************************************** *** Known BIOS bugs *** ****************************************************************************** 已知的BIOS 缺陷 1. 一些较新的 Dell 机不能支持int13/AH=43h 。当你尝试对仿真磁盘进行写访问时, 可能会遭遇失败。 注意:这个缺陷非常严重!老的安装方法"root+setup" (在实模式的grub环 境中)使用INT13将stage2文件写入第一扇区。在这些有缺陷的DELL机上通过 LBA 模式来访问 stage2 文件时将会失败。 2.一些有缺陷的BIOS不能引导启动光盘映像文件(见前面)。(虚拟机qemu 能良好的引导) 3.在DOS下运行GRUB.EXE时,一些较新的 Dell 机激烈地破坏那些硬件中断请求的中断向量, 而使得机器会失去响应 。你可以尝试用BADGRUB.EXE来再试一次。 4.有报告称,通过Linux中的kexec启动GRUB.EXE后,一些BIOS将功能异常。报告称一些 机器会死机,而另一些不能访问USB驱动器。 ****************************************************************************** *** Known Problems *** ****************************************************************************** 已知问题 1. 在 Windows 9x/Me的DOS窗口运行GRUB.EXE时可能会死机,特别是在这些系统 使用USB的时候。在Linux下通过KEXEC运行GRUB.EXE时,你也可能碰到同样的 问题。 注意: 你不能在已进入保护模式的Win 9x 中运行GRUB.EXE,那可能会死机;作为变 通,你可以执行“重启并进入MS-DOS模式”选项来达到运行 GRUB.EXE 的目 的,这很安全。 2. 默认的chainloader动作将保持 A20 的状态。一些有缺陷的 DOS 扩展内存管理软 件可能会令机器死掉。你可以在chainloader命令行中使用--disable-a20选项 然后再试一次。至少,你应当避免使用那些有缺陷的内存管理软件。 3. THTF BIOS L4S5M Ver 1.1a(dated 2002-1-10) has a buggy int15 which causes hang at the boot of a multi boot kernel(memdisk for example). OEM签名为清华同方,主板为精英L4S5M, BIOS版本1.1a(日期 2002-1-10) 的机器上,其 int15 含有缺陷,当它启动一个多重引导核心时,会失去响应。 (比如使用syslinux的memdisk时) 4. 在天汇标准中文系统中,较新的GRUB.EXE不能运行。 总之,在具有反跟踪措施的内存驻留程序的系统下GRUB.EXE不再运行。 ****************************************************************************** *** List of binary files and their corresponding source files *** ****************************************************************************** 二进制文件及对应的源代码文件列表 binary file main source file other included source or binary files 二进制文件 源代码主文件 包含的其他源代码或二进制文件 ------------- ---------------- ------------------------------------- bootlace.com bootlacestart.S bootlace.inc, grldrstart.S grldr grldrstart.S pre_stage2(binary, See note below) grldr.mbr mbrstart.S grldrstart.S grub.exe dosstart.S pre_stage2(binary, See note below) hmload.com hmloadstart.S ----------------------------------------------------------------------------- 注意:pre_stage2 是GNU GRUB的主体程序,它以二进制格式被简单的添加到grldrstart 及dosstart部分,形成我们的grldr和grub.exe 。 注意:GRUB (无.exe后缀)在Linux下是一个静态链接的 ELF 格式的可执行文件,它 可以被GRUB Shell正常调用。GRUB Shell 是一个启动管理软件,但并不是一个引导装 载器(boot 命令在GRUB Shell里不能执行)。GRUB.EXE (通过KEXEC)能作为一个引 导装载器直接在 Linux 下使用。 ****************************************************************************** *** Memory Layout for Quiting to DOS from GRUB.EXE *** ****************************************************************************** GRUB.EXE 返回 DOS 时的内存布局 使用 quit 命令实现返回到DOS,是在GRUB.EXE是从DOS启动的情况下。 1.在GRUB.EXE 将控制权移交给 pre_stage2 之前,它将复制 640 kb的常规内存到 物理地址0x200000 (即,2 M)处,并将立即写入4 字节的长整数到常规内存备 份区之后: At 0x2A0000: 0x50554B42, it is the "BKUP" signature. 0x50554b42, 它是“BKUP”的签名 。 At 0x2A0004: Gate A20 status under DOS: non-zero means A20 on; zero means A20 off. Update: A20 always on, see below. DOS下的A20地址线门状态:非零表示A20开启;零表示A20 地址线关闭。更新:A20 始终开启,参见后面。 At 0x2A0008: high word is boot-CS, low word is boot-IP. The quit command uses this entry point to return to DOS. 高字节是引导的代码段段地址,低字节是引导的指令指针值。 退出命令 quit 使用这个入口点返回DOS。 At 0x2A000C: CheckSum: the sum of all long integers in the memory range from 0x200000 to 0x2A000F is 0. 校验和:内存范围从0x200000 到 0x2A000F的所有长整数的 和为 0 。 2.如果上述内存结构被某个grub命令所破坏,quit命令将发出一条错误提示信息而拒绝从grub中返回DOS。 3.由于GRUB可能破坏扩展内存,在DOS下你最好避免在GRUB.EXE运行前使用扩展内存。 4. Gate A20 will be enabled by GRUB.EXE. Hopefully this would hurt nothing. GRUB.EXE将开启A20 地址线。真希望这不会危及任何东西。 ****************************************************************************** *** Memory usage in conventional/low memory area *** ****************************************************************************** 常规内存/低端内存空间的内存使用 1. boot.c, fsys_reiserfs.c: 8K below 0x68000. 2. fsys_ext2fs.c, fsys_minix.c: 1K below 0x68000. 3. fsys_jfs.c: 4K + 256 bytes below 0x68000. 4. fsys_reiserfs.c: 202 bytes at 0x600. 5. fsys_xfs.c: 188 bytes at 0x600. 6. fsys_xfs.c: (logical block size) bytes below 0x68000. 7. geometry tune: 0x50000 - 0x5ffff. ****************************************************************************** *** Command-line Length about GRUB.EXE *** ****************************************************************************** 关于GRUB.EXE的命令行长度 GRUB.EXE 可以通过CONFIG.SYS中的DEVICE命令来启动: DEVICE=grub.exe [--config-file="FILENAME_OR_COMMANDS"] 1. 如果GRUB.EXE是被DEVICE命令调用而且FILENAME_OR_COMMANDS 参数是一个由分号分 隔的grub命令集合,那么FILENAME_OR_COMMANDS可以接近4 KB长 ----很吃惊?但这是 事实!MS-DOS 7及以上版本即使允许更长的行,但看起来4 KB对GRUB.EXE足够了。 当我们希望将一个大菜单嵌入到命令行时,这是非常有用的。注意 grldr 还不支持 任何命令行参数。 2. 如果GRUB.EXE是被INSTALL命令调用,那么选项长度的限制是80个字符(包括开头的 --config-file= 这部分)。超出的话可能会立即将MS-DOS挂起。 3. 如果GRUB.EXE是被SHELL命令调用,那么选项长度的的限制是126个字符(包括开头的 --config-file= 这部分)。超出的话虽然不会将 MS-DOS 挂起,但命令行将被截短。 这和 DOS 控制台或批处理文件中命令的限制是一样的。 4. DOS编辑器EDIT不支持一行4KB的长度。所以请使用其他编辑器,例如,vi for Linux 。 5. DEVICE=GRUB.EXE 这一行可以和其他的DEVICE命令同时使用,如DEVICE=HIMEM.SYS 及DEVICE=EMM386.EXE等。配置命令里的GRUB.EXE所在行必须出现在EMM386.EXE所在 行的前面,以避免因EMM386而冲突。 更新 :从0.4.2版本起,GRUB.EXE在EMM386.EXE加载后,仍然可以运行。 6. 在以上提到的任何情况下,你都可以通过quit命令返回到DOS 。 7. 命令行菜单的内存占用:4KB的命令行菜单起始于物理地址0x0800而终止于0x17ff。 ****************************************************************************** *** New Syntax for the DEFAULT/SAVEDEFAULT Commands *** ****************************************************************************** DEFAULT 及 SAVEDEFAULT 命令的新语法 相对于原来的用法"default NUM"及"default saved "增加的部分,现在有一个新用 法"default FILE",象这样: default (hd0,0)/default 注意参数FILE必须是一个有效的DEFAULT文件格式。一个简单的DEFAULT文件就包含 在发行版中。你可以复制它到你希望的地方,但是你应该避免手工修改它的大小。 DEFAULT文件可以按以下方法使用: (1) 首先,你要复制一个格式有效的default文件到你运行的系统上。 (2) 其次,你要使用GRUB中的"default FILE"命令来表明是使用这个FILE作为我们新 的预设文件,以便"savedefault"命令执行时写入它。 (3) 然后,你可以使用"savedefault"命令来把想要的入口数字保存到这个新的预设文 件中。 (4) 下次启动时,你可以通过使用类似上面第二步骤中的"default FILE"一样的 命令来读取已保存的入口数字。 同时,SAVEDEFAULT 命令增加了一个选项 --wait=T ,象这样: savedefault --wait=5 如果`--wait=T' 选项被指定而且 T 非零,savedefault 命令将在它就要写入磁盘 前,给使用者一个提示信息。 这里是一个简单的menu.lst文件: #--------------------begin menu.lst--------------------------------------- color black/cyan yellow/cyan timeout 30 default /default title find and load NTLDR of Windows NT/2K/XP find --set-root /ntldr chainloader /ntldr savedefault --wait=2 title find and load CMLDR, the Recovery Console of Windows NT/2K/XP fallback 2 find --set-root /cmldr chainloader /cmldr ##################################################################### # write string "cmdcons" to memory 0000:7C03 in 2 steps: ##################################################################### # step 1. Write 4 chars "cmdc" at 0000:7C03 write 0x7C03 0x63646D63 # step 2. Write 3 chars "ons" and an ending null at 0000:7C07 write 0x7C07 0x00736E6F savedefault --wait=2 title find and load IO.SYS of Windows 9x/Me find --set-root /io.sys chainloader /io.sys savedefault --wait=2 title floppy (fd0) chainloader (fd0)+1 rootnoverify (fd0) savedefault --wait=2 title find and boot Linux with menu.lst already installed find --set-root /sbin/init savedefault --wait=2 configfile /boot/grub/menu.lst title find and boot Mandriva with menu.lst already installed find --set-root /etc/mandriva-release savedefault --wait=2 configfile /boot/grub/menu.lst title back to dos savedefault --wait=2 quit title commandline savedefault --wait=2 commandline title reboot savedefault --wait=2 reboot title halt savedefault --wait=2 halt #--------------------end menu.lst--------------------------------------- 注意 1:预设文件 DEFAULT 必须是存在的而且具有和前面所述一样严格的格式。 注意 2:在一个有 MENU.LST 文件的相同目录中的 DEFAULT 文件将和 MENU.LST 文 件一起被联合调用 注意 3:即使没有出现`default'命令,被关联的 DEFAULT 文件也将自动生效。 注意 4:就在菜单文件(诸如,GRLDR 的关联文件MENU.LST,或是通过 `grub.exe --config-file=(DEVICE)/PATH/YOUR_MENU_FILE'来指定的, 或是通过grub的`configfile'命令来指定的)取得控制权之前,它的 关联文件DEFAULT只要出现就会被使用,直到遇见了一个明确的`default'命令。 ****************************************************************************** *** The New `cdrom' Command Syntax *** ****************************************************************************** 新的 `cdrom' 命令的语法 1. 初始化ATAPI接口的CDROM设备: grub> cdrom --init 显示找到的atapi接口的cdrom光驱的数目:参数为 atapi_dev_count 2. 停止ATAPI接口的CDROM设备: grub> cdrom --stop 这会设置参数atapi_dev_count为0 。 3. 增加搜索atapi cdrom设备的IO端口。例如: grub> cdrom --add-io-ports=0x03F601F0 在执行`cdrom --init'以及`map --hook'命令后,cdrom光驱可以通过(cd0), (cd1), ...等设备号来访问。 注意 1:如果系统不完全支持ATAPI CD-ROM 规范,在你试图访问这些(cdX)设备时将 遭遇失败。 注意 2:在执行一条`cdrom --stop'命令后,你应当使用一条`map --unhook'命令。当然, 你可以再次使用`map --hook'命令,假如还有驱动器被映射着的话。 注意 3:在增加IO端口之后,你应当接着`cdrom --init'执行一条`map --unhook'命令然 后再接着执行一条`map --hook'命令。 默认将使用这些端口来搜索cdrom设备(因此不需要再添加了) 0x03F601F0, 0x03760170, 0x02F600F0, 0x03860180, 0x6F006B00, 0x77007300. 注意 4:BIOS可能已经提供了cdrom 的接口。它的设备号总是(cd)。在 `cdrom --init' 和 `map --hook' 执行后,我们可以有我们自己有效的(cd0), (cd1), ...等设备。 注意 5:你可以用块列表的方式去访问(cd)和 (cdX) 等设备。例子: cat --hex (cd0)16+2 cdrom 扇区是大小为 2048 字节的大扇区。 注意 6:我们的iso9660文件系统驱动具有Rock-Ridge扩展支持,但没有Joliet扩展支持。 因此当你试图在一个使用Joliet扩展的光盘上读取文件时,可能遭遇失败。 注意 7:现在,(cd)及 (cdX)设备可以被引导了。示例: chainloader (cd) boot chainloader (cd0) boot chainloader (cd1) boot 在chainloader (cd)之前,你必须保证已经可以访问该设备。 ****************************************************************************** *** About the New `setvbe' Command *** ****************************************************************************** 关于新命令 `setvbe' Gerardo Richarte contributed the `setvbe' code and the following comment: Gerardo Richarte 先生提供了`setvbe'的源码,下面是注释: New command is `setvbe', and can be used to change the video mode before executing the kernel. `setvbe'是一个新的命令,它可以在系统核心运行前被用来改变视频模式。 For example, you can do 例如,你可以执行 setvbe 1024x768x32 this will scan the list of available modes and set it, and automatically append a `video=' option to each subsequent kernel command-line. The appended `video=' option is like this: 这会扫描出其可用模式的列表并设置它,并且自动在随后的每个kernel命令 行中增加一个选项`video='。增加的选项`video='类似于: video=1024x768x32@0xf0000000,4096 where 0xf0000000 is the video framebuffer address as reported by vbe, and 4096 is the size of a scanline in bytes (also as reported by vbe). 这里的0xf0000000是vbe报告的视频模式的帧缓存地址,而4096是扫描线的字节大小。 This is really useful if you want to give some graphics support to your OS, but you don't want to implement any video functionality other than writing a pixel to video memory. 如果你想在你的操作系统上获得一些图形支持,但是除了只写一个像素点到视频内 存而外,你却不想使用任何视频功能,这确实有用。 ****************************************************************************** *** About the DOS utility `hmload' *** ****************************************************************************** 关于DOS工具`hmload' 此程序由 John Cobb 先生编写(伦敦玛丽皇后学院)。 John Cobb先生的注释: To make use of the ram drive feature I wrote a program `hmload' to load an arbitrary file to an arbitrary address in high memory. The program is not very sophisticated and relies on XMS to turn on the A20 line. (Also one must be very careful to steer clear of any areas of memory already in use). 为了使用内存驱动器的特性,我写了一个程序“hmload”来将任意文件加载 到高端内存的任意地址。这个程序不是十分深奥但依赖在XMS 里开启A20地址线。 (并且必须将那些已经使用了的任何内存空间精心的清理干净) Under Linux we generated a disk image `dskimg' (with the kernel and Initrd and a partition table). 我们在linux下生成一个磁盘映象“dskimg”(包含kernel和initrd及一个分区表)。 Using this our boot procedure looked something like this: 我们的引导过程看起来是下面这样: hmload -fdskimg -a128 fixrb grub map --ram-drive=0x81 map --rd-base=0x8000000 map --rd-size=0x400000 root (rd,0) kernel /kernel root=/dev/ram0 rw ip=bootp ramdisk_size=32768 ... initrd /initrd boot See http://sysdocs.stu.qmul.ac.uk/sysdocs/Comment/GrubForDOS/ for details. 详情参阅 http://sysdocs.stu.qmul.ac.uk/sysdocs/Comment/GrubForDOS/ Update 2007-12-05: 更新 2007-12-05 : Now the MAP command can handle gzipped (rd) image. One can use this feature with the hmload utility. For example, step 1. Load the gzipped image under DOS at a relatively low address: 步骤 1. 在DOS的相对较低的地址处加载gzip压缩映像: hmload -fdskimg.gz -a16 step 2. Unload network drivers. 步骤 2 卸载网络驱动器 step 3. Run GRUB.EXE. 步骤 3. 运行 GRUB.EXE step 4. At the grub prompt, run these commands: 步骤 4. 在grub 命令提示符下,执行下列命令: map --rd-base=0x1000000 # set rd-base address to be 16M # 设置rd-base地址为16M map --rd-size= < dsking.gz 精确的字节数 > map (rd)+1 (hd0) # This will decompress (rd) and place # the decompressed image at the top end # of the extended memory. The (rd)+1 # here has special meaning and stands # for the whole (rd) device. You must # use (rd)+1 instead of (rd). # 这会将(rd)解压并且把解压后的映像放到扩展内存的顶端。 # 这里的(rd)+1具有特定的含义而且将整个(rd)设备放到了顶端。 # 这里你必须使用 (rd)+1 来替代(rd)。 map --hook root (hd0,0) kernel /kernel root=/dev/ram0 rw ip=bootp ramdisk_size=32768 ... initrd /initrd map --unhook map (hd0) (hd0) # Delete the map; this is needed. # 删除map映射;这是需要的 boot ****************************************************************************** *** Notes on the use of stack *** ****************************************************************************** 关于堆栈的注释 The protected-mode and real-mode stack are merged at physical address 0x2000. 保护模式与实模式的堆栈被合并到物理地址 0x2000 处。 All functions should use at most 2K stack space(0x1800-0x2000). So each subfunction should use as little stack as possible to avoid stack-overflow. 所有的功能应当最多使用 2K 的堆空间 (0x1800到0x2000)。因此各个子功能部分 应当使用尽可能小的堆以避免堆栈溢出。 Don't use recursive functions because they could expend too much stack space. 不要使用递归功能,因为他们会消耗太多的堆空间。 The original protected mode stack at 0x68000(expand-down) is free now and can be reused for any purposes. 原来位于0x68000(向下延伸)的保护模式的堆现在不再使用,并且它可以被用于任何目的。 ****************************************************************************** *** A bug was found in the CDROM driver *** ****************************************************************************** CDROM 驱动器上发现的缺陷 似乎 cdrom 应当连接在IDE控制器的主设备通道上。 如果 cdrom 是从设备,读取cdrom扇区的驱动将失败。希望有人能解决这个问题。 ****************************************************************************** *** BIOS and the (cd) drive *** ****************************************************************************** BIOS 与 (cd)驱动器 当BIOS启动一个非模拟模式的可启动的CD-ROM设备时,它会分配一个BIOS驱动器号给这个 CD设备。如果这个CD-ROM使用grldr或stage2_eltorito作为启动映像文件,那么GRUB可以 通过BIOS分配的驱动器号来访问这个CD-ROM 媒体。 BIOS 会分配一个驱动器号给非模拟模式启动的CDROM 设备,即使这个CDROM 是不能启动的。 虚拟机QEMU就是这样处理的。在引导的时候,GRUB4DOS将搜索那些由BIOS分配的,驱动器号 从0x80至0xFF的,可能存在的非模拟模式的CDROM 驱动器。 所以,如果BIOS为CDROM提供了 扩展int13(功能号41h-4eh)接口,那么这个(cd)设备自动在GRUB4DOS 中有效。 ****************************************************************************** *** The way of disk emulation changed greatly *** ****************************************************************************** 磁盘仿真方式发生了巨大变化 磁盘仿真方式自从0.4.2正式版之后已经发生了巨大变化。在使用磁盘仿真功能时候, 请不要将较新的版本和旧的版本混合使用。 较新的版本不会自动卸载之前已经在grub4dos环境建立的仿真盘。GRUB.EXE 的一个 很古老的版本,在将控制权移交给grub主程序(即,pre_stage2)前,将会自动释放 先前建立的仿真盘。 ****************************************************************************** *** FreeDOS EMM386 v2.26 (2006-08-27) VCPI problem *** ****************************************************************************** FreeDOS EMM386 版本2.26 (2006-08-27) VCPI服务的问题 The VCPI function "AX=DE0Ch - Switch From Protected Mode to V86 Mode" of FreeDOS EMM386 v2.26 was not implemented properly(it always hangs). As an alternative, you can use Microsoft's EMM386 instead. FreeDOS 的 EMM386 版本2.26 中的VCPI服务,“功能号 AX=DE0Ch-选择从 保护模式到虚拟8086模式”,不能正确的执行(总是死机)。选择之一是, 你用微软的 EMM386 来代替它。 Even while emm386 is running, grub.exe can be started. But if you try to quit to DOS from grub4dos by using the `quit' command, the VCPI function DE0C will be called. If EMM386 is of Microsoft, everything goes ok. If EMM386 is of FreeDOS, the machine will hang. 即使emm386已经运行,grub.exe也能够启动。但是如果你试图从grub4dos中通过`quit' 命令来返回DOS,VCPI 服务的DE0C 号功能将被调用。如果是微软的 EMM386 ,接下来的 一切都很正常 。而如果是FreeDOS 的 EMM386 ,那么将会死机。 ****************************************************************************** *** New options for map were added *** ****************************************************************************** map 命令的新增选项 随着0.4.2 最终版的发布,map 命令有了两个新选项。它们是--safe-mbr-hook=SMH 以及--int13-scheme=SCH 。它们都和Win9x环境下(尽可能稳定的)使用磁盘仿真有关。 SMH参数可以是0或1这个两个值之一。作为默认,SMH参数为1 。如果你在Win9x中遇到 磁盘仿真的问题,你可以插入这样一行到`boot'命令之前, map --safe-mbr-hook=0 然后再试一次。 SCH在使用时,也可以取0或1之一的值。作为默认,SCH为1 。如果你在Win9x中遇到 磁盘仿真的问题,你可以插入这样一行到`boot'命令之前, map --int13-scheme=0 然后再试一次。 顺便提醒一下。类似于--safe-mbr-hook和--int13-scheme ,MAP命令中有几个其他 选项可被用以设置全局变量。 map --floppies=M 其中的M 可以是0 , 1 或者2 。MAP 将把一个恰当的M 值设置在地址0040:0010 处。 map --harddrives=N 其中的N 可以是从0到127之间的值。MAP将把N 值设置在0040:0075处。 map --memdisk-raw=RAW 其中的RAW默认为1 。如果RAW=0,将通过`int15/ah=87h'访问内存驱动器。 map --ram-drive=RD 其中RD默认是0x7F的软驱号。如果随机内存驱动器是一个硬盘驱动器镜像(第一扇区 含有分区表),那么你可以将 RD 设置为大于或等于0x80并且小于0xA0之间的值。 如果是一个光盘镜像,那需要设置为大于或等0xA0并且小于0xFF之间的值。 map --rd-base=ADDR map --rd-size=SIZE 其中的 ADDR 指定出内存映像的物理基地址。SIZE指定出内存映像的字节数大小。ADDR 默认为0 。SIZE的默认值也是0 ,但是值为0 表示4 GB ,而不是零字节长的磁盘。随机 内存驱动器可以在 GRUB 环境中通过使用 (rd) 设备来访问。 ****************************************************************************** *** About the new map option --in-situ *** ****************************************************************************** 关于 map 的新选项 --in-situ --in-situ被使用于硬盘驱动器映像或者是硬盘驱动器分区。通过--in-situ ,我们可以把 一个逻辑分区象征性的作为一个主分区来使用。 --in-situ 的映射是整个驱动器的映射。它只虚拟出分区表和 DBR 上的BPB里的隐藏扇区数。 尽管磁盘仿真在 win9x 中可能会遇到的各种问题,但在win9x中,in-situ的映射却运行得很好。 注意 --in-situ 的映射不会改变真实的分区表。 示例: map --in-situ (hd0,4)+1 (hd0) ****************************************************************************** *** The PARTNEW Command Syntax *** ****************************************************************************** PARTNEW 命令的语法 除了上述章节的仿真方法而外,你也可以替代选择用 PARTNEW 来建立一个新的主分区。 PARTNEW可以为逻辑分区生成一个新的主分区项(在分区表中)。 例如, partnew (hd0,3) 0x07 (hd0,4)+1 这里的(hd0,4)+1 代表了整个(hd0,4)分区。这条命令将建立一个分区类型为 0x07 的新的主分区(hd0,3),并且它的内容(即数据)和逻辑分区(hd0,4)一样。 就像整个逻辑分区时的情况一样,一个连续的分区映像文件也可以用在PARTNEW 命令中: partnew (hd0,3) 0x00 (hd0,0)/my_partition.img The type 0x00 indicates a type-auto-detection of the image MY_PARTITION.IMG. The above command will create a new primary partition (hd0,3) with a proper type and with contents/data being exactly that of the contiguous file (hd0,0)/my_partition.img. 这个 0x00 类型表示这个 MY_PARTITION.IMG 映像文件的分区类型由自动检测确定。 上面的命令将建立一个类型恰当的新的主分区(hd0,3),并且使用这个连续的 (hd0,0)/my_partition.img 文件中的全部内容(数据)作为它的内容(数据)。 PARTNEW 将自动修正 BPB 中的“隐藏扇区数”并且这个修改是永久的。而且PARTNEW 修改分区表也是永久的。 除了建立分区表项外,PARTNEW也可以用来删除(抹掉,擦除)一个分区表项。例如, partnew (hd0,3) 0 0 0 这样,主引导记录中最后一个分区表项将被清空。通常,你可以用"partnew PARTITION 0 0 0"的格式来 抹掉其分区表项,但是已经存储在这个分区中的数据不被影响。 ****************************************************************************** *** 命令控制符号 `&&' , `||' , `;;' , `&;' , `|;' *** ****************************************************************************** 基本语法: command1 符号 command2 符号 commandN.... 说明: && 或 '&;' 前面的命令返回值为`真`时,继续执行后面的命令. || 或 '|;' 前面的命令返回值为`假`时,继续执行后面的命令. ;; 不管前面的命令返回什么,都会继续执行后面的命令. 有没有';'的主要区别在于变量的扩展,因为变量扩展是执行一行命令前扩展一次. 带';'的会把一行的命令分隔成多行来执行.这样执行每个命令时都会被扩展一次. 可以根据实际情况选用适合的符号 如果你需要在命令中获取该行命令执行过程之中产生的变量就要用带';'的符号. 只要有碰到带';'那后面的所有命令都会在新行中执行. 例子: set a=aa &; echo %a% && echo test 相当于 set a=aa echo %a% && echo test 注: 1.只要返回值非0为真,否则为假.比如 read 0x60000 && command2 command2有可能会不被执行.因为内存地址0x60000的值有可能是0. 一般情况下命令执行失败时总是返回0(假).所以可以用于判断命令执行的结果. 2.在菜单中使用这些符号会忽略错误检测,这是一个很有用的功能. 比如: find --set-root /file.ext 在菜单中使用时可能会返回文件未找到的错误并停止执行.必要的话我们可以使用 find --set-root /file.ext || echo file not found. 这个命令在菜单中使用会显示find not found,但不停止执行. 例子: 1.以下命令输出的是1234 set a=1234 set a=abcd && echo %a% 2.以下命令输出的是abcd set a=1234 set a=abcd &; echo %a% 3.一个比较有用的例子,获取hd0,0的UUID,必须使用带;的符号,因为需要读取实时变量. uuid (hd0,0) &; set UUID=%?% 4.最常用到的嵌套 find --set-root /file1 || find --set-root /file2 || find --set-root /file3 如果没有找到file1就继续找file2,还是没有找到就找file3,如果还是没有找到将会失败 5.复杂的嵌套,如果对这些符号没有完全理解,不建议使用. set test=1 &; echo supported! && if not "%test%"=="1" echo Unsupported! 2010-11-04更新: 新增三个操作符号 "|",">",">>" 用法: command1 | command2 command1 > file or nul command >> file or nul 提示: GRUB4DOS不会改变文件大小,也不能新建文件,所以文件必须已经存在,并且是可写的,有足够的空间否则将被丢弃. 例子: cat /test.txt > /abcd.txt ****************************************************************************** *** Three new commands is64bit, errnum and errorcheck *** ****************************************************************************** 三个新命令 is64bit, errnum 和 errorcheck is64bit 和 errnum 命令分别用来检索是否是 64 位的系统和错误值。 errcheck off|on errorcheck(错误检查)命令控制着错误是否被处理。默认错误检查是开启的 ,即在 错误发生时命令脚本将停止执行。而假如错误检查是关闭的,那么脚本将一直执行到 boot 命令。一条 boot 命令可以把错误检查转变为开启。 ****************************************************************************** *** Use numeric keys to select a menu entry *** ****************************************************************************** 使用数字键来选择菜单项 例如,如果你想要选择第25项菜单项,你可以先按下数字键2 之后再按下 5 。 ****************************************************************************** *** Use the INSERT key to debug step by step at startup *** ****************************************************************************** 启动时使用 INSERT 键逐步的调试 在一些有缺陷机器上进入 grub4dos 环境时可能会失败。可能是意外的死机或者重启。 在启动时尽可能快的按下 INSERT 键,你就可能获得进入单步启动进程的机会而看到它最 多能运行到哪里,然后请上报这些bug截图 。 ****************************************************************************** *** The debug command syntax has been changed *** ****************************************************************************** debug 命令的语法已经改变 DEBUG 命令现在可以用来控制冗余的命令输出: debug [ on | off | normal | status | INTEGER ] 0 或者 off 指定为静默模式 1 或者 normal 指定为标准模式 从 2 到 0x7fffffff 或者 on 指定为冗余模式 (调试报告BUG时请使用该模式,可以获得更详细的信息) ****************************************************************************** *** GRUB4DOS and Windows Vista *** ****************************************************************************** GRUB4DOS 与 Windows Vista 首先,使用以下命令来建立一个启动项: bcdedit /create /d "GRUB for DOS" /application bootsector 执行结果看起来类似这样: The entry {05d33150-3fde-11dc-a457-00021cf82fb0} was successfully created. 其中长字串{05d33150-3fde-11dc-a457-00021cf82fb0} 是这个项的数字标识{id}。 然后,通过以下命令来设置启动参数: bcdedit /set {id} device boot bcdedit /set {id} path \grldr.mbr bcdedit /displayorder {id} /addlast 请用先前的命令所返回的实际的id 来替换掉 {id}。 最后,复制 GRLDR.MBR 到 你引导分区的根目录下,并且将 GRLDR 和 menu.lst 复制到 任意一个 FAT16/FAT32/EXT2/NTFS 的分区根目录下。 注意:引导分区必须是含有 BOOTMGR 的激活的主分区。 LianJiang 先生写出了一个脚本来自动化的完成这个麻烦的工作: @echo off rem by lianjiang cls echo. echo Please run as administrator echo. pause set gname=GRUB for DOS set vid= set timeout=5 bcdedit >bcdtemp.txt type bcdtemp.txt | find "\grldr.mbr" >nul && echo. && echo BCD entry existing, no need to install. && pause && goto exit bcdedit /export "Bcd_Backup" >nul bcdedit /create /d "%gname%" /application bootsector >vid.ini for,/f,"tokens=2 delims={",%%i,In (vid.ini) Do ( set vida=%%i ) for,/f,"tokens=1 delims=}",%%i,In ("%vida%") Do ( set vid={%%i} ) echo %vid%>vid.ini bcdedit /set %vid% device boot >nul bcdedit /set %vid% path \grldr.mbr >nul bcdedit /displayorder %vid% /addlast >nul bcdedit /timeout %timeout% >nul if exist grldr.mbr copy grldr.mbr %systemdrive%\ /y && goto exit echo. echo Please copy grldr.mbr to %systemdrive%\ echo. pause :exit del bcdtemp.txt >nul ------------------------------------------------------------------- 更新: Fujianabc 先生指出以下这行 bcdedit /set %vid% device boot >nul 必须更改为 bcdedit /set %vid% device partition=%SystemDrive% >nul chenall注: 其实没有必要改,使用boot可以获得更好的兼容性. ------------------------------------------------------------------- 你还需要自行复制 grldr和menu.lst文件。 注意: 你只需要指定BCD的位置就可以修改另一个操作系统的BCD 启动项: bcdedit /store D:\boot\BCD ... 注意: 执行这些命令需要提高权限,它们必须是“以管理员身份运行”于cmd.exe中。 注意:已有人报告说,即使使用管理员身份,Vista的某些版本也不支持在C盘根目录下建立 无扩展名的文件。你既可以复制grldr到另外的一个分区来解决这个问题,也可以将 grldr 重命名,比如为 grub.bin 。如何改名,请参见下节。 ****************************************************************************** *** How to rename grldr *** ****************************************************************************** 怎样重命名 grldr grldr 和 grldr.mbr引用引导文件内部的文件名来决定装载哪个文件,所以假如你 想更换它们的名字,那么你也必须要修改那些内嵌在文件内部的设置。你可以使用 辅助程序grubinst 来做到这些,grubinst 可以在以下网址下载到: http://download.gna.org/grubutil/ grubinst 能生成自定义的grldr.mbr: grubinst -o -b=mygrldr C:\mygrldr.mbr grubinst 也能编辑一个既有的 grldr 或 grldr.mbr: grubinst -e -b=mygrldr C:\mygrldr grubinst -e -b=mygrldr C:\mygrldr.mbr 在这种情况中,你必须使用一个和 grub4dos 版本兼容的grubinst,否则修改将会失败。 所以,在命令中通过加载mygrldr来代替grldr ,你可以使用下面的方法之一: 1.使用已定制好的grldr.mbr 来加载 mygrldr 。在这种情况下,你需要修改内嵌在 grldr.mbr中的引导文件名。grldr.mbr的名字可以被任意的改变。 2.直接使用mygrldr 。在这种情况下,你需要将 mygrldr 中内嵌的引导文件名改为 一个合适的名字。 注意: 引导文件名必须遵循 8.3 文件名规范。 ****************************************************************************** *** GRLDR as PXE boot file *** ****************************************************************************** GRLDR 作为 PXE 启动文件 GRLDR 可以被用作远程或网络服务器的 PXE 启动文件。(pd) 设备被用于访问服务器上文件。 当 GRLDR 已经通过网络启动后,它将使用预设菜单作为配置文件。不过,你可以使用 一条"pxe detect"命令,它的表现是和pxelinux一样的方式。 * 首先,它将使用设备类型(使用它的 ARP 类型码)和地址来搜索配置文件,全部用 破折号分割的十六进制;例如,对一个以太网(ARP 类型是1)的88:99:AA:BB:CC:DD 地址,它会用文件名01-88-99-AA-BB-CC-DD 来搜索。 * 其次,它将使用它本地的IP 地址大写字母的十六进制格式(即192.0.2.91 转换为 C000025B。)来搜索配置文件。如果文件没有找到,它将去掉一个十六进制数字后再试一次。 最后,它会尝试寻找一个名为 default (小写字母)的文件。 ****************************************************************************** *** PXE device *** ****************************************************************************** PXE 设备 如果使用PXE启动,GRUB4DOS 将建立一个虚拟设备 (pd),可能通过它来访问tftp服务器 上的文件。你可以使用下面的步骤来设置一个无盘启动环境: 客户端 你需要从 PXE ROM 上启动。 服务器端 你需要配置一个dhcp服务器和一个tftp服务器。在dhcp服务器上,使用grldr作为引导文件。 你可能希望为不同的客户端加载一个不同的menu.lst 。GRUB4DOS将在以下位置查找配置文件: [/mybootdir]/menu.lst/01-88-99-AA-BB-CC-DD [/mybootdir]/menu.lst/C000025B [/mybootdir]/menu.lst/C000025 [/mybootdir]/menu.lst/C00002 [/mybootdir]/menu.lst/C0000 [/mybootdir]/menu.lst/C000 [/mybootdir]/menu.lst/C00 [/mybootdir]/menu.lst/C0 [/mybootdir]/menu.lst/C [/mybootdir]/menu.lst/default 更新1: 如果/mybootdir/menu.lst 文件存在,将会优先使用,这样可以加快引导速度. 这里,我们假设客户端的网卡mac地址是 88:99:AA:BB:CC:DD ,而ip地址是192.0.2.91 (C000025B)。 /mybootdir 是引导文件所在目录,例如,如果引导文件是 /tftp/grldr ,那么mybootdir=tftp 。 如果上面的文件都未出现,grldr将使用它的内置的menu.lst 。 这是一个如何访问tftp服务器上文件的menu.lst文件。 title Create ramdisk using map map --mem (pd)/floppy.img (fd0) map --hook rootnoverify (fd0) chainloader (fd0)+1 title Create ramdisk using memdisk kernel (pd)/memdisk initrd (pd)/floppy.img chenall注: 1.你也可以省略(pd)/或者使用(bd)/或()/ 这样可以使得一个菜单可以不经过修改就可以用于其它地方的启动. 你可以看到这个 menu.lst 和在普通磁盘上引导的是相似的,你只是需要把象(hd0,0) 这样的设备用(pd) 来代替。 磁盘设备和 pxe 设备有一些不同点: 1. 你不能把pxe设备上的文件以列表显示。 更新2: 现在可以列表,但要求服务器上有dir.txt文件,使用以下命令可以创建一个dir.txt文件 dir /b>dir.txt 也可以直接使用TFTPD32的服务器,选择自动生成DIR.TXT文件. 2.blocklist 命令不能用于 pxe 设备上的文件。 3.如果你想映射一个pxe服务器上的文件,你必须使用--mem 选项 。 当你使用 chainloader 命令装载一个pxe 设备上的文件时,有一个选项你可以使用: chainloader --raw (pd)/BOOT_FILE 选项 --raw 的执行就和--force一样,但是它是一次性将文件装载执行。这可以改善 一些情况下的执行效率。 你可以使用 pxe 命令来控制 pxe 设备。 1. pxe 如果没有使用任何参数,pxe 命令将显示当前设置。 2. pxe blksize N 设置tftp packet size (传输包)大小。最小值是 512 ,最大值是 1432 。这个参数主要使 用在那些不支持远大于 512 字节包大小的tftp 服务器上。 3. pxe basedir /dir 为tftp 服务器上的文件设置基本目录。如 pxe basedir /tftp 那么在pxe 设备上的所有文件都和目录 /tftp 相关。例如,(pd)/aa.img 对应于服务器上的 /tftp/aa.img 。 基本目录的默认值是引导文件所在目录,例如,如果引导文件是 /tftp/grldr , 那么默认的基本目录就是 /tftp 。 4. pxe keep 保持 pxe stack。GRUB4DOS的默认退出时自动卸载pxe strack。 如果你希望在引导后继续使用PXE功能,比如用于RIS安装,这时必须使用这个选项. 5. pxe unload 立即卸载 PXE stack。pxe占用了大量的常规内存,某些引导程序可能会无法正常引导。 这时你可以先卸载然后再引导。一个例子: title Linux memtest map --mem /memtest.bin (rd) pxe unload kernel (rd)+1 如果在PXE启动时直接kernel /memtest.bin可能会失败。 ****************************************************************************** *** New Feature of Relative Path Support *** ****************************************************************************** 相对路径支持的新特性 使用`root' 或 `rootnoverify'命令来指定`工作目录' 。 例如: root (hd0,0)/boot/grub 这就指定了当前工作目录是(hd0,0)/boot/grub 。因此所有继"/..."之后的文件名将实际 提交到(hd0,0)/boot/grub/... 也就是说: cat /menu.lst 将等同于 cat (hd0,0)/boot/grub/menu.lst ****************************************************************************** *** Notation For The Current Root Device *** ****************************************************************************** 当前根设备的符号 符号`()'可以在访问当前根设备时使用。你可以使用`find --set-root ...'来设置当前根 设备,但find 命令不能设置根设备的`工作目录'。这时你应该使用`()'在find命令后来设 置工作目录。 root ()/boot/grub 2008-05-01 更新: 现在 FIND 命令也可以设置`工作目录'了。例如: find --set-root=/tmp /boot/grub/menu.lst 它等同于这一组命令: find --set-root /boot/grub/menu.lst root ()/tmp ****************************************************************************** *** The new map option --a20-keep-on *** ****************************************************************************** map 新选项 --a20-keep-on 随着0.4.3最终版的发布,map 有了一个新选项 --a20-keep-on ,它跟内存驱动器扇区访 问后的A20 地址线控制有关 map --a20-keep-on=0 它必须被使用于"map --hook"命令之前。 作为默认,在INT13 对随机内存的扇区访问之后 A20 将一直开启。如果"map --a20-keep-on=0" 被使用,那么在INT13 中断调用后的 A20 的状态将和在INT13中断调用前相同。 ****************************************************************************** *** The CDROM emulation (virtualization) *** ****************************************************************************** 光盘仿真(虚拟化) 光盘仿真有时候又称为 ISO 仿真。这里是个示例: map (hd0,0)/myiso.iso (hd32) map --hook chainloader (hd32) boot 如果myiso.iso 是不连续的并且你有足够的内存,那么要增加一个--mem选项: map --mem (hd0,0)/myiso.iso (hd32) map --hook chainloader (hd32) boot 注意:(hd32) 是一个 grub 驱动器,驱动器号和 (0xA0) 等价。如果一个虚拟驱动器被指 定为一个大于或等于0xA0 的驱动器号,那么它将被视为是一个光盘。(即,是 2048 字节 的大扇区) 就像标准的磁盘仿真一样,光盘仿真也(主要)工作于实模式操作系统中。在一个保护模式的 操作系统核心(例如WinNT/2K/XP/VISTA/LINUX)获得控制后,操作系统一般没有能力通过BIOS 的int13 来访问虚拟光盘。 DOS/Win9x 的使用者可以用google搜索到 ELTORITO.SYS 然后将它作为虚拟光驱的设 备驱动使用到CONFIG.SYS 中。 CONFIG.SYS 中 eltorito.sys 的用法举例: device=eltorito.sys /D:oemcd001 对应的可能是放在 AUTOEXEC.BAT中的 MSCDEX 命令: MSCDEX /D:oemcd001 /L:D 由于在 eltorito.sys中发现了一些缺陷,驱动器可能会加载失败。假如你碰到这类问题, 那么你可以将虚拟光盘的驱动器号从(hd32)更换为(0xFF)然后再试一次。 ****************************************************************************** *** The New Command CHECKRANGE *** ****************************************************************************** 新命令 CHECKRANGE Checkrang 命令检查一条命令的返回值是否是在指定的值域或排列中。 Usage: checkrange RANGE COMMAND 用法: checkrange 域 命令 这里是参数 RANGE 的一些示例: 3 是仅包含数字 3 的值 3:3 等价于 3 3:8 是一个包含数字3, 4, 5, 6, 7, 8的值域 3,4,5,6,7,8 等同于3:8 3:5,6:8 也等同于3:8 3,4:7,8 也等同于3:8 注意:你不能把空格放在值域中。比如:以下是错误的。 checkrange 1 2 COMMAND 这里用一个示例来演示怎样使用 checkrange 命令: checkrange 0x05,0x0F,0x85 parttype (hd0,1) || hide (hd0,1) 这意谓着:如果 (hd0,1) 不是一个扩展分区,那么执行hide (hd0,1)命令隐藏它。 ****************************************************************************** *** The New Command TPM *** ****************************************************************************** 新命令 TPM "tpm --init"在地址0000:7c00处使用512字节数据作为初始化TPM(可信赖平台模块)的缓存。 在你引导 VISTA 的 BOOTMGR 前,你可能需要在一些机器上使用"tpm --init"。通常你应该在 一条 CHAINLOADR 命令后执行"tpm --init"指令。 ****************************************************************************** *** Delimitors or comments between titles *** ****************************************************************************** 标题间的限制或注释 把标题用来做限制或注释是可能的。如果一个标题(或菜单项)下所有的菜单命令都是非启动敏感的, 它被叫做是不可启动的。 下面的命令是启动敏感的(而其他命令是非启动敏感的) boot bootp chainloader configfile embed commandline halt install kernel pxe quit reboot setup 一个不可启动的标题在使用者按向上方向键或向下方向键时将被跳过。 不可启动的菜单项可以通过使用左方向键或右方向键来被访问(和执行)的。示例: title This is an UNBOOTABLE entry(so this line is also a comment) pause --wait=0 This title is a comment. Nothing to do. pause --wait=0 You can use non-boot-sensitive commands here pause --wait=0 of any kind and as many as you would like. help help root help chainloader help parttype clear title ------------------------------------------------------------ pause --wait=0 This title is a delimitor. Nothing to do. pause --wait=0 You can use non-boot-sensitive commands here pause --wait=0 of any kind and as many as you would like. clear help help boot title ============================================================ pause --wait=0 This title is a delimitor. Nothing to do. pause --wait=0 You can use non-boot-sensitive commands here pause --wait=0 of any kind and as many as you would like. help clear help pause title ************************************************************ pause --wait=0 This title is a delimitor. Nothing to do. pause --wait=0 You can use non-boot-sensitive commands here pause --wait=0 of any kind and as many as you would like. help kernel help clear 注意:一个不可启动菜单项必须至少包含一条命令。如果标题下没有命令,标题将被简单的 丢弃并且不被显示。 ****************************************************************************** *** Bifurcate drives *** ****************************************************************************** 分支式驱动器 一些机器在 CHS 和 LBA 模式之间对驱动器实施不同的动作。 当你使用标准的BIOS调用int13/AH=02h来读取扇区时,你可能会发现这个驱动器是一个软盘 但是当你用扩展的BIOS调用(EBIOS)int13/AH=42h来读取扇区时,你会发现是一个光盘。 这样的驱动器被叫做分支式的。 一个分支式的驱动器拥有两个驱动器号:一个是标准的 BIOS 驱动器号十六进制 的 00或FF ,并且这个驱动器只使用 CHS 模式的磁盘访问(标准的BIOS int13/AH=02h); 另一个是标准的 BIOS 驱动器号(按位与)0x100 (即十进制的256),并且这个驱动器只 使用 LBA 模式的磁盘访问(EBIOS int13/AH=42h)。 例如,驱动器0x00(即,第一软驱)是分支式的. 那么驱动器(0x00)使用 CHS 模式来访问它的扇区 而驱动器(0x100)则使用LBA 模式来访问它的扇区。 geometry 命令会用 BIF 代替常见的 CHS 和 LBA 来报告分支式驱动器的磁盘访问模式。 已知的分支式驱动器。发现虚拟机Virtual PC和一些真实机器当它们引导一个软盘模拟模式 的可启动光盘时会建立一个分支式的软驱。命令"geometry (fd0)"将显示: drive 0x00(BIF): C/H/S=...Sector Count/Size=.../512 而"geometry (0x100)"将显示 drive 0x100(BIF): C/H/S=...Sector Count/Size=.../2048 实际上(0x100) 可以访问整个光盘。 你可以执行"ls (0x100)/" 显示光盘上文件(不是那个被引导的软盘映像中的文件)。 当然 "ls (fd0)/"可以列举那些在被引导的软盘映像中的文件。 注意:仅仅是某些(真实的或虚拟的)机器有这样的行为,其他的机器不会产生分支式驱动器。 ****************************************************************************** *** New program badgrub.exe *** ****************************************************************************** 新程序 badgrub.exe 新程序 badgrub.exe 是特意供那些不能运行标准 grub.exe 的‘糟糕的’机器(一些典型 的 DELL 原型机)使用的。 ****************************************************************************** *** Conditional find *** ****************************************************************************** 条件查找 新的find 命令的语法允许带条件的查找设备。 find [OPTIONS] [FILENAME] [CONDITION] 选项 文件名 条件 OPTIONS: --set-root set the current root device. --set-root=DIR set current root device and working directory to DIR. please also see "Notation For The Current Root Device". --ignore-cd skip search on (cd). --ignore-floppies bypass all floppies. --devices=DEVLIST specify the search devices and order. DEVLIST u->(ud) n->(nd) p->(pd) h->(hdx) c->(cd) f->(fdx) default: upnhcf 其中的 CONDITION 是一个返回值是 TRUE 或者 FALSE 的标准 grub 命令。 示例 1: 列举所有的分区,所有的软驱和 (cd) 。 find 示例 2:列举文件系统已知的所有设备。 find +1 示例 3: 列举分区类型为0xAF的所有分区。 find checkrange 0xAF parttype 示例 4:列举分区类型为 0x07 且根目录存在 ntldr 的所有分区。 find /ntldr checkrange 0x07 parttype 示例 5: 设置当前根设备到第一个根目录有存在ntldr的分区。 find --set-root /ntldr 示例 6: 同例5,但是以下命令只查在硬盘上查找bootmgr find --set-root --devices=h /bootmgr 示例 7: 设置当前根设备为第一激活的主分区。 find --set-root --devices=h makeactive --status 更新: 新的find 命令语法允许指定要查找和设备和查找的顺序。 新的参数 --devices=DEVLIST,用于指定查找的设备和顺序。 DEVLIST可以下以下的字母组合。 u,p,n,h,c,f -->分别对应 ud,pd,nd,hd,cd,fd, 查找时根据DEVLIST指定的设备顺序进行查找。默认是upnhcf. 例子: 1.只查找硬盘上的文件 find --devices=h /file 2.依次查找硬盘、光盘、软盘上的文件 find --devices=hcf /file 注意:新的find命令有一个改变,查找的时候会优先查找当前设备(如果在列表中的话)。 ****************************************************************************** *** How to build grldr boot images *** ****************************************************************************** 如何创建 grldr 引导的映像文件 1. 创建1.44M 软盘镜像文件 ext2grldr.img dd if=/dev/zero of=ext2grldr.img bs=512 count=2880 mke2fs ext2grldr.img mkdir ext2tmp mount -o loop ext2grldr.img ext2tmp cp default ext2tmp cp menu.lst ext2tmp cp grldr ext2tmp umount ext2tmp bootlace.com --floppy --chs --sectors-per-track=18 --heads=2 --start-sector=0 --total-sectors=2880 ext2grldr.img 2. 创建1.44M 软盘镜像文件 fat12grldr.img dd if=/dev/zero of=fat12grldr.img bs=512 count=2880 mkdosfs fat12grldr.img mkdir fat12tmp mount -o loop fat12grldr.img fat12tmp cp default fat12tmp cp menu.lst fat12tmp cp grldr fat12tmp umount fat12tmp bootlace.com --floppy --chs fat12grldr.img 3. 创建 iso9660 文件系统的光盘镜像文件 grldr.iso mkdir iso_root cp grldr iso_root cp menu.lst iso_root mkisofs -R -b grldr -no-emul-boot -boot-load-size 4 -o grldr.iso iso_root ****************************************************************************** *** Use bootlace.com to install partition boot record *** ****************************************************************************** 使用 bootlace.com 来安装分区引导记录 在 bootlace.com 没有实现 --install-partition 选项之前,你需要用已实现的 --floppy=PartitionNumber 选项来替代。 你必须按下面的方法执行: 步骤 1. 获取分区的引导扇区然后保存为一个文件 MYPART.TMP 。对于 NTFS 文件系统,你需要获取 起始的16 个扇区。对于其他类型的文件系统,你只需要获取一个扇区,但获取多个扇区 也是没问题的。 步骤 2. 执行这些命令: bootlace.com --floppy=Y --sectors-per-track=S --heads=H --start-sector=B --total-sectors=C --vfat --ext2 --ntfs MYPART.TMP 这里我们假定 MYPART.TMP 是从 (hdx,y) 获取的而且分区号 Y 必须在--floppy=Y 选项中被指定。 注意:对于FAT12/16/32/NTFS等分区,你可以省略这些选项: --sectors-per-track, --heads, --start-sector, --total-sectors, --vfat and --ext2. 对于 NTFS 分区,你必须指定 --ntfs 选项。 对于 ext2 分区,你可以省略 --vfat, --ntfs he --ext2 选项,但是其他选项必须被指定。 步骤 3. 将 MYPART.TMP 写回你原来分区(hdx,y)的引导扇区。 注意:现在只有一些文件系统(FAT12/16/32/NTFS/ext2/ext3)被支持。 注意2:在Linux 下你可以对分区直接写。也就是说,步骤1 和步骤3 是不需要的。简单使用 它的设备名代替 MYPART.TMP 即可。 注意3:grubinst 具有把 grldr 的自举代码安装到分区引导扇区的功能。 ****************************************************************************** *** Use a single key to select menu item *** ****************************************************************************** 使用一个单一的键来选择菜单项 一些机器具有简化的键盘。这些键盘可能只有数字键 0 到 9 ,外加少数几个其他键。当 菜单还未显示时,使用者可以按下某个键 8 次。当菜单控制模块发现一个连续的单一按 键时,它将认为使用者希望使用这个键来选择菜单和启动。这个单一的键可以充当右方向 键来为使用者选择菜单。然后在使用者停止按键的 5 秒之后,被选择的菜单项将自动启 动。任何的标准键可以被作为单一的键来达到这个目的,除了少数功能键,比如 b ,e , 回车键,等等。一旦另外的键被按下,单键选择特性将立即消失。 ****************************************************************************** *** Parameter file for bootlace running under DOS *** ****************************************************************************** 你可以把所有或部分的命令行参数放到一个文件中。这个文件可以有多行。就像空格 和制表符一样,回车符和换行符也可以在参数文件中分割命令行参数。 示例: bootlace < my_parafile bootlace --read-only my_mbr < my_other_options 注意: 不能使用管道符"|"。你必须使用输入重定向符 (<) 。 ****************************************************************************** *** Use bootlace to create a triple MBR *** ****************************************************************************** 使用 bootlace 来建立一个三重的 MBR 虽然这也能用于硬盘,但是它典型的使用是被用于 USB 设备。 创建三重的 MBR 的步骤: 1. 使用一个新版的 FDISK 分区软件来建立一个从第 95 扇区开始的FAT12或16或32 的分区 (这里是 LBA 扇区表示法,起始扇区(MBR)是 0 扇区。) 2. 安装 grldr 的引导扇区到这个分区的引导扇区。参见上面的“使用 bootlace.com 来安装分区引导记录” 3. 获取从起始扇区 0 扇区(MBR)开始的96个扇区,然后保存到一个文件 MYMBR96.TMP 中。 4. 运行 bootlace.com: bootlace.com MYMBR96.TMP 5. 将 MYMBR96.TMP 从MBR (0 扇区)开始回写到驱动器上。 注意: 如果驱动器已经是一个三重的 MBR ,那么 bootlace 会删除它并且恢复为原本的分区布局。 ****************************************************************************** *** Use 'pxe detect' in preset-menu *** ****************************************************************************** 在预置菜单中使用 'pxe detect' 命令 现在“pxe”命令有了个新的子命令“detect”: pxe detect [BLOCK_SIZE] [MENU_FILE] 包大小选项 菜单文件选项 BLOCK_SIZE 选项指定出 pxe 包的大小。如果它没有被指定或者是被指定为 0 ,那么 grub4dos将通过一个侦测过程来获取数据传送包的一个恰当的的值。 MENU_FILE 选项指定出 PXE 服务器上的配置文件。如果它被省略,在 menu.lst 子目录 中的标准配置文件将获得控制。关于menu.lst 子目录中的配置文件的描述,请查阅上面 的“GRLDR 作为 PXE 启动文件”一节。 如果MENU_FILE 是以"/"开始的,那么PXE 服务器上的 MENU_FILE 将获得控制,否则 (如果MENU_FILE不是以"/"开始)将没有菜单被执行。 在你的系统用 512 字节的默认包大小不能运行时,通常你应该在访问(pd)设备之前 使用一条 "pxe blksize ..." 或 一条 "pxe detect ..."命令。 ****************************************************************************** *** Use 'configfile' in preset-menu *** ****************************************************************************** 在预置菜单中使用 'configfile'命令 现在预置菜单具有最高控制权。它将在启动设备上的 menu.lst 之前获得控制。如果 'configfile' 命令在初始化命令组中出现,那么控制将转到启动设备上的menu.lst文件。 ****************************************************************************** *** New command 'dd' to copy files *** ****************************************************************************** 复制文件的新命令 'dd' 用法: dd if=IF of=OF [bs=BS] [count=C] [skip=IN] [seek=OUT] [buf=ADDR] [buflen=SIZE] 将 IF(源文件)复制到OF (目标文件)中。BS 是以字节计数的一个块的大小,默认 值是512 。C 是复制的块数,默认值是源文件中的总块数。IN 指定在读取时跳过的块 数,默认值是 0 。OUT 指定在写入时跳过的块数,默认值是0 。已跳过的块不会被改 变。源文件和目标文件必须是存在的。 译注:新增参数buf表示dd所用的读写缓存的起始地址,buflen表示缓存的长度,即大小。 源文件和目标文件必须以设备名开头,即,`(...)'的格式。对于当前根设备你应该使用`()'。 dd 命令既不扩大也不减小目标文件的大小,源文件尾部剩余的部分将被丢弃。目标 文件不能是gzip压缩过的文件。如果源文件是gzip 压缩过的文件,它将在复制时被 自动解压。 dd 具有危险性,使用风险由你自己的承担。作为一种安全方面的考虑,你应当只使 用 dd 来写入一个内存中的文件。 某些情况下在写入NTFS 中的文件的时,dd 可能会失败。 假如你尝试在菜单中执行dd命令来写入一个不是内存中的设备或者块文件时,你会被安全的拒绝:-) (更新:现在不再限制) 更新: 新选项实现了让使用者自定义dd 命令的读写缓存。默认读写缓存起始于地 址0x50000,长度为0x10000 (即64KB)。你不能指定起始地址ADDR 低于0x100000 (即 1 MB)的缓存位置。此外,你必须指定参数SIZE 大于0x10000(即64K)。 通常,你需要令ADDR大于或等于0x1000000 (16MB),并且 SIZE 也要大于或等于16MB 。 增大 SIZE 的值能够加快 dd 的读写速度。 更新 2:从 2011 年 10 月 3 日起,缓冲区地址默认位于 1M 处。由于从 2011 年 10 月 20 日开始 grub4dos 保留了 32M 内存作为内部使用,因此通常你想设置 ADDR 使其不低 于 32M。显然,你不应该设置 ADDR 和 SIZE 使其与 grub4dos 的代码和数据发生冲突。 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!! !!!! Caution! Both IF and OF can be a device name which stands for !!!! !!!! all the sectors on the device. Take utmost care! !!!! !!!!______________________________________________________________________!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 警告!IF 和 OF 都可以是一个设备名,即它代表了设备上全部的扇区。慎之又慎! ****************************************************************************** *** New command 'uuid' to identify partitions *** ****************************************************************************** 确认分区的新命令 'uuid' 用法: uuid [DEVICE] [UUID] 如果 DEVICE 选项未被指定,将在所有分区中搜索指定的 UUID 号的文件系统, 然后把包含这个文件系统的分区设置为新的根 (如果 uuid 被指定时),或者只列举所 有设备上的文件系统的 uuid 号(如果 uuid 未被指定时)。 如果 DEVICE 选项被指定了,将返回 真 或 假 ,对应于指定的设备是否与指定的 UUID 号相符(如果uuid被指定时),或者仅仅列举指定设备的uuid 号(uuid 未被指定时)。 示例 1: find --set-root uuid () 7f95820f-5e33-4e6c-8f50-0760bf06d79c 这将查找 uuid 等于 7f95820f-5e33-4e6c-8f50-0760bf06d79c的分区,然后将这个找到的分区设置为根。 示例 2: uuid () 这将显示当前根设备的 uuid 号。 ****************************************************************************** *** gfxmenu support in grub4dos *** ****************************************************************************** grub4dos 的 gfxmenu 支持 gfxmenu 支持已经被增加到 grub4dos 当中。使用它,你首先需要找到一个你需要的mesage 文件,然后在menu.lst中用类似这样的命令来装载它: gfxmenu /message 这是一个全局命令,也就是说,不能放入任何的菜单项中。同时,它只能被使用于配置文件 中,而在控制台模式中执行它是无效的。 gfxmenu 不能与全局密码保护功能同时使用。 message 文件有两个主要的格式。老的格式是通过gfxboot 3.2版或更旧的版本创建的 (message文件的大小通常只能是150 k),当采用 gfxboot 3.3 版或更新的版本创建 新格式时,(message文件的大小通常可以超过 300K)。这两种格式在grub4dos 中都 已被支持。 ****************************************************************************** *** Use 'write' to write a string into a device or file *** ****************************************************************************** 使用 '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 个字节(字节计数)的指定的设 备或文件当中。 字符串不需要被引用,也就是说,不需要单引号(') 也不用 双引号(") 来引用它。 空格符必须被反斜杠(\)引用。(更新:现在不需要了) (译注:如果字符串以空格开头,开头的这个空格符还是需要反斜杠引用) 单引号(')和双引号(")不用特别说明并且可以直接使用到字符串中。 下面是一些 C 语言风格的引用序列说明: \NNN (1到3位)八进制值 NNN 表示的字符 \\ 反斜杠 \a 警报 (声音) \b 退格符 \f 换页符 \n 换行符 \r 回车符 \t 水平制表符 \v 垂直制表符 \xHH (1到2位)十六进制值为 HH 的字节 就像 dd 命令一样,write 命令既不扩大也不缩小目标文件的文件大小,字符串的 剩余部分将被丢弃。目标文件也不能是一个压缩过的文件。 还是和 dd 类似,write 命令也具有危险性,使用风险你自己承担。作为一种安全 方面的考虑,你应当只向内存中的文件写入。 某些情况下当写入 NTFS 中的文件时,write命令可能失败。 假如你尝试在菜单中执行 write 命令来写入一个不是内存中的设备或者块文件时, 你会被安全的拒绝:-) (更新:现在不再限制) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!! !!!! Caution! The file to write can be a device name which stands !!!! !!!! for all the sectors on the device. Take utmost care! !!!! !!!!______________________________________________________________________!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 警告!被write 命令写入的文件可以是一个设备名,即它代表了设备上的所有 扇区。慎之又慎! ****************************************************************************** *** Item-by-item help text for menu entries *** ****************************************************************************** 为菜单项添加提示信息 当你选择一个菜单项时,屏幕底部的提示信息将发生变化。 你可以在标题行中添加你的提示信息。必须用"\n" 开头,示例: title This is the title\nThis is the help text.\nAnd this is the 2nd line of the help text. 一些 C 语言风格的引用符号在请看前面章节的说明。 ****************************************************************************** *** initrd can load multiple cpio files for Linux 2.6 kernels *** ****************************************************************************** inird 命令可以为Linux 2.6 核心装载多个cpio 格式的文件 用法: initrd FILE [FILE ...] 注意 1:你不能用这种方法装载多于一个的老式磁盘镜像,因为Linux 核心不支持。 注意 2:其中的 FILE 必须和在syslinux中使用的顺序一样。 ****************************************************************************** *** access some internel variables at a fixed location *** ****************************************************************************** 在固定位置访问一些内部变量 地址 长度 说明 ========= ======== ============================================== 0000:8208 4字节(即双字) 启动分区号 install_partition (the boot partition) 0000:8280 4字节(即双字) 启动驱动器号(boot_drive) 0000:8284 4字节(即双字) pxe 客户端 ip (即本地ip) 0000:8288 4字节(即双字) pxe 服务器 ip 0000:828C 4字节(即双字) pxe 网关 ip 0000:8290 8字节(即四字) 最后访问的文件的大小(是执行"cat --length=0"后的文件大小) 0000:8298 4字节(即双字) 可用的扩展内存大小(以 KB 为单位) 0000:829C 4字节(即双字) 当前根分区号(current root partition) 0000:82A0 4字节(即双字) 当前根所在的驱动器(current root drive) 0000:82A4 4字节(即双字) 解压标志 (gzip非自动解压),非0时不自动解压 0000:82A8 8字节(即四字) 最后访问的分区的起始扇区号 0000:82B0 8字节(即四字) 最后访问的分区的扇区总数 0000:8278 4字节(即双字) GRUB4DOS编译的日期十进制数. 以下命令用于判断当前使用的GRUB是否在2010-12-30日编译的。 checkrange 20101230 read 0x8278 注意 1:Filesize 通过执行 "cat --length=0 FILE" 来初始化和修改。 注意 2:尽量不要改写这些变量(应该只是读取)。 注意 3:你可以使用内存地址6000:0000开始的 1K空间作为你自己的变量区(参见注意4)。 注意 4:read 命令现在从指定的地址处返回32位整数值。 注意 5:grub4dos 还没有变量扩展的功能。你只能使用整数变量。你不需要申明它们,就 可以直接使用这些内存地址。通常你需要通过一个逻辑值或者一个条件测试命令 来使用这些变量,即,类似这种格式:"checkrange RANGE read ADDR" 注意 6:内部变量no_decompression, saved_drive and saved_partition 是可写的。 ****************************************************************************** *** possibility to run another menu.lst after gfxmenu *** ****************************************************************************** 在 gfxmenu 之后后运行其它 menu.lst 注意下面是在 GFXMENU 之后使用 CONFIGILE 的示例: # The menu.lst file for gfxmenu default=0 timeout=5 gfxmenu /message configfile /another.lst title 0.......... ................ title 1.......... ................ title 2.......... ................ # End of menu.lst # Begin another.lst default=0 timeout=5 title 0.......... ................ title 1.......... ................ title 2.......... ................ # End of another.lst 会首先尝试执行 gfxmenu 命令。当它退出时(或者失败时)控制会转到 another.lst 菜单。 ****************************************************************************** *** a range of drives can be unmapped *** ****************************************************************************** 用法: map --unmap=RANGE 其中的 RANGE 是一个已被映射的 BIOS 驱动器域。BIOS 驱动器号 0 表示第一软驱,1 表示 第二软驱;0x80 表示第一硬盘,0x81 表示第二硬盘,等等;虚拟光盘(hd32) 对应于 BIOS 驱动器号 0xA0 ,(hd33) 对应于0xA1 ,等等。 关于RANGE 的说明,请参阅前述的“新命令 CHECKRANGE ”这节。 示例 1: map --unmap=0,0x80,0xff 这将反映射虚拟软驱 (fd0),虚拟硬盘(hd0)和虚拟光盘(0xff)。 示例 2: map --unmap=0:0xff 这将反映射所有的虚拟软驱,所有的虚拟硬盘和所有的虚拟光盘。 注意 1:通常,一条‘map’命令将在驱动器映射表中为虚拟驱动器增加一个表项。而 ‘--unmap’意味着在驱动器映射表中(具体是指虚拟驱动器)的表项会被删除。 Note 2: The --unhook option only breaks the INT13 hook(to the inerrupt vector table). It will not affect the drive map table. And later on execution of a `boot' command, the INT13 disk emulation routine will automatically get hooked(to the interrupt vector table) when needed (e.g., the drive map table is non-empty) even if it has been unhooked. 注意 2:--unhook 选项仅仅是断开 INT13 的挂钩(在中断矢量表中)。它不会影响到驱 动器映射表。而且在执行了一个‘boot’命令之后,即使是它已经被反映射了的 时候,INT13磁盘仿真程序也会在需要的时候(即,驱动器映射表非空时)自动建立挂钩。 注意 3:通常你需要在已经改变了驱动器映射表之后执行一条`map --rehook'命令。 ****************************************************************************** *** geometry tune and sync *** ****************************************************************************** 磁盘几何参数的修正和同步 当一个USB 存储设备被连接到一台(或者是不同的)机器上时,分区表中或 BPB 中的磁盘 几何参数值可能是无效的,并且这个机器可能在启动时死机。因此你需要为驱动器找到一个 正确的磁盘几何参数(使用 `geometry --tune'),然后更新分区表或 BPB 中的磁盘 几何参数(使用`geometry --sync')。 假如你想启动到DOS,那上面的步骤是必要的,因为 DOS 要求有正确的磁盘几何参数在分区 表和BPB 中。Windows 及 Linux 应该也需要,因为引导程序运行在实模式中。 ****************************************************************************** *** 版本编号 *** ****************************************************************************** 我们添加了一个字符 'a', 'b', 'c' or 'p' 到版本编号(e.g., 0.4.5). 所以现在版本编号是 0.4.5a, 0.4.5b, 0.4.5c, 0.4.5 or 0.4.5p. 'a' - alpha test. 不稳定, 尤其是在有已知BUG的情况下。 'b' - beta test. 测试版,开发人员觉得这个版本没有bug,希望有一个长期的测试。 'c' - 候选发布版,相对比较稳定。 ''(nothing) - 正式版,比较稳定。 'p' - 修补版,对于在正式版中发现的一些问题进行修正. ****************************************************************************** *** Running User Programs(外部命令,供开发人员参考) *** ****************************************************************************** 从0.4.5起,用户可以自行编写程序以在GRUB4DOS中运行。 该可执行程序文件必须以8字节grub4dos EXEC签名结尾。 0x05, 0x18, 0x05, 0x03, 0xBA, 0xA7, 0xBA, 0xBC The executable must have no relocations, and the entry point is at the very beginning of the file, just like a DOS .com file(but the grub4dos executable is 32-bit). 程序的入口点在文件头,和DOS的.com文件很像(但我们是32位的程序)。 注:因为使用了linux gcc的特性,所以程序只能在linux下使用gcc进行编译。 附上一个简单的echo.c源码,供参考。 /*================ begin echo.c ================*/ /* * 编译: gcc -Wl,--build-id=none -m32 -mno-sse -nostdlib -fno-zero-initialized-in-bss -fno-function-cse -fno-jump-tables -Wl,-N -fPIE echo.c -o echo.o * disassemble: objdump -d echo.o * confirm no relocation: readelf -r echo.o * generate executable: objcopy -O binary echo.o echo * 经过这一步之后生成的echo文件就是可以在grub4dos中运行的程序。 * and then the resultant echo will be grub4dos executable. */ /* * This is a simple ECHO command, running under grub4dos. */ #define sprintf ((int (*)(char *, const char *, ...))((*(int **)0x8300)[0])) #define printf(...) sprintf(NULL, __VA_ARGS__) int i = 0x66666666; /* 这是必要的,看下面的注释。*/ /* gcc treat the following as data only if a global initialization like the * above line occurs. */ /* GRUB4DOS可执行程序结尾必须有以下8个字节(EXEC签名) */ asm(".long 0x03051805"); asm(".long 0xBCBAA7BA"); /* 感谢上帝, gcc 会把上面的8个字按兵不动放在最终程序的最后面。 * 不要在这里插入其它任何代码. */ int main(char *arg,int flags) { return printf("%s\n",arg); } /*================ end echo.c ================*/ 0x8300 是 grub4dos 系统函数(API)的入口点. 你可以在 asm.S 源码中找到它的定义. 目前可以使用的函数和变量: http://grubutils.googlecode.com/svn/trunk/src/include/grub4dos.h ****************************************************************************** *** Map options added by Karyonix *** ****************************************************************************** (from boot-land.net) Karyonix's note: 注:boot-land.net网站已经改成 reboot.pro map --add-mbt= option to be used with --mem. If =0 master boot track will not be added automatically. 配合--mem 使用. 如果=0 则不会自动添加主引导磁道. 说明:默认情况下把一个分区镜像map为一个硬盘时会自动添加一个主引导磁道. 使用该参数可以禁止GRUB4DOS自动添加。一般不需要使用这个参数。 map --top option to be used with --mem. map --mem will try to allocate memory at highest available address. 配合--mem 使用. 如果=0 则不会自动添加主引导磁道. 说明:默认情况下把一个分区镜像map为一个硬盘时会自动添加一个主引导磁道. 使用该参数可以禁止GRUB4DOS自动添加。一般不需要使用这个参数。 map --mem-max=, map --mem-min options to be used before map --mem. Allow user to manually limit range of address that map --mem can use. safe_parse_maxint_with_suffix function parses K,M,G,T suffix after number. 注:更新的GRUB4DOS版本中已经使用这个参数替换了默认的safe_parse_maxint函数。 所以只要支持数值的命令行都可以使用以上特性。比如: read 0x100000 //读取内存1MB处的数值 可以写成如下方式,方便使用。 read 1m 其它的命令只要支持数值输入的都可以使用这个特性。 ****************************************************************************** *** Graphics mode 6A: 800x600 with 16 colors *** ****************************************************************************** 现在有两2种可选的图形模式,默认的是640x480模式. 新的是800x600模式(对一些机子支持不是很好,有可能会死机)。 使用以下方法可以切换图形显示模式。 1. 确定目前是在控制台模式,你可以执行命令 "terminal console" 进行切换。 2. 使用命令"graphicsmode 0x6a" 设置图形模式为0x6A。 3. 进入图形模式,你可以使用命令"terminal graphics". 如果在切换之前不是图形模式,那该命令无效,你可以使用splashimg或fontfile命令。 注: 1. 如果想换回默认的640x480,把上面的第2步改成"graphicsmode 0x12". 2. 经过改进,更新的版本,可以直接改变,只要上面第2步一条命令就可以搞定。 例子: 在默认图形模式中(使用splashimage或fontfile命令都会进入图形模式). 输入以下命令可以直接切换到800x600. graphicsmode 0x6a ***************************************************************************** ***** GRUB4DOS的变量支持 ***** ***************************************************************************** 新的版本支持变量,用法和MSDOS一样。 关键命令: set [/p] [/a|/A] [/l|/u] [VARIABLE=[STRING]] variable 指定环境变量名(最长8个字符)。 string 指定要指派给变量的一系列字符串(最长512个字符)。 不带参数的 SET命令会显示当前变量。 要删除某个变量,只需要让=后面为空就可以 set myvar= 将会删除变量myvar 显示已使用的名称的所有变量的值。例如: set ex_ 会显示所有以ex_开头的变量,如果没有任何匹配返回0. 注:1.使用和MSDOS一样的处理方用户法,一整行的命令会在执行前先进行变量替换。 2.变量名必须使用字母或_开头。否则你将无法访问你的变量。 3.长度限制请看前面说明。 4.输入"set *"可以清除所有已设置的变量。 5./a 后面的STRING是一个表达式,将调用CALC进行计算,保存结果为10进制数。 6./A 同上,但保存结果为16进制数。 7./l|/u 大小写转换。 8./p 显示一个提示STRING并获取用户的输入内容并设置为变量VARIABLE的值。 新增的命令if if [/I] [NOT] STRING1==STRING2 [COMMAND] if [NOT] exist VARIABLE|FILENAME [COMMAND] 1.如果STRING1==STRING2 字符串匹配,执行后面的COMMAND(如果有指定的话)。 否则返回TRUE。 2./I 参数指写不区分大小写匹配。 3.[NOT] 相反,如果STRING1==STRING2不匹配。 4.exist 用于判断变量VARIABLE或文件FILENAME是否存在(filename必须以"/"或"("开头). 例子: 1.判断字符串是否相等,并且不区分大小写。 if /i test==%myvar% echo this is a test 2.判断字符是否为空。 if %myvar%#==# echo variable myvar not defined. 注:我们使用了一个#不防止空操作,当然也可以使用其它字符,如 if "%myvar%"=="" echo variable myvar not defined. 使用方法举例: 1.显示一个包括变量的串。 echo myvar = %myvar% 2.使用一个变量代替命令。 set print=echo %print% This a test. 3.你可以使用一个“^”来阻此被变被扩展,例子 echo %myvar^% 或 echo %my^var% 将会显示 %myvar%而不是扩展myvar之后的字符。 总之,只要出现了^那就不会扩展这个变量。 注:我们只处理在%%之间的^符号。 ***************************************************************************** ***** GRUB4DOS的批处理脚本支持 ***** ***************************************************************************** 新的版本支持运行一个批处理脚本,语法和MS-DOS的批处理几乎一模一样。 你不需要学习新的知识就可以应用GRUB4DOS的批处理,唯一要做的就是学习GRUB4DOS命令。 例子一个简单的脚本(看一下是不是和MS-DOS一样): =========GRUB4DOS BATCH SCRIPT START=============================== !BAT #注:文件头!BAT是必须的用于识别这是一个GRUB4DOS批处理脚本 echo %0 echo Your type: %1 %2 %3 %4 %5 %6 %7 %8 %9 call :label1 This is a test string goto :label2 :label1 echo %1 %2 %3 %4 %5 %6 %7 %8 %9 goto :eof :label2 echo end of batch script. =========GRUB4DOS BATCH SCRIPT END=============================== 一些区别说明: 1.出现错误时将停止执行。 2.如果需要中途停止批处理脚本的运行可以用exit 1 3.%9是指剩下的所有参数。 4.支持shift命令。 5.可扩展参数 %~d0 扩展%0到磁盘号.例如:(hd0,0),默认是()。 %~p0 扩展%0到一个路径。 %~n0 扩展%0到一个文件名. %~x0 扩展%0到一个文件扩展名。 %~f0 扩展%0到一个完整的文件路径名(相当于%~dpnx0). %~z0 扩展%0到文件大小. 6.其它用法请参考CMD的批处理。 在这里可以找到一些脚本 http://chenall.net/post/tag/grub4dos/ ******************************************************************************** 条件菜单(iftitle) ******************************************************************************** 自2011-12-04的版本开始支持条件菜单,可以根据某个特定的条件来决定是否显示某个菜单。 为了区别之前的普通菜单,使用新的参数iftitle。 语法如下: iftitle [] Actual Title displayed\nOptional help line iftitle [] 菜单标题\n菜单帮助 注意: 1.command必须是一个合法的GRUB4DOS命令,支持调用外部命令。 注:像echo/pause之类的命令在条件菜单命令中被禁用。 大部份的命令都可以使用,如果碰到不能使用的不要奇怪,非要使用可以提交BUG。 2.菜单标题前至少要保留一个空格. 3.[]是必须的,不可少。 4.如果[]里面的内容为空相当于title即不判断。 5.你可以使用该功能来快速注释整个菜单的内容(不显示菜单),只需要使用一个非法的命令即可。