|
本帖最后由 不点 于 2024-12-18 13:48 编辑
如果是 BIOS 启动,他的 chainloader +1 也没啥错误。当然了,他已经说是 UEFI 启动,所以就不适用了。
chainloader +1 是省略了当前 root 设备的写法。这是正确的。
先执行 root (hd1,1) 再执行 chainloader +1,也就会执行 chainloader (hd1,1)+1,这就是启动 PBR。
同理,先执行 root (hd1,2) 再执行 chainloader +1,也就会执行 chainloader (hd1,2)+1,这是启动另一个 PBR。
可能 legacy BIOS 还没完全消失,所以,顺便提醒一下:
在 grub4dos for legacy BIOS 中,无论如何,root 命令(通常)是不可省略的。如果没有 root 命令,那也得有 rootnoverify 命令。如果都没有,那也得有 find --set-root 之类的命令。为什么呢?因为在 boot 命令执行的时候,它会把 CPU 的 DL 寄存器的值设定为 “当前设备的 BIOS 盘号”。而 root 命令、rootnoverify 命令以及 find --set-root 命令,就是用来设定 “当前设备的 BIOS 盘号” 的。
在 NTLDR 以及更早的系统下(DOS、Win98、Me、2000、XP),当前设备必须是 (fd0) 或 (hd0,,x),然后才可以 boot,否则,引导扇区中的代码会产生失败,无法启动操作系统。
从 BOOTMGR 开始,当前设备可以是 (hd1,x),(hd2,x) 等等了。
但假如您的启动方案里面包括了 NTLDR 或更早的系统,您还是应该尽量保证 boot 命令执行的那一刻,当前设备一定是 (hd0,x)。
注意,菜单命令末尾处可以省略 boot 命令。这条省略的 boot 命令,仍然是要自动执行的。也就是说,不管你是否忘了写最后这条 boot 命令,它都会执行。既然它执行,那就需要保证此时当前 root 设备一定是 (hd0,x)。
【补充】严格来说,影响 boot 时 BIOS 盘号 (CPU 的 DL 寄存器值)设定的,还有 chainloader /ntldr 之类的命令。chainloader 有个参数 --edx 可以用来设定 cpu 的 EDX 寄存器的值。某些引导扇区的正确执行,依赖于特定的 CPU 寄存器设定。chainloader 的这些不常用的参数,就是这样的用途。
|
|