Linux Kernel在启动时执行的第一个操作是什么?

时间:2010-04-07 03:35:36

标签: c linux assembly kernel

在引导加载程序将执行交给内核后,会发生什么?我知道汇编程序,那么内核必须做的前几条指令是什么?或者是否有C函数执行此操作?在内核执行任意二进制文件之前启动序列是什么?

2 个答案:

答案 0 :(得分:42)

我假设你在这里谈论x86 ......

这取决于您认为“引导加载程序”和“内核”之间的边界是:内核的正确启动是32位保护模式代码,但内核本身提供了一些启动代码以从实模式到达

真实模式代码在arch/x86/boot/中:start_of_setup为C做了一些基本的环境设置,并调用main(),这会做一些相当沉闷的事情,以实际的跳转结束到保护模式(见pmjump.S)。

现在最终取决于内核是否被压缩。如果是,则入口点实际上是自解压程序。这也是相当枯燥的东西,并且基本上是透明的:解压缩代码和压缩内核在内存中移动到更高的位置,然后内核被解压缩到原始位置,然后跳转到好像它已经解压缩所有沿。此代码位于arch/x86/boot/compressed/startup_32中的入口点为head_32.S)。

内核确实在startup_32arch/x86/kernel/head_32.S处正常运行。那里的代码最后通过调用i386_start_kernel()中的arch/x86/kernel/head32.c来结束,最终调用start_kernel()中的通用内核启动代码。

答案 1 :(得分:9)