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

roo*_*ook 26 c linux assembly kernel

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

Mat*_*ery 44

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

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

实模式代码包括arch/x86/boot/:start_of_setup对C进行环境的一些基本设置,以及调用main(),它做一些相当枯燥的事情,以实际跳转到保护模式结束(参见参考资料pmjump.S).

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

内核确实正常startup_32进入arch/x86/kernel/head_32.S.该代码有通过调用结束i386_start_kernel()arch/x86/kernel/head32.c,最终调用通用内核中的启动代码start_kernel().

  • 经验,真的:熟悉内核源代码树布局,知道在哪里看; 对操作系统引导所涉及的东西(过去为嵌入式系统实现了复杂的多阶段引导代码),以及对x86引导的一些知识,以及知道要查找的内容有足够的经验.我不知道是否有一本涵盖这个领域的好书......(内核内部的细节往往变化很快,以至于书很快就过时了!) (5认同)