TI AM335x Linux系统启动时间优化
我们一般提供的Linux系统功能都是标准全面的,但是会有一些用户它根据自己产品的特殊场合,对时间系统的启动时间有一定的要求,有些功能并不是必要,那么就需要对系统进行优化,我们这里将介绍如何对我们公司的AM335x系列产品进行时间优化。
一、打开调试信息
在调试间断,评估时间应打开一些时间信息帮助分析,在调试之后再关闭。
$
make
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
Kernel hacking --->
Show timing information on printks
重新编译内核之后,在启动时内核的每行打印信息前面都会显示一个像这样的时间:
[ 0.000000] Console: colour dummy device 70x40
[ 0.000186] Calibrating delay loop... 795.44 BogoMIPS (lpj=3977216)
[ 0.087583] pid_max: default: 32768 minimum: 301
[ 0.087697] Security Framework initialized
[ 0.087794] Mount-cache hash table entries: 512
[ 0.088171] CPU: Testing write buffer coherency: ok
二、启动阶段
Linux系统启动会分为MLO、U-boot、Kernel、Filesystem等几个阶段的运行。如何从打印信息区分所处的时哪个阶段呢,可以用如下的打印字段来查找。
MLO:当出现第一行字符时,MLO就开始执行了。
Bootloader:当显示“U-Boot 2015.07 (May 20 2017 - 08:45:22 +0800)”时,则Bootloader已开始执行。
Kernel: 当显示“Uncompressing Linux... done, booting the kernel. ”时,则Linux Kernel已开始执行。
Filesystem:当第一条没有方括号Linux时间戳的打印信息显示时,即说明不是内核输出的信息,那么这是文件系统开始初始化。
三、内核启动优化分析
利用Kernel的时间戳,我们可以分析内核的启动情况,
通过从启动的打印时间信息分析得出,内核启动耗时约6.2秒,其中下面三个占的时间比较多。
1、serial_omap_init:串口初始化,用时约0.6秒。初始化的串口数比较多,如果你不需要那么多的串口,可以裁剪这里加快初始化时间。
2、omap_nand_init:Nand初始化,用时约0.6秒。NAND的初始化速度会受到存储设备IO的影响,可以考虑使用速度更快的存储器进行优化。
3、ubi_init:UBI文件系统初始化,用时约2.4秒。UBI文件系统的初始化,可以通过减小文件系统容量的方法,来加快文件系统加载以及执行初始化的速度。
四、可以优化的其他常见地方
1、关闭内核校验
默认的,U-boot加载内核时会对读取的内核数据进行校验,如下所示:
Entry Point: 80008000
Verifying Checksum ... OK
XIP Kernel Image ... OK
如果在判断校验失败后,没有任何应对措施的话,那么校验就是浪费时间而已,所以如果你没有修复措施,建议禁用内核的校验,关闭需要修改两个地方。
1)在命令行或环境变量中将verify保存为n
setenv verify n
2)修改U-boot代码 /common/cmd_bootm.c
- images.verify = getenv_yesno (
"verify"
);
+
// images.verify = getenv_yesno ("verify");
+ images.verify = 0;
2、取消U-BOOT延时
U-boot启动时会出现读秒,并提示按任意键中断启动的字样。如果最终产品不需要操作U-boot命令行,这也是浪费时间的。
在U-boot命令行或环境变量中将bootdelay保存为0。
setenv Bootdelay 0
3、减少U-BOOT环境变量内容
为了通用性和开发便捷,我们提供的U-boot环境变量文本比较大,但一般最终产品之后用到其中的一部分,那么读取将会耗费多余的时间,
可减小文本内容以加快读取的速度。
如果不需要IP,在U-boot环境变量中将ip=off,还可以用mem=参数减小需要初始化的内存容量,加快速度。
4、移除不适用的外设模块
1)、如果在MLO中不使用NAND Flash和OneNAND
#undef CFG_NAND
#undef CFG_ONENAND
2)、如果在MLO中不使用MMC/SD
#undef CONFIG_MMC
#undef CFG_CMD_MMC
#undef CFG_CMD_FAT
#undef CONFIG_DOS_PARTITION
3)、如果在U-boot中不需要帮助信息
#undef CONFIG_SYS_LONGHELP
4)、如果在U-boot中不需要USB
#undef CONFIG_USB_OMAP3
#undef CONFIG_MUSB_HCD
#undef CONFIG_MUSB_UDC
5)、如果在U-boot中不需要网络
#undef CONFIG_CMD_NET
五、内核模块加载,延迟初始化
有些不是很常用的驱动,我们可以将其选中编译为模块,在使用时在将其insmod进来。
还有一种是在启动后不会马上使用的模块,可以使用延迟初始话的方法,使Linux先尽快跑起来,之后再加载设置为延迟启动的功能。
设置延迟初始化的方法为将内核代码中的
--module_init()
修改为
++deferred_module_init()
然后在启动启动之后使用如下命令手动开启
$ echo
1 >
/proc/deferred_initcalls
六、关闭打印信息
在默认配置中,引导加载程序和Linux内核串行控制台打印许多详细的消息。 虽然在开发阶段非常有用,这些消息不需要最终的产品。 根据打印的数量,关掉这些消息可以节省1 - 2秒的整体引导过程。方法如下:
1)、MLO:
# undef CFG_PRINTF
2)、U-BOOT:
先在U-boot代码中定义:
#define CONFIG_SILENT_CONSOLE 1
再将以下参数保存到环境变量:
set
silent 1
saveenv
3)、内核:
将“quiet“传递到内核的command-line中
4)、gcc:
在所有的Relase编译中删除-g参数,来禁用gdbg调试功能。
以上就是关于如何缩短开机时间的一些经验分享,希望能对大家有一点点启发。