GRUB会切换到保护模式吗?

19

我想问一下,是GRUB在启动时将CPU切换到保护模式,还是Linux内核在做这件事。此外,我还想问一下 - 内核本身(vmlinuz)是ELF格式还是纯二进制格式?谢谢。


你是在询问 grub legacy 还是 grub2? - Ben Voigt
1
我对 grub 的两个版本都很感兴趣。 - mnc
我认为可以安全地假设,因为Grub和LILO的两个版本在回答您的问题方面完全相同(因为它们都是引导相同内核)。 - MK.
3个回答

18

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


好的,我确定Linux在启动时会进入实模式,因为我曾经不得不修补那段代码。无论如何,当你得到完整的答案时,我认为你应该先回答关于Linux的问题。 - Nemo
1
我现在已经花了大约3个小时来寻找关于appx的答案(阅读规格、Linux源代码、freenode频道等,没有明确的答案),最后的办法是检查代码。我认为你可以帮助我吗? - phoxis
我非常确定Linux的入口点是header.S - Nemo
2
好的,我觉得我找到了。 GRUB大多数运行在保护模式下,但是当它调用内核时会返回实模式。 grub_linux_cmd的实现(它实现了“linux”grub.conf命令) 调用 grub_loader_set(),并使用grub_linux16_boot进行操作。那就是关键点。 - Nemo
2
现代Linux内核实际上可以在实模式或保护模式下工作,而不必考虑CPU的状态。因为尽管在BIOS系统中内核需要自己切换模式,但是(U)EFI系统在执行到内核或grub之前就已经切换到了保护模式。 - Hi-Angel
显示剩余5条评论

0

0
我建议这里的答案是,GRUB加载程序在加载内核之前切换到“非真实模式”(这解释了为什么此时未设置CR0位0)。启用完整的32位寻址,为[0,4Gigs>设置了平面GDT,启用了A20线,但未启用分页,因此Linux内核(或任何其他内核)仍然必须执行该操作并切换回保护模式。

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


好的,我仔细阅读了文档。你所有问题的答案都在这里:https://www.gnu.org/software/grub/manual/multiboot/html_node/Machine-state.html#Machine-state - SonarJetLens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接