8.2.1. 嵌入式linux启动时间优化
在linux系统中执行 man boot
可以看到有以下几个部分
hardware
operating system (OS) loader
kernel
root user-space process (init and inittab)
boot scripts
对系统启动时间优化,即对这些步骤进行优化
8.2.1.1. 启动时间的测量
linux中可以有多种方式获取系统的启动时间
printk times : 用于显示每个printk的执行时间
内核函数跟踪(Ftrace) : 用于报告内核中每个函数的调用时间
linux跟踪工具箱(LTT) : 用于报告确切的内核和进程事件的时间数据
perf : 通用的linux分析器(profile)
Bootchart : 用于linux 启动过程的性能分析和数据显示,收集启动过程中的用户空间部分的资源使用情况和进程信息,然后渲染成PNG,SVG或者EPS格式的图表
Bootprobe : 一组用于分析系统启动过程的system tap脚本
cat /proc/uptime : 统计系统已经运行的时间
grabserial : 用于记录控制台输出并打上时间戳
8.2.1.2. 启动时间优化技巧
8.2.1.2.1. bootloader加速
就地执行(XIP)内核: 允许内核在ROM或者FLASH上就地执行
在启动时通过DMA拷贝内核镜像 : 使用DMA从闪存中拷贝内核到内存
采用未压缩的内核
快速内核解压
关闭不需要的功能 :比如关闭引导程序输出 ,关闭延迟启动, 删除网络加载
8.2.1.2.2. 内核加速
关闭控制台 : 避免启动过程中的控制台输出开销
关闭调试接口和printk : 避免调试接口和printk带来的开销,缺点是丢失大量调试信息
不同步RTC : 避免在启动时延迟用RTC时钟边沿同步系统时间
异步函数调用 : 允许probe函数或者其他函数并行处理
重新排序驱动初始化过程
8.2.1.2.3. 文件系统方面的问题
对于同样的数据集,不同的文件系统拥有不同的初始化(即挂载,mounting)时间,这取决于元数据(meta-data)是否必须从存储器读到内存并且在挂载过程中使用哪种算法
如果挂载一个文件系统耗费太久,那么可以考虑把一个文件系统拆分成几个部分,一部分带有在启动时或者启动后立即需要的信息,另外一些部分则可以延迟挂载
8.2.1.2.4. 用户空间和应用程序加速
优化RC脚本 :减少执行RC脚本的开销
并行执行RC脚本
预链接 :避免在首次加载程序时进行链接
静态链接应用程序 : 这样可以避免运行时链接,如果应用程序少的话这种方式是可行的
应用程序优化
把驱动模块编译到内核镜像中
避免使用udev : 因为它花费一些时间来构建/dev目录,在嵌入式系统中通常会事先知道需要哪些设备,所以我们可以采取静态预先创建设备节点
如果有设备连接网络,最好使用静态IP,通过DHCP获取地址会增加时间