19

我想问一下是GRUB在启动期间将CPU切换到保护模式还是Linux内核做到了。我还想问一下——内核本身(vmlinuz)是 ELF 还是纯二进制格式?谢谢。

4

3 回答 3

16

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 节。

于 2011-06-18T14:21:09.543 回答
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

于 2011-01-27T21:35:01.283 回答
0

我建议这里的答案是 GRUB 加载器在加载内核之前切换到“虚幻模式”(这解释了为什么此时没有设置 CR0 位 0。)启用了完整的 32 位寻址,设置了平面 GDT对于 [0,4Gigs>,启用 A20 行,但未启用分页,因此 Linux 内核(或任何其他内核)仍必须这样做并切换回保护模式。

https://en.wikipedia.org/wiki/Unreal_mode

于 2019-09-17T20:22:30.850 回答