GRUB是否切换到保护模式?

mnc*_*mnc 15 linux cpu grub protected-mode linux-kernel

我想问一下,在启动过程中是否将GRUB切换到保护模式,或者它是Linux内核.而且我想问一下 - 内核本身(vmlinuz)是ELF还是纯二进制格式?谢谢.

pho*_*xis 15

GRUB 不会放弃你的保护模式.

GRUB多引导规范(版本0.6.96)第3.2节告诉你这一点

'CR0'

必须清零位31(PG).必须设置位0(PE).其他位都是未定义的.

CR0寄存器映射告诉您该系统应该是在保护模式.


Linux不是多引导内核,并且不依赖于某些引导加载程序来切换PM,它遵循Linux引导协议.但是linux自己做了保护模式切换,并且不依赖于bootloader

检查:http://lxr.linux.no/#linux+v2.6.39/arch/x86/boot/main.c

在这里它调用go_to_protected_mode();然后调用protected_mode_jump ()然后做的CR0东西(设置位0)

(另一位表示禁用了分页)

编辑

我能弄清楚的是,GRUB可以检测到Linux引导协议(GRUB2,也应该是遗留的)并在内存中加载linux,但不会切换到保护模式.请查看此链接:http://www.gnu.org/software/grub/manual/grub.html#GNU_002fLinux和此链接页面的第16部分.

  • 好吧,我想我找到了。GRUB 主要在保护模式下运行,但它[回落到实模式](http://bzr.savannah.gnu.org/lh/grub/trunk/grub/annotate/head:/grub-core/lib/i386/ relocator16.S)当它调用内核时。grub_linux_cmd 的实现(实现“linux”grub.conf 命令)使用 [grub_linux16_boot](http://bzr.savannah.gnu.org/lh/grub/trunk/grub/annotate/head:/ 调用 grub_loader_set() grub-core/loader/i386/pc/linux.c#L82)。这就是钩子。 (2认同)
  • 现代Linux内核实际上无视CPU是实模式还是保护模式.因为,虽然BIOS系统内核必须自己切换模式,但是(U)EFI系统在执行到内核或grub之前很久就会切换到保护模式. (2认同)

MK.*_*MK. 0

根据http://www.moses.uklinux.net/patches/lki-1.html Linux 内核是一个 ELF 二进制文件。我很确定是 Linux 切换到保护模式,而不是引导加载程序。本页同意:http://oss.sgi.com/LDP/HOWTO/Kernel-HOWTO/linux_boot_process.html