嵌入式linux系统快速启动优化的方法

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式linux系统快速启动优化的方法相关的知识,希望对你有一定的参考价值。

1、嵌入式设备的启动过程

(1)上电首先执行芯片内部固化的代码,这段代码会将BootLoader读取到芯片的iRAM中执行,初始化内存,并将BootLoader代码搬运到内存中继续运行;
(2)BootLoader是启动引导代码,主要作用是将内核加载到内存中并启动。RAM架构的芯片是uboot,X86架构的芯片是Bios
(3)内核会初始化外设,挂载根文件系统并执行启动脚本,脚本里会加载驱动并启动应用程序;

2、减少启动时间的思路分析

(1)减少启动时间可以从硬件和软件两方面进行考虑,其中首先考虑软件优化,硬件主要是电路板设计时进行考虑,后期不方便修改,并且修改硬件会带来较高的成本;
(2)优化的思路可以大致分为两个方向:提高运行的速度,或者裁剪掉不需要的代码以减小程序体积;
(3)软件上大致可以分为系统基础环境的优化和应用程序的优化,两部分可以分开考虑;

3、硬件

3.1、内存ddr类型的选择

(1)内存分为DDR2、DDR3、DDR4,以及低功耗的LPDDR,版本越新的DDR运行速度越快;
(2)首先查阅芯片的数据手册,指定芯片支持哪些版本的DDR,然后再去选择合适的DDR版本;
(3)启动慢也可能是内存容量太小导致,需要分析内存是否是启动慢的瓶颈;

3.2、外存类型的选择

(1)外存分为机械硬盘和闪存,机械硬盘是磁原理,闪存是电学原理,机械硬盘一般来说比闪存慢;
(2)闪存也分为SD卡、eMMC、Nand Flash等,不同的闪存读写速度是不一样的,可以更换读写速度更快的外存来减少开机启动的时间;
(3)同样的外存在不同的模式下的读写速度也是不一样的,比如Nand flash分为四线写和单线写,四线写比单线写要快;

3.3、芯片各模块的时钟频率

(1)芯片是分时钟域的,不同的外设时钟频率是可以配置的,一般来说,在允许的时钟频率范围内,时钟频率越快,设备的运行速度就越快;
(2)在芯片的数据手册里会说明各个模块推荐的时钟频率,先检查当前设备运行时的时钟频率是否是推荐的时钟频率;
(3)推荐的时钟频率不一定是最快的时钟频率,可以将时钟频率提高到超过推荐的时钟频率,但是这里有风险的,对芯片没有足够的了解不建议这样做;
补充:这里说的主要是芯片的主频,以及内存和外存的时钟频率;

4、软件

4.1、uboot的优化

4.1.1、设置启动延时为0

(1)配置boot下的环境变量bootdelay为0。bootdelay是uboot的启动延时时间,目的是让程序员可以进入到uboot的命令行下进行操作,延时的单位是秒,一般来说延时一秒就可以,如果要追求极致的启动时间,可以将bootdelay设置成0秒;
(2)bootdelay设置成0秒会引入另一个问题,就是进入不了uboot的命令行,调试很麻烦。当设备的应用程序或者内核启动失败后,不能进入到uboot下进行调试或者升级等操作,需要使用芯片的烧录工具重新烧录程序,比较麻烦;

4.1.2、配置boot阶段不做内核校验

(1)方法:在uboot下的命令行中输入: setenv verify n;saveenv,关闭内核校验;
(2)uboot在启动内核前可能会校验内核镜像是否正确,如果内核镜像出错,在uboot阶段做不做校验,系统都会挂死,因此不做校验理论上不会出问题;

4.1.3、删减不必要的功能

(1)在实际的产品开发中,有的uboot在启动时会默认去连接固定ip的tftp服务器并下载升级文件进行升级,可以考虑删除。这样做的好处是当设备的局域网中有这个ip的tftp服务器,设备就可以自动的升级,很方便;带来的问题就是uboot每次启动都要尝试去连接tftp服务器,增加启动时间;
(2)有的uboot会在启动阶段去初始化USB系统,检测U盘并识别FAT32文件系统,同样也是便于用U盘在uboot启动阶段进行自动升级,好处是直接将U盘插到设备重启便可以升级,坏处是每次启动都要去检测U盘,增加启动时间;
总结:上面介绍的两个功能,都是和业务无关,便于调试和升级的,如果当前的项目已经不能通过其他的方法去优化启动时,可以考虑去除掉;根据实际使用的uboot去删除掉不影响业务的功能,也可以将uboot分为发测版和debug版本,只需要删除发测本uboot中不必要的功能,在debug版本中保留,这样调试就用debug版本,出厂用发测版本也是可以的;

4.2、内核:关闭打印、文件系统类型

4.2.1、减小内核尺寸

(1)在编译内核时,首先就要指定配置文件,配置文件决定了哪些代码将会被编译链接;
(2)在配置文件中,有些模块在设备中并没有用到,编译链接这些未使用的模块不会影响内核的运行但会导致内核镜像的体积变大,比如你的设备没有用到USB模块和pcie模块,这两个模块的代码在配置文件中就可以不开启;
总结:在配置文件中关闭掉未使用的模块,以减小内核镜像的体积。删除配置项需要十分确定删除的模块未被用到,没有把握不要顺便删除;

