我想问一下是GRUB在启动期间将CPU切换到保护模式还是Linux内核做到了。我还想问一下——内核本身(vmlinuz)是 ELF 还是纯二进制格式?谢谢。
3 回答
GRUB确实会让您进入保护模式。
GRUB Multiboot Specification (version 0.6.96) Section 3.2告诉你这个
'CR0'</p>
位 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();
when 然后调用protected_mode_jump ()
which 然后执行这些操作CR0
(将位设置为 0)
(另一位说分页被禁用)
编辑
我能弄清楚的是,GRUB 可以检测到 linux 引导协议(GRUB2 和 legacy 也应该)并将 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
我建议这里的答案是 GRUB 加载器在加载内核之前切换到“虚幻模式”(这解释了为什么此时没有设置 CR0 位 0。)启用了完整的 32 位寻址,设置了平面 GDT对于 [0,4Gigs>,启用 A20 行,但未启用分页,因此 Linux 内核(或任何其他内核)仍必须这样做并切换回保护模式。