我想问一下,是GRUB在启动时将CPU切换到保护模式,还是Linux内核这样做。我还想问-内核本身(vmlinuz)是ELF还是普通的二进制格式?谢谢。
发布于 2011-06-18 14:21:10
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会自己切换保护模式,而不依赖于引导加载程序
查看: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,以及传统的也应该是),并在内存上加载linux,但不会切换到保护模式。看看这个链接:http://www.gnu.org/software/grub/manual/grub.html#GNU_002fLinux和这个链接中页面的第16部分。
发布于 2011-01-27 21:35:01
根据http://www.moses.uklinux.net/patches/lki-1.html的说法,Linux内核是一个ELF二进制文件。我非常确定切换到保护模式的是Linux,而不是引导加载程序。这个页面同意:http://oss.sgi.com/LDP/HOWTO/Kernel-HOWTO/linux_boot_process.html
发布于 2019-09-17 20:22:31
我建议这里的答案是GRUB加载器在加载内核之前切换到“虚实模式”(这就解释了为什么CR0位0在那个时候没有设置)。启用了完整的32位寻址,为[0,4Gigs> ]设置了一个扁平的GDT,启用了A20行,但是没有启用分页,所以Linux内核(或任何其他内核)仍然必须这样做并切换回保护模式。
https://stackoverflow.com/questions/4821911
复制相似问题