在优化linux启动速度时,首先需要能够精确测量,以便有针对性的进行优化。
在操作中,想到以下三种方法:
1、通过printk打印时戳。此方法最简单,也最不靠谱。因为打印本身就耗时,而且时钟初始化完成前,无法统计。也无法跟uboot启动时间一起统计。
2、通过GPIO电平变化,用示波器抓波形统计。此方法实时较苦难。
3、通过一个片内空闲的定时器实现统计。
实际操作中选择了方案三,贴代码不太方便,简单介绍下实现方式,供参考。
1、在uboot中实现定时器的初始化和当前计数值的读取函数。可用C实现。
2、计数值保存在静态分配的全局变量中。boot优化阶段,可实现命令打印出计数值。在统计boot引导内核的时间时,可将引导内核前的计数值通过bootargs传递给内核,然后在内核中查看即可。
3、计数值到ms的转换,不同的定时器可能稍有差异。基本上用计数值除以频率就可以了。
4、内核中可直接读取定时器的计数值,实现计数值读取函数即可,不需要重复初始化。
5、在内核中定义全局的静态变量,在合适的位置读取计数值,并存入全局变量中。
6、实现proc项读取全局变量的值即可得到系统启动的耗时信息。
注意事项:
1、boot下在将镜像拷贝到内存之前,不可记录时间。
2、内核下如果在时能mmu之前统计时间,需要实现两个去读函数,分别对应是否开启mmu。