linux内核(uImage格式镜像,uImage = zImage_压缩的内核镜像 + 0x40字节大小的uboot格式信息头)的启动过程大体可以分为三个阶段:
第一:内核的自解压过程(汇编+C语言实现)
主要由、arch/arm/boot/compressed对zImage完成解压,并调用call_kernel跳转到下阶段代码。
第二:板级引导阶段(汇编实现)
主要进行cpu和体系结构的检查、cpu本身的初始化以及页表的建立等
第三:通用内核启动阶段(C语言实现:重点分析)
1. 进入init/main.c文件,从start_kernel()函数开始进行一系列的内核初始化工作,最后调用rest_init()函数
2. 在rest_init()函数中创建第一个内核线程kernel_init
3. 在kernel_init()线程中初始化各种驱动等,最后调用init_post()函数
4. 在init_post()函数中释放初始化内存段,标志着内核启动完成,并建立起标准输入/标准输出/标准错误输出,然后努力寻找一个用户进程init,将该进程作为系统的第一个用户进程,进程号为1.
5. 内核启动完成,接下来就是用户的事情了。