原文
前言
为了提高开机时间,我们需要优化的部分有:
1) bootloader 启动速度
2) Linux 内核启动速度
3) 文件系统启动速度
4) Nand (假设你的 Storage 使用 nand)的读速度
5) 应用框架启动速度
等等。
本文的内容为自己最近对某内核做的一个优化。供参考。
背景知识
Linux 内核的执行起点在 (arch/arm/kernel/head.S), 首先会初始化硬件(所做不多,因为很多操作 bootloader 已经完成), 获取 cpu id, machine id, 设置少量的页表,然后打开 MMU。清空 BSS 后, 会跳转到 C 语言函数 start_kernel
Start_kernel 调了很多早期初始化函数, 然后会调 用 rest_init.
Rest_init 函数中, 会创建 init 线程,并调度它, 该线程最 终调用用户空间的 init 程序, 进化为一切其他用户程序的祖宗进程。
原来的 rest_init 会继续执行,它先通过手工方式,把自己演变成0号进程, 然后调用 cpu_idle 函数, 此函数乃一 while(1){}循环, 永不退 出!
这样, 系统启动显示运行0号进程,然后运行 1 号进程, 只有在系 统没事可干时, 才会调用 0 号进程, 所以, 0 号进程又叫 idle 进程。
对于我们来说,主要的任务(很多很多的 init 函数调用)则是由 1 号进程 init 来完成的。 它的主函数为:kernel_init, 其中会调用do_basic_setup,该函数会调用do_initcalls,内核启动的大多数时间就花在该函数里。
准备
首先,我们打开CONFIG_PRINTK_TIME, 这样,内核的串口打印信息就带有时间信息,精度为 jiffies (1 – 10 ms). 这基本满足我们的需要了。
其次,由于 initcall 中调用了很多初始化函数,我们加入打印语句,以便能够判断出某段时间花在那个初始函数上。
diff --git a/init/main.c b/init/main.c
index 7ef6a1e..7642983 100755
--- a/init/main.c
+++ b/init/main.c
@@ -800,8 +800,10 @@