嵌入式Linux发动时刻优化的隐秘
01
东西链/运用程序优化
导读:嵌入式Linux在运用中往往期望体系能在尽量短的时刻内发动,以进步用户体会。而且在有的运用场合,对发动时刻具有严厉的时刻要求,尤其在工业或许医疗器械运用领域。此刻怎么加速Linux的发动,将成为一个应战,关于大多数运用开发人员而言,由于Linux体系的复杂性,关于怎么进步发动速度,往往无从下手。那么阅读完本文,将取得明晰完好的处理思路。
1.下降发动时刻的一般思路
在预备下降体系的发动时刻时,思路上应树立以下的切入点:
最快的代码是未履行的代码。
引导操作本质上的很大一部分作业实际上是将代码和数据从存储设备加载到RAM。如所需加载内容越少则意味着加载操作越快。
假如根文件体系越大,则安装时刻或许会越长。
因而,即便未履行的代码也会延伸发动时刻。
另外在硬件计划设计时尽量挑选读写速度快的存储介质。例如,从SD卡发动实际上比从NAND FLASH发动快。
2.发动时刻丈量办法
要下降体系的发动时刻,则首要需求挑选一个牢靠的发动时刻的丈量办法:
在Linux代码中参加对某一个GPIO脚的逻辑电平操控,运用示波器丈量GPIO状况。后边将介绍怎么在代码中参加对GPIO的操控。
监控串口操控台报文以丈量时刻,能够运用grabserial。
拜见https://elinux.org/Grabserial
3. 东西链优化
3.1 从东西链下手
挑选运用适宜的东西链,应是第一个下手点,由于一切的运转加载固件都是由东西链编译而成。假如没有进行其他优化,则更改东西链的优点将愈加显着,而且更简略衡量。
您能够在东西链中进行以下更改,这或许会影响发动时刻,功用和巨细:
编译器版别:gcc和binutils的版别,最新版别往往能够具有更好的优化功用。
C库:glibc,uClibc,musl。运用uClibc和musl库编译的根文件体系更小
指令集变量:ARM或Thumb2,是否支撑硬浮点。
或许会影响代码功用和代码巨细(Thumb2编码与ARM相同的指令,但以更紧凑的办法,至少会显着减小巨细)。
C库在创立东西链时进行了硬编码,可供挑选的C库:
glibc:最规范且功用最全。http://www.gnu.org/software/libc/
uClibc:更小且可装备。现已存在约20年了。http://uclibc-ng.org/
musl:uClibc替代品,虽比较新但很老练。http://www.musl-libc.org/
能够对glibc/uclibc-ng /musl进行比照测验:
1.静态编译hello.c程序并比较巨细
运用gcc 6.3, armel, musl 1.1.16: 7300 字节
运用gcc 6.3, armel, uclibc-ng 1.0.22 : 67204 字节
运用gcc 6.2, armel, glibc: 492792 字节
2. 静态编译BusyBox 1.26.2并比较巨细
运用gcc 6.3, armel, musl 1.1.16: 183348 字节
运用gcc 6.3, armel, uclibc-ng 1.0.22 : 210620 字节
运用gcc 6.2, armel, glibc: 755088 字节
3.2 指令集挑选
编译rootfs进行测验比照:
用gcc 7.4编译,生成ARM代码:
根文件体系总巨细:3.79 MB
用gcc 7.4编译,生成Thumb2代码:
根文件体系总巨细:3.10 MB(-18%)
功用方面:Thumb2的功用显着改进(大约少于5%,可是从一次运转到另一次运转,丈量的履行时刻略有改变)。
4. 运用软件优化
4.1 丈量strace
strace答应盯梢运用程序及其子级进行的一切体系调用。关于开发十分有用:
了解怎么在用户空间上花费时刻
例如,轻松查找翻开测验(open()),文件拜访(read() /write() )和内存分配(mmap2() )。无需拜访源代码即可完结!
寻觅耗时最长的开支运用
查找在运用程序和脚本中完结的不必要的作业。例如:屡次翻开同一文件,或测验翻开不存在的文件。
局限性:您无法盯梢init进程!
关于strace 拜见
http://sourceforge.net/projects/strace/:
在一切GNU / Linux体系上可用,能够由您的穿插编译东西链生成器构建。
更简略的办法:直接复制一个现成的静态二进制文件。 拜见
https://github.com/bootlin/staTIc-binaries/tree/master/strace
能够检查进程的操作状况:
1. 拜访文件,分配内存。。.
2. 一般足以发现简略的过错。
用法:
1.strace 《指令》(开端一个新进程)
2.strace -p 《pid》(盯梢现有进程)strace -c 《command》(计算进程的体系开支时刻)
如检查cat操作:
4.2 Linux上的功用监测东西oprofile
Oprofile是linux上的功用监测东西:
具有两种作业办法:legacy形式和perf_events形式
legacy形式:
1.精度低,请运用内核驱动程序进行装备
2.运用CONFIG_OPROFILE进行编译装备
3.用户空间东西:opcontrol和oprofiled
perf_events形式:
1.运用硬件功用计数器
2.运用CONFIG_PERF_EVENTS和CONFIG_HW_PERF_EVENTS编译装备
3.用户空间东西:operf
其运用办法:
legacy 形式:
opcontrol –vmlinux=/path/to/vmlinux # opTIonal step
opcontrol –start
/my/command
opcontrol –stop
perf_events 形式
operf –vmlinux=/path/to/vmlinux /my/command
运用opreport获取成果
4.3 perf东西
Perf 是内置于Linux 内核源码树中的功用分析(profiling)东西。它根据事情采样原理,以功用事情为根底,支撑针对处理器相关功用指标与操作体系相关功用指标的功用分析。可用于功用瓶颈的查找与热门代码的定位。linux2.6及后续版别都自带该东西,简直能够处理一切与功用相关的事情
运用硬件功用计数器
运用CONFIG_PERF_EVENTS和CONFIG_HW_PERF_EVENTS进行装备
用户空间东西:功用。它是内核源代码的一部分,因而一直与您的内核同步。
用法:perf record /my/command
经过以下办法取得成果:perf report
4.4 连接器优化
发动时运用的运用程序组代码:
查找发动期间调用的功用,例如运用
-finstrument-funcTIons gcc选项。
创立一个自定义的链接描绘文件,以按调用次序从头排列这些函数。能够经过将每个函数放在各自的部分中来完成:
-ffuncTIon-sections gcc选项。
特别关于具有较大MTD读取块的闪存存储特别有用。由于读取整个读取块后,极有或许读取不必要的数据。
详细信息:http://blogs.linux.ie/caolan/2007/04/24/controlling-symbol-ordering/
经过如下办法,能够找到有望被优化的当地:
1.发动一次运用程序并丈量其发动时刻。
2.再次发动运用程序并丈量其发动时刻。由于它的代码应仍在Linux文件缓存中,故其代码加载时刻将为零。
然后知道第一次加载运用程序代码(及其库)所花费的时刻。链接器优化节约的时刻应少于此上限。
然后据此能够决议是否有必要这样对该运用进行链接优化。由于链接优化有必要修正运用程序的编译办法,因而此类优化的本钱很高。
4.4.1 Prelink 预链接东西
Prelink是Red Hat 开发者 Jakub Jelinek 所规划的东西,正如其姓名所示,Prelink运用事前链接替代运转时链接的办法来加速同享库的加载,它不仅能够加速起动速度,还能够削减部分内存开支,是各种Linux架构上用于削减程序加载时刻、缩短体系发动时刻和加速运用程序发动的很受欢迎的一个东西。
预链接削减了发动可履行文件所需的时刻
在Android上广泛运用
有必要装备为知道哪些库需求进行预链接,并将为每个可用符号分配一个固定的地址,然后消除了在发动可履行文件时从头定位符号的需求。
请注意安全性,由于可履行代码一直加载在同一地址。
代码以及文档拜见
http://people.redhat.com/jakub/prelink/
支撑ARM,但自2013年以来未发布。Buildroot也不支撑。可是,x86比较简略完成。
东西链/运用程序优化的部分就在此完毕了,下篇咱们将持续讲嵌入式Linux发动时刻优化的办法之文件体系,请咱们持续重视咱们本站网和嵌入式客栈。
修改连载引荐:嵌入式Linux发动时刻优化的隐秘之二文件体系