linux内核启动优化(3)

原文

前言

       为了提高开机时间,我们需要优化的部分有:

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 @@
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值