我想问一下,是GRUB在启动时将CPU切换到保护模式,还是Linux内核在做这件事。此外,我还想问一下 - 内核本身(vmlinuz)是ELF格式还是纯二进制格式?谢谢。
我想问一下,是GRUB在启动时将CPU切换到保护模式,还是Linux内核在做这件事。此外,我还想问一下 - 内核本身(vmlinuz)是ELF格式还是纯二进制格式?谢谢。
GRUB会将您置于保护模式。
GRUB Multiboot规范(版本0.6.96)第3.2节告诉您这一点。
'CR0'
第31位(PG)必须被清除。第0位(PE)必须被设置。其他位都是未定义的。
CR0寄存器映射也告诉您系统应该处于保护模式。
Linux不是一个多引导内核,也不依赖于某个引导程序来切换PM,它遵循Linux Boot Protocol。但是Linux会自行进行保护模式切换,而不依赖于引导程序。
检查: 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节。
根据http://www.moses.uklinux.net/patches/lki-1.html,Linux内核是一个ELF二进制文件。我很确定是Linux切换到保护模式,而不是引导加载程序。这个页面也同意:http://oss.sgi.com/LDP/HOWTO/Kernel-HOWTO/linux_boot_process.html