GRUB 是不是切换到保护模式?
Posted
技术标签:
【中文标题】GRUB 是不是切换到保护模式?【英文标题】:Does GRUB switch to protected mode?GRUB 是否切换到保护模式? 【发布时间】:2011-06-16 20:29:14 【问题描述】:我想问一下是 GRUB 在启动期间将 CPU 切换到保护模式,还是 Linux 内核在做这件事。我还想问一下——内核本身(vmlinuz)是 ELF 还是纯二进制格式?谢谢。
【问题讨论】:
你问的是 grub legacy 还是 grub2? 我对 grub 的两个版本都感兴趣。 我认为可以安全地假设,因为 Grub 和 LILO 的两个版本就您的问题而言会完全一样(因为它们启动的是同一个内核)。 【参考方案1】:GRUB 确实让你进入保护模式。
GRUB Multiboot Specification (version 0.6.96) Section 3.2 告诉你这个
‘CR0’
位 31 (PG) 必须清零。必须设置位 0 (PE)。其他位均未定义。
而CR0 Register mapping 告诉您系统应该处于保护模式。
Linux 不是多重引导内核,并且不依赖于某些引导加载程序来切换 PM,它遵循 Linux Boot Protocol。但是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 can detect linux boot protocol(GRUB2 和 legacy 也应该)并将 linux 加载到内存中,但 不 切换到保护模式。查看此链接:http://www.gnu.org/software/grub/manual/grub.html#GNU_002fLinux 和此链接中页面的第 16 部分。
【讨论】:
+1 以获得正确答案。不过,他的问题被标记为“linux”,因此您可以考虑将第一行重写为“在其他操作系统上,GRUB 确实 将您置于保护模式,但在 Linux 上不会”(或类似的)。 实际上我正在研究它以捍卫上述路线,究竟发生了什么,并且有些混乱。但是当 linux 启动时 linux 会进行切换,这并不令人困惑。对于其他兼容多重引导的内核,grub 会进行切换。 我正在寻找 appx 的答案,现在说 3 小时(阅读规范、linux 资源、freenode 频道等,没有明确的答案),最后的手段是检查代码。我想你可以帮助我(?) 好的,我想我找到了。 GRUB 主要在保护模式下运行,但它在调用内核时drops back to real mode。 grub_linux_cmd 的实现(实现“linux”grub.conf 命令)使用grub_linux16_boot 调用grub_loader_set()。这就是钩子。 现代 Linux 内核实际上可以在不考虑 CPU 处于真实模式还是保护模式的情况下工作。因为,虽然 Bios 系统内核必须自己切换模式,但是 (U)EFI 系统在执行到内核或 grub 之前很久就会切换到保护模式。【参考方案2】:根据http://www.moses.uklinux.net/patches/lki-1.html,Linux 内核是一个 ELF 二进制文件。我很确定切换到保护模式的是 Linux,而不是引导加载程序。本页同意:http://oss.sgi.com/LDP/HOWTO/Kernel-HOWTO/linux_boot_process.html
【讨论】:
【参考方案3】:我建议这里的答案是 GRUB 加载程序在加载内核之前切换到“虚幻模式”(这解释了为什么此时没有设置 CR0 位 0。) 启用完整的 32 位寻址,为 [0,4Gigs> 设置平面 GDT,启用 A20 行,但未启用分页,因此 Linux 内核(或任何其他内核)仍然必须这样做并切换回到保护模式。
https://en.wikipedia.org/wiki/Unreal_mode
【讨论】:
好吧,我的 RTFMd 正确。您所有问题的答案都在这里; gnu.org/software/grub/manual/multiboot/html_node/…以上是关于GRUB 是不是切换到保护模式?的主要内容,如果未能解决你的问题,请参考以下文章