内核映像被加载到内存并获得控制权之后,内核阶段开始工作。通常,内核映像以压缩形式存储,并不是一个可执行的内核。因此,内核阶段的首要工作是自解压内核映像。内核编译生成vmlinux后,通常会对其再进行压缩,成为zImage(小内核,小于512KB)或bzImage(大内核,大于512KB)。在zImage和bzImage的头部都内嵌有解压缩程序。
然后调用boot/compressed/misc.c中的C函数decompress_kernel来解压内核。decompress_kernel函数打印出信息"Uncompressing Linux..."后,调用gunzip函数将内核解压到内存的指定位置。最后通过kernel/head.s中的 j start_kernel指令调用init/main.c中的start_kernel()函数,进入内核的初始化过程。
内核的初始化过程由start_kernel函数开始,至第一个用户进程init结束,调用了一系列的初始化函数对所有的内核组件进行初始化。其中,start_kernel、rest_init、kernel_init、init_post等4个函数构成了整个初始化过程的主线。从start_kernel函数开始,内核即进入了C语言部分,它完成了内核的大部分初始化工作。实际上,可以将start_kernel函数看做内核的main函数。
Linux内核修炼之道 任桥伟 http://book.51cto.com/art/201007/213533.htm
4.1 引导过程 http://book.51cto.com/art/201007/213597.htm
4.2.1 start_kernel函数 http://book.51cto.com/art/201007/213598.htm
start_kernel() 到 init() http://hi.baidu.com/embededlinux/blog/item/e5b2ca1bb22769d5ac6e75e4.html
arm linux kernel 从入口到start_kernel 的代码分析 http://linux.chinaunix.net/bbs/thread-1021226-1-1.html