在引导加载程序将执行交给内核后,会发生什么?我知道汇编程序,那么内核必须做的前几条指令是什么?或者是否有C函数执行此操作?在内核执行任意二进制文件之前启动序列是什么?
答案 0 :(得分:42)
我假设你在这里谈论x86 ......
这取决于您认为“引导加载程序”和“内核”之间的边界是:内核的正确启动是32位保护模式代码,但内核本身提供了一些启动代码以从实模式到达
真实模式代码在arch/x86/boot/
中:start_of_setup
为C做了一些基本的环境设置,并调用main()
,这会做一些相当沉闷的事情,以实际的跳转结束到保护模式(见pmjump.S
)。
现在最终取决于内核是否被压缩。如果是,则入口点实际上是自解压程序。这也是相当枯燥的东西,并且基本上是透明的:解压缩代码和压缩内核在内存中移动到更高的位置,然后内核被解压缩到原始位置,然后跳转到好像它已经解压缩所有沿。此代码位于arch/x86/boot/compressed/
(startup_32
中的入口点为head_32.S
)。
内核确实在startup_32
的arch/x86/kernel/head_32.S
处正常运行。那里的代码最后通过调用i386_start_kernel()
中的arch/x86/kernel/head32.c
来结束,最终调用start_kernel()
中的通用内核启动代码。
答案 1 :(得分:9)