64位UEFI Ubuntu环境下Linux内核入口点相关技术问询
Linux内核引导相关问题解答
问题1:Linux内核的入口点在哪里?
针对x86_64架构的Linux内核,入口点分两种场景:
- 传统BIOS引导:压缩内核的入口是
arch/x86/boot/compressed/head_64.S里的startup_32,引导加载器会以32位保护模式启动内核,之后内核自行切换到64位模式并完成自身解压。 - 64位UEFI引导:内核支持直接以64位模式启动,入口是
arch/x86/boot/compressed/head_64.S里的startup_64,此时引导加载器会在64位UEFI模式下直接调用这个入口。
问题2:/arch/x86/boot/compressed/head_64.S中的startup_32是否为正确的入口点?
startup_32是压缩内核的32位入口点,但并非所有场景的正确入口:
- 在传统BIOS引导环境下,GRUB等引导加载器会以32位模式加载内核,此时
startup_32就是入口,它负责初始化32位环境、切换到64位长模式、解压内核镜像。 - 但在64位UEFI引导环境下,引导加载器会直接调用
startup_64,startup_32不会作为入口被执行。
问题3:若内核设置为64位,是否意味着其在grub2中以32位模式运行?
不一定,完全取决于引导环境:
- 传统BIOS环境:GRUB2是32位的(因BIOS本身为16位/32位),它会以32位模式加载64位内核,之后内核自行完成从32位到64位的模式切换。
- 64位UEFI环境:GRUB2是64位的,它会直接在64位模式下加载并启动64位内核,全程不会进入32位模式。
问题4:是否存在以startup_64作为入口点的引导加载程序?
当然存在。最典型的就是64位UEFI环境下的GRUB2,它会直接调用arch/x86/boot/compressed/head_64.S里的startup_64作为内核入口。此外,其他符合64位UEFI规范的引导加载器(比如systemd-boot)也支持直接以startup_64为入口启动64位Linux内核。
内容的提问来源于stack exchange,提问作者城山流二
相关产品推荐
相关产品推荐

