|
RUB4DOS 邮件列表(未用):
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/forum.php?mod=viewthread&tid=274070
已知 gcc-4.7.x 所产生的程序无法运行 memtest86。
来源: http://bbs.wuyou.net/redirect.ph ... 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
更新 12: 增加了 exFAT 分区启动。
更新 13: 支持 udf 格式光盘。支持 iso9600 Joliet 扩展格式光盘。并可以启动它。
可以把 grldr_cd.bin 作为 cdrom 的引导代码。
--------------------------------------------------------
这里用一些示例来演示磁盘仿真命令的用法:
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的命令行模式中。
注意“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/3/4 引导扇区/引导记录的布局 (用于载入grldr)
------------------------------------------------------------------------------
一个EXT2/3/4的卷可以由GRUB启动。复制grldr和可选的menu.lst文件到这个EXT2/3/4
卷的根目录,并按照grldr.pbr的第3至4扇区建立它的引导扇区。那么,这个EXT2/3/4卷就是GRUB可启动的。
更新: bootlace.com是一个dos/linux下的工具,它可以把GRLDR的引导记录安装到一个
EXT2/3/4卷的第一扇区。
更新: 可以直接复制引导代码到启动分区,引导代码会自动生成头部参数。
偏移 长度 说明
====== ====== ==============================================================
00h 2 近转移指令的机器码
02h 1 0x90
03h 8 OEM 名称字符串(对该磁盘进行格式化的操作系统的名字)。
更新:此字段现在被用于分区提示信息“EXT2/3/4”
0Bh 2 每扇区字节数。必须为512 。
0Dh 1 每块扇区数。有效值是2, 4, 8, 16 和 32。
0Eh 2 每块字节数。有效值是0x400, 0x800, 0x1000, 0x2000 和 0x4000。
10h 4 在pointers-per-block块中的指针数,即一个二级间接块包含的块数。
有效值是0x10000, 0x40000, 0x100000, 0x400000 和 0x1000000。
14h 4 每块指针数,即一个间接块包含的块数。
有效值是0x100, 0x200, 0x400, 0x800, 0x1000 。
18h 2 每磁道的扇区数。
1Ah 2 磁头数/面数
1Ch 4 隐藏扇区数(它们位于引导扇区之前)
也被成为是分区的起始扇区。
对于软盘,它应当为0 。
20h 4 文件系统中的扇区总数(或者是分区的扇区总数)。
24h 1 启动设备的 BIOS 驱动器号码。
实际此字节在读入时被忽略。引导代码将把DL的值写入到此字节中。
BIOS或者调用程序应当在DL中设置磁盘号码。
我们假定所有的BIOS在DL中能传递正确的磁盘号码。
糟糕的BIOS不被支持!!
25h 1 此分区在启动驱动器上的分区号
0, 1, 2, 3 是主分区 。4, 5, 6, ... 等等是扩展分区中的逻辑分区。
0xff代表整个磁盘。所以对于软盘,其分区号码应当是0xff 。
26h 2 字节计数的索引节点大小。(注意!我们在此处为索引节点大小使用
了以前被保留的一个字,即两个字节)
28h 4 每组的i节点数
通常,1.44M软盘只有一个组,并且总的i节点数是184。所以此值
应为184或者更大。
2Ch 4 组描述符的块号码。
对于1024字节的块有效值是2 ,否则是1 。
这里的值等于(s_first_data_block + 1)。
30h 462 机器码部分。
1FEh 2 引导签名AA55h 。
200h 510 机器码部分。
3FEh 2 引导签名AA55h 。
2. FAT12/FAT16 引导扇区/引导记录的布局 (用于载入grldr)
------------------------------------------------------------------------------
一个FAT12/16的卷是GRUB可启动的。复制grldr和可选的menu.lst文件到这个FAT12/16 卷
的根目录,并按照grldr.pbr的第二扇区建立它的引导扇区。然后这个FAT12/16的卷就是GRUB可启动的。
更新: bootlace.com 是一个dos/linux下的工具,而它能把GRLDR的引导记录安装到一个
FAT12/16卷的引导扇区。
偏移 长度 说明
====== ====== ==============================================================
00h 2 近转移指令的机器码
02h 1 0x90
更新 (2006-07-31):尽管GRLDR不再使用LBA指示码这个字节,
但Windows 98会使用它。通常这个字节在 CHS 模式中应当设置为0x90
(软盘尤其如此)。如果此字节未被正确设置,Windows 98将不能识别
软盘或分区。这一问题由neiljoy先生报告。非常感谢!
03h 8 OEM名称字符串 (对该磁盘进行格式化的操作系统的名称)
0Bh 2 每扇区字节数。必须为512 。
0Dh 1 每簇的扇区数。有效值是1, 2, 4, 8, 16, 32, 64和128 。但是簇大小
大于32K的情况不应发生。
0Eh 2 保留的扇区数(第一文件分配表之前的扇区数,包括引导扇区),通常是1。
10h 1 文件分配表数(几乎总是2)。
11h 2 根目录项的最大个数。
13h 2 扇区总数(仅用于小磁盘,如果磁盘太大此处被设置为0,而偏移 20h 处
则替代它使用)。
15h 1 媒体描述符字节,现在该此节已经没有太大意义了(参见后面)。
16h 2 每个文件分配表的扇区数。
18h 2 每个磁道的扇区数
1Ah 2 磁头或面的总数。
1Ch 4 隐藏扇区数(位于引导扇区之前)。
也被称为是分区的开始扇区。
对于软盘,它应当为0 。
20h 4 大磁盘的扇区总数。
24h 1 引导设备的BIOS磁盘号。
实际此字节在读入时被忽略。引导代码将把DL中的值写入此字节。
BIOS或者调用程序应当在DL中设置磁盘号码。
我们假定所有的BIOS在DL中能传递正确的磁盘号码。
糟糕的BIOS不被支持!!
25h 1 启动驱动器上此文件系统的分区号码。
更新:此字段被忽略。
26h 1 签名(必须是28h或者29h以便能被 NT 识别)
27h 4 卷的序列号。
2Bh 11 卷标签。
36h 8 文件系统ID。“FAT12”, “FAT16”。
3Eh 446 机器码部分。
1FCh 4 引导签名AA550000h 。(Win9x 使用4字节作为魔数值。)
3. FAT32 引导扇区/引导记录的布局 (用于载入grldr)
------------------------------------------------------------------------------
一个FAT32的卷是GRUB可启动的。复制grldr和可选的menu.lst文件到这个FAT32卷的根
目录,并按照grldr.pbr的第一扇区建立它的引导扇区。然后这个FAT32的卷就是GRUB可启动的。
更新: bootlace.com 是一个dos及linux下的工具而它能把 GRLDR 的引导记录安装
到一个FAT32卷的引导扇区。
偏移 长度 说明
====== ====== ==============================================================
00h 2 近转移指令的机器码。
02h 1 0x90
更新 (2006-07-31):尽管GRLDR不再使用 LBA 指示码这个字节,
但Windows 98会使用它。通常这个字节在 CHS 模式中应当设置为0x90
(软盘尤其如此)。如果此字节未被正确设置,Windows 98 将不能识别
软盘或分区。这一问题由neiljoy先生报告。非常感谢!
03h 8 OEM名称字符串 (对该磁盘进行格式化的操作系统的名称)
0Bh 2 每扇区字节数。必须为512 。
0Dh 1 每簇的扇区数。有效值是1, 2, 4, 8, 16, 32, 64 和 128 。
但是簇大小大于32K的情况不应发生。
0Eh 2 保留的扇区数(第一文件分配表之前的扇区数,包括引导扇区),
通常是1 。
10h 1 文件分配表数(几乎总是2)。
11h 2 (根目录项的最大个数)必须为0 。
13h 2 (仅用于小磁盘的扇区总数)必须为0 。
15h 1 媒体描述符字节,现在该此节已经没有太大意义了(参见后面)。
16h 2 (每个文件分配表的扇区数)必须为0 。
18h 2 每个磁道的扇区数
1Ah 2 磁头或面的总数。
1Ch 4 隐藏扇区数(它们位于引导扇区之前)。
也被称作是分区的起始扇区。
对于软盘,它应当为0 。
20h 4 大磁盘的扇区总数。
24h 4 每个文件分配表的 FAT32 扇区数。
28h 2 如果第7位被清零,所有文件分配表将被更新,否则0-3位给出当前活
动的文件分配表,所有其它位被保留。
2Ah 2 高字节是主修订号码,低字节是小修订号码,现在都是0 。
2Ch 4 根目录起始簇。
30h 2 文件系统信息扇区。
32h 2 如果非零它给出具有引导记录的备份扇区,通常是6。
34h 12 保留,设为0 。
40h 1 启动设备的 BIOS 驱动器号码。
第一硬盘是80h,第一软盘是00h。
实际此字节在读入时被忽略。引导代码将把DL中的值写入此字节。
BIOS或者调用程序应当在DL中设置磁盘号码。
我们假定所有的 BIOS 在DL中能传递正确的磁盘号码。
糟糕的BIOS不被支持!!
41h 1 启动驱动器上此文件系统的分区号码。
此字节在读入时被忽略。引导代码将分区号码写到此字节。
见下述的偏移5Dh 。
更新:此字段被忽略。
42h 1 签名(必须是 28h 或者 29h 以便能被 NT 识别)
43h 4 卷的序列号。
47h 11 卷标签。
52h 8 文件系统标识。“FAT32 ”。
5Ah 418 机器码部分。
1FCh 4 引导签名AA550000h 。(Win9x 使用4字节作为魔数值。)
4.NTFS 引导扇区/引导记录的布局 (用于载入grldr)
------------------------------------------------------------------------------
一个NTFS的卷是GRUB可启动的。复制grldr和可选的menu.lst文件到这个NTFS卷的根
目录,并按照grldr.pbr的第7至10扇区建立它的引导扇区。然后这个NTFS的卷就是GRUB可启动的。
更新: bootlace.com是一个在dos/linux下的工具,而它能把GRLDR的引导记录安装到
一个NTFS卷的开头4个扇区。
偏移 长度 说明
====== ====== ==============================================================
00h 2 近转移指令的机器码。
02h 1 0x90
更新 (2006-07-31):尽管GRLDR不再使用 LBA 指示码这个字节,但
Windows 98会使用它。通常这个字节在 CHS 模式中应当设置为0x90
(软盘尤其如此)。如果此字节未被正确设置,Windows 98 将不能识别
软盘或分区。这一问题由neiljoy先生报告。非常感谢!
03h 8 OEM名称字符串 (对该磁盘进行格式化的操作系统的名称)
分区标识“NTFS”。
0Bh 2 每扇区字节数。必须为512 。
0Dh 1 每簇的扇区数。有效值是1, 2, 4, 8, 16, 32, 64 和 128 。
但是簇大小大于32K的情况不应发生。
0Eh 2 (保留的扇区数)未被使用。
10h 1 (文件分配表数)必须为 0 。
11h 2 (根目录项的最大个数)必须为0 。
13h 2 (仅用于小磁盘的扇区总数)必须为0 。
15h 1 媒体描述符字节,现在该此节已经没有太大意义了(参见后面)。
16h 2 (每个文件分配表的扇区数)必须为0 。
18h 2 每个磁道的扇区数。
1Ah 2 磁头/面的总数。
1Ch 4 隐藏扇区数(它们位于引导扇区之前)。
也被称作是分区的起始扇区。
对于软盘,它应当为0 。
20h 4 (大磁盘的扇区总数)必须为 0 。
24h 4 (每个文件分配表的 NTFS 扇区数)- 通常是 80 00 80 00 ,值
为80 00 00 00将被看作是由Windows XP格式化为NTFS的USB拇指碟
28h 8 此卷的扇区号。
30h 8 $MFT的逻辑簇号。
38h 8 $MFTMirr的逻辑簇号。
40h 4 每个MFT记录的簇数。
44h 4 每个索引的簇数。
48h 8 卷序列号
50h 4 校验和,通常为 0 。
54h 424 机器码部分。
1FCh 4 引导签名AA550000h 。(Win9x 使用4字节作为魔数值。)
200h 1536 末尾 3 个扇区为机器码部分。
5. exFAT 引导扇区/引导记录的原始布局(用于载入grldr)
exFAT 引导代码由 Fan JianYe 提供
------------------------------------------------------------------------------
一个exFAT的卷是GRUB可启动的。复制grldr和可选的menu.lst文件到这个exFAT卷的根
目录,并按照grldr.pbr的第5至6扇区建立它的引导扇区。然后这个exFAT的卷就是GRUB可启动的。
注意:如果直接复制引导代码到启动分区,需要从该分区启动一次,自动填充校验码。
否则 Windows 会认为该分区没有格式化。
偏移 长度 说明
====== ====== ==============================================================
00h 3 0xEB7690 跳转代码。
03h 8 "EXFAT " 签名
++++++++ The new increase ++++++++
0bh 2 Bytes per sector
0dh 1 Sectors per cluster
0eh 4 Data start Absolute sector
12h 4 The current cluster the absolute sector in fat table
16h 2 EIOS Mark Bit 7 EIOS
18h 2 Sectors per track
1ah 2 Number of heads
1ch 4 Retention
20h 4 Retention
24h 1 Drive numbe
25h 1 Partition number
26h 2 Retention
28h 4 FAT table start absolute sector number
2ch 4 Retention
++++++++ The new increase ++++++++
30h 16 全部为“00”。
40h 8 分区起始扇区号。相当于"隐含扇区数"
48h 8 分区扇区数。相当于"磁盘逻辑总扇区"
50h 4 FAT表起始扇区号,通常为128号扇区,该值为相对于卷(分区)0扇区号而言。相当于"保留扇区数"
54h 4 FAT表扇区数。相当于"每文件分配表占扇区数"
58h 4 簇起始位置扇区号,该值用以描述文件系统中的第1个簇(即2号簇)的起始扇区号。
通常2号簇分配给簇位图使用,因此,该值也就是簇位图的起始扇区号。
5ch 4 卷内的总簇数。
60h 4 根目录起始簇号。相当于"磁盘根目录起始簇号"
64h 4 卷ID。相当于"磁盘卷的序列号"
68h 2 文件系统版本。 VV.MM(01.00此版本)
6ah 2 内容 位偏移 尺寸 描述
活动FAT 0 1 0/1=第一/第二。相当于"文件分配表镜像标志"
卷脏 1 1 0/1=清洁/肮脏。
媒体失败 2 1 0/1=没有失败/故障报告
零 3 1 没有意义
保留 4 c
6ch 1 每扇区字节数,表示方法为,以2的N次方表示。
6dh 1 每簇扇区数,以2的N次方表示。
6eh 1 FAT表的数。这个数字是1或2,2在TexFAT中使用。
6fh 1 驱动器号。INT 13 使用。
70h 1 簇(堆)在使用中的百分比
71h 7 保留
78h 390 引导代码.
1feh 2 引导签名AA55。
200h 510 引导代码。
3feh 2 引导签名AA55。
6. MBR中的FAT12/16/32/exFAT/EXT2 引导代码合并,占用2扇区多一点。
------------------------------------------------------------------------------
合并后的 FAT12/16/32/exFAT 当前 BPB 结构:
grldr.pbr 中 exFAT 自建的 BPB 结构:
偏移 长度 说明
====== ====== ==============================================================
00h 2 EB 2E 跳转代码
02h 1 分区类型 / EIOS 标记
Bit 0 FAT12
Bit 1 FAT16
Bit 2 FAT32
Bit 3 exFAT
Bit 4 EXT2
Bit 5 保留
Bit 6 EXT4 64位文件系统
Bit 7 EIOS
03h 4 根扇区
07h 4 主目录(FAT12/16)绝对起始扇区
0bh 2 每扇区字节
0dh 1 每簇扇区
0eh 4 数据的起始绝对扇区
12h 4 当前簇在FAT表的绝对扇区
11h 4 数据区绝对起始扇区
16h 2 "EF14" 签名
18h 2 每磁道扇区
1ah 2 磁头数
1ch 4 分区起始绝对扇区
20h 4 磁盘逻辑总扇区
24h 1 驱动器号
25h 1 分区号
26h 2 保留
28h 4 FATs绝对起始扇区
2ch 4 根目录起始簇号
附录A:FAT32 的文件系统信息扇区(不用于引导grldr)
偏移 长度 说明
====== ====== ==============================================================
0h 4 起始处签名 41615252h 。
4h 480 被保留,设为 0 。
1E4h 4 故障征兆指数结构签名 61417272h
1E8h 4 最后已知的空闲簇数,如果它等于FFFFFFFFh,簇数是未知的。
1ECh 4 假如它等于FFFFFFFFh的话,你应当去寻找一个空闲簇的簇号码 。
此字段没有被设置。
1F0h 12 被保留,设为 0 。
1FCh 4 结尾签名AA550000h 。
------------------------------------------------------------------------------
附录B:媒体描述字节(非用于grldr)
此媒体描述字节没有意义,因为有些字节具有多重意义,例如 F0h 。
字节 磁盘种类 扇区 头 磁道 容量
---- ------------ ------- ----- ------ --------
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/16/32,NTFS,EXT2/3/4,EXFAT。在扩展分区
上的逻辑分区也被支持,条件是此扩展分区与微软兼容。实际上,搜索机制没有充分地测试
分区类型(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 - 其控制字节的详述
有六个字节可以控制GRLDR.MBR引导过程。
偏移量 长度 说明
====== ====== ==============================================================
5ah 1 第 0 位=1 :禁止搜索软盘上的GRLDR 。
第 0 位=0 :允许搜索软盘上的GRLDR 。
第 1 位=1 :禁止引导分区表无效的原主引导记录
(通常是一个操作系统的引导扇区)
第 1 位=0 :允许引导分区表无效的原主引导记录
(通常是一个操作系统的引导扇区)
第 2 位 = 1 :禁止无条件进入命令行 (见下面的`--duce')
第 2 位 = 0 :允许无条件进入命令行(见下面的`--duce')
第 3 位= 1 :禁止改变磁盘几何参数(见下面的 `--chs-no-tune')
第 3 位= 0 :允许改变磁盘几何参数(见下面的 `--chs-no-tune')
第 4 位到第 6 位:被保留
第 7 位=1:在搜索 GRLDR 之后尝试引导原先的主引导记录
第 7 位=0:在搜索 GRLDR 之前尝试引导原先的主引导记录
5bh 1 等待键被按下时的暂停秒数。0xff代表始终暂停(即无休止的)。
5ch 2 热键代码。高字节是扫描码,低字节是ASCII码。默认值是0x3920,代
表的是空格键。如果此键被按下,GRUB将在引导原先的主引导记录之前
启动。见“ int16 键盘扫描码”。
5eh 1 优先引导的驱动器号,0xff 代表没有。
5fh 1 优先引导的分区号,0xff 代表整个驱动器。
如果优先引导的驱动器号是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)
否则,如果优先引导的驱动器号假定为Y (且不等于0xff),而优先引导
的分区号为K,那么搜索 GRLDR 的顺序和上面一样。
注意:如果Y小于0x80 ,那么这个(Y)驱动器代表软驱,否则就是硬盘驱动器。
而(Y,K)代表Y号硬盘驱动器上的 k 号分区。
******************************************************************************
*** bootlace.com - 安装GRLDR.MBR自举代码到MBR ***
******************************************************************************
BOOTLACE.COM 能将GRLDR的引导记录安装到硬盘驱动器或硬盘映像文件的主引导记录中,
或者安装到软盘或者软盘映像的引导扇区。
用法:
bootlace.com 选项 设备或文件
选项:
--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 。
--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,EXT4,EXFAT。
注意 2:如果DEVICE_OR_FILE是硬盘设备或是硬盘映像文件,它必须包含有效的分区表,
否则,BOOTLACE.COM 将安装失败。如果设备或文件是指向软驱或者软盘映像文件,那么
他必须包含一个受支持的文件系统(FAT12,FAT16,FAT32,NTFS,EXT2,EXT3,EXT4,EXFAT 等之一)。
重要!! 如果你安装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/sda
在DOS下安装GRLDR的引导代码到MBR:
bootlace.com 0x80
在DOS、Windows或Linux下安装GRLDR的引导代码到硬盘映像:
bootlace.com hd.img
在Linux下安装GRLDR的引导代码到软盘:
bootlace.com --floppy /dev/fd0
在DOS下安装GRLDR的引导代码到软盘:
bootlace.com --floppy 0x00
在DOS、Windows或Linux下安装GRLDR的引导代码到软盘映像:
bootlace.com --floppy 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 应当打上1.101发布的补丁 ***
******************************************************************************
kexec-tools-1.101-patch 是为kexec-tools-1.101发布的补丁。没有这个补丁Kexec 加载
grub.exe 会失败。
kexec-tools 的主页是:
http://www.xmission.com/~ebiederm/files/kexec/
注意: 在使用 kexec 前应该使 Linux 核心支持 KEXEC 系统调用。
重要更新
现在不再需要`kexec-tools-1.101-patch'补丁而且它已经被删除了。很糟糕的是,执行
`kexec -l grub.exe --initrd=imgfile'竟会失败。所以请不要再使用它。
******************************************************************************
*** 从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 (...)’代替,
然后再试一次。 |
|