動機
設備啟動時間往往是項目立項時的一項重要技術指標。快速的啟動時間意味着設備宕機時間的縮短,系統的快速恢復,也能改善用戶使用時的體驗感受,是一項重要的市場競爭力。
准備
優化啟動時間之前,我們首先要了解下我們設備的主要啟動流程,如下圖所述,設備啟動流程主要包含:硬件、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以內。