动机
设备启动时间往往是项目立项时的一项重要技术指标。快速的启动时间意味着设备宕机时间的缩短,系统的快速恢复,也能改善用户使用时的体验感受,是一项重要的市场竞争力。
准备
优化启动时间之前,我们首先要了解下我们设备的主要启动流程,如下图所述,设备启动流程主要包含:硬件、bootloader、操作系统和应用程序4个部分。
硬件部分包括:
- 电源、时钟、复位时序、存储介质以及其他系统启动时需要依赖的外设等;
Bootloader(此处为UBoot)包括:
- CPU、cache、网卡、存储的复位解复位时序、配置流程,启动OS镜像的获取、以及OS的引导跳转等;
操作系统(此处为Linux)包括:
- Linux Kernel、设备驱动、文件系统、根文件系统、板级驱动包BSP等;
应用程序包括:
- 各种服务进程的上电初始化。
另外,在着手优化启动时间之前,我们要对现状有所了解,以帮助我们对启动的各个环节进行检查、度量。
首先我们要打开uboot和Linux Kernel的调试打印开关,保证打印打印到串口。
修改uboot配置,如下:
//#define CONFIG_SILENT_CONSOLE #define DEBUG |
在uboot shell或者cmdline中中设置Linux Kernel打印级别
setenv loglevel 7 |
然后通过下面的几种方法对启动时间进行度量。
记录每条打印的打印时间戳
telnet 192.166.100.3 10006 | ts "%H:%M:%.S" telnet 192.166.100.3 10006 | while read pong; do echo "$(date +"%T.%N"): $pong"; done |
记录每条打印的相对时间戳
telnet 192.166.100.3 10006 | ts -i "%H:%M:%.S" |
针对linux Kernel,还可以配置CONFIG_PRINTK_TIME=y使能内核的日志时间戳功能。
本文只讨论bootloader和Kernel部分的优化方法。
优化
Uboot
- flash CS时序优化
- 版本Flash文件系统从JFFS2切换到UBIFS
- UBIFS/MTD优化
- UBOOT 配置裁剪
- 串口打印优化
- bootdelay优化
- 设备初始化时序优化
- 设备驱动优化
Kernel
- 内核配置裁剪
- 版本Flash文件系统从JFFS2切换到UBIFS
Initrd
- 根文件系统文件裁剪
- 压缩方式从gzip改为LZMA
- rcS优化
BSP
- 设备初始化时序优化
- Delay Device Init,从内核态转为由应用程序根据需要来并行设备初始化
实例
背景介绍:
本设备的引导方式为uboot+linux,OS镜像大小为31MB,存储在版本nor flash上,flash文件系统为JFFS2,内核镜像采用gzip方式压缩。优化前设备启动时间为186s左右,项目要求控制在90s以内。