Linux 内核启动过程
Bootloader 完成系统初始化工作后,将运行控制权交给 Linux 内核。根据内核是否压缩
以及内核是否在本地执行,Linux 通常有以下两种可选的启动方式:
Flash 本地运行方式:内核的未经压缩的可执行映像固化在 Flash,系统启动时内核在
Flash 中开始逐句执行。kernel 映象为非压缩格式,通过 make Image 获得,那么真正的入口
就是 arch/arm/kernel/head_armv.S
压缩内核加载方式:内核的压缩映像固化在 Flash 上,系统启动时由附加在压缩映像
前的解压复制程序读取压缩映像,在内存中解压后执行,这种方式相对复杂,但是运行速
度更快(RAM 的存取速率要比 Flash 高)。如果是 zImage,那么程序的入口是 arch/arm/
boot/compressed/head.S
本节我们介绍压缩内核的启动方式,内核的 Flash 本地运行方式不再详细中介绍。
本地运行时内核的启动包括特定体系结构设置和 Linux 系统初始化两步,内核启动的
入口文件是 arch/arm/kernel/head-armv.s。
特定体系结构设置
本过程由汇编文件 head-armv.s 完成。
Head-armv.s 文件位于./arch/arm/kernel/目录下,是 Boot Loader 将控制权交给内核后执
行的第一个程序。下面是 head-armv.s 的基本运行过程:
1) 配置系统寄存器;
2) 初始化 ROM、RAM 以及总线控制寄存器等;
3) 设置堆栈指针,将 bss 段清零;
4) 修改 pc 指针,跳转到./init/main.c 中的 start_kernel 函数,开始 Linux 系统的初始化。
Linux 系统初始化
程序跳转到 start_kernel 函数执行,在这里完成处理器结构的初始化、中断的初始化、
进程相关的初始化以及内存初始化等重要工作。
下面在 start_kernel 函数中列举了主要的初始化过程:
asmlinkage void __init start_kernel(void)
{
char * command_line;
unsigned long mempages;
extern char saved_command_line[];
/*
* Interrupts are still disabled. Do necessary setups, then enable them
*/
lock_kernel();
printk(Linux_banner); //--注