最近加入的商品

0 件商品 共计 ¥0.00

加入购物车
您的购物车中还没有任何商品。

赛普盛科技

Embedded Computer System

专注嵌入式计算机系统

TI AM335x Linux系统启动时间优化

首页    TI AM335x 应用开发    AM335x 应用经验分享    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调试功能。

 

以上就是关于如何缩短开机时间的一些经验分享,希望能对大家有一点点启发。

 

 

 

 

2019年7月17日 15:19
浏览量:0
收藏
    • 联系客服

    • 0755 2955 4030
    • 189 2600 3503
    • sales@superfae.cn
    • 服务时间

    • 周一至周五 9:00-18:00
    • 微信二维码