4.2.2、关闭打印

(1)在内核启动参数中添加quiet参数:console ==ttySACO, 115200 quiet;
(2)quiet参数的作用是在内核启动过程中不往串口输出打印启动,但仍可以用dmesg命令查看内核的启动打印;
(3)也可以提高内核的打印等级,只打印你关心的信息,修改内核打印等级参考博客:《修改内核printk函数打印等级》

4.2.3、取消kernel阶段的BogoMIPS计算

(1)方法:配置bootargs,在bootargs中加上lpj=5996544;
(2)BogoMIPS用于衡量CPU运行速度,设置lpj=5996544可以取消该计算过程,lpj参数就是告诉内核BogoMIPS的值从而不要去计算;

4.2.4、内核的解压缩

(1)内核镜像是压缩的内核+解压缩代码头,压缩算法有多种,比如gzip、lzo、xz、lzma、lz4等,不同的压缩算法带来不同的压缩比和解压缩时间,具体选用何种压缩算法取决于存储和CPU性能,可以尝试几种压缩算法做比较,或者直接咨询芯片技术支持人员;内核镜像的组成参考博客:《vmlinuz/vmlinux、Image、zImage与uImage的区别》
(2)拓展:现在的嵌入式设备,稍微功能复杂点采用的外存都是以G为单位,使用压缩内核也就节省几兆的空间,内核镜像是不是可以不压缩,直接使用未压缩的内核镜像,这样就多占用一点外存,节省掉解压缩的时间,这个方案我没有在实际工作中见到过,我觉得理论上是可行的。

4.2.5、不加载不必要的驱动

(1)实际产品中使用的基础系统环境大多都是参考的芯片厂商出的demo板,demo板的功能是很齐全的,而实际的产品功能没有demo板这么多;
(2)根据产品的实际情况,在根文件系统中删除掉没有使用的.ko文件,不要加载未使用的驱动,减少启动时间;

4.3、根文件系统

4.3.1、减小根文件系统的体积

(1)根文件系统主要包含:动态库、命令、应用程序、开机脚本、ko驱动文件;
(2)删除掉未使用的命令,也就是修改busybox的配置文件,不要编译未使用的命令,同时将busybox去除符号表;
(3)在发测版本中去除掉应用程序的符号表,减小体积;
(4)删除掉未使用的ko文件;

4.3.2、选择合适的文件系统

flash类型适合的文件系统类型
块存储介质 (包括存储卡, eMMC)ext2、ext3、ext4、squashfs、xfs、 jfs、reiserfs、cramfs
Raw 闪存JFFS2、YAFFS2、UBIFS、ubiblock +SquashFS

(1)块存储介质是指带控制单元的flash,控制单元可以进行坏块管理、CRC校验等功能;Raw 闪存是指单纯的存储颗粒的集合,不带有控制单元,坏块管理、CRC校验等都需要内核去完成,比如Nand flash;
(2)不同的存储介质会采用不同的文件系统,这个需要对文件系统有比较深的了解,或者知道不同存储介质适合的文件系统;
(3)经验值:根文件系统在产品中不需要也不应该被修改,根文件系统最好是只读文件系统,因此在产品中根文件系统中一般采用squashfs文件系统,对于只读分区,最佳挂载时间和读取性能,非常适合需要只读的根文件系统。

4.3.3、优化开机脚本的执行顺序

(1)开机脚本在嵌入式中主要是指/etc/init.d/rcS文件,这个文件会调用其余的脚本;
(2)开机脚本主要的工作是执行某些命令构建基础系统环境、加载驱动、调用应用程序;
(3)优化:尽量早的调用应用程序,先把业务跑起来,先加载应用必须依赖的驱动模块然后就去调用应用程序,在后面继续加载其余的驱动,这个需要根据设备的具体应用程序来确定;

4.3.4、优化解压缩的相关操作

(1)在某些设备中,可能某些文件是压缩的,目的是节省flash的空间,但是解压缩需要增加启动时间。比如将应用程序或者驱动程序压缩成压缩包,运行时先加载到内存进行解压缩再执行;
(2)在开机启动中,如果有解压缩的动作,考虑是否可以不使用压缩包的方式,用空间来换取时间;

4.4、应用

4.4.1、去除不必要的打印

(1)将应用的打印做出debug方式,可以通过某种方式来控制应用程序运行时是否往串口打印信息,默认不要开启打印,当需要调试时再将打印从串口输出;
(2)可以效仿内核的printk打印,在应用程序中也引入打印等级的机制,可以在命令行去修改打印等级;

4.4.2、减小可执行程序的体积

在发测版本程序中,使用arm-linux-stripstripe工具将应用程序的符号表去除掉,减小体积;

推荐

给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转

以上是关于嵌入式linux系统快速启动优化的方法的主要内容,如果未能解决你的问题,请参考以下文章

基于ARM嵌入式 Linux 快速启动

嵌入式LINUX启动时间优化

详述Linux系统中配置Nginx网页优化

在 Ruby 中递归列出目录的单线器?

[开机启动]Linux开机自启和运行级别

全志 Linux 系统启动优化 启动优化速度方式 优化启动流程 优化uboot 优化kernel等