本文首要叙述嵌入式Linux发动时刻优化的隐秘之三-内核,咱们持续上篇没有讲完的嵌入式Linux发动时刻优化办法,本文首要会讲内核体系。想看上一篇的请检查本文结束的链接。
内核
1.有用的调试手法
1. 1 内核初始化衡量函数
要找出最长履行时刻的内核初始化函数,请在内核指令行中添加initcall_debug。将内核日志中得到如下日志:
如运用initcall_debug或许需求在内核装备中运用CONFIG_LOG_BUF_SHIFT添加日志缓冲区的巨细。还或许需求使能CONFIG_PRINTK_TIME和CONFIG_KALLSYMS。
1.2 运用内核发动图进行有意图的优化
运用initcall_debug能够生成发动图,然后轻松检查哪些内核初始化函数需求最多时刻来履行。
仿制dmesg指令的输出并将其粘贴到文件中(咱们将其称为发动日志boot.log)
在开发作业站上,在内核源代码中运转scripts / bootgraph.pl脚本:scripts / bootgraph.pl boot.log》 boot.svg
现在能够运用矢量图形修改器(例如inkscape)翻开发动图:
首要从花费最长时刻的功用开端测验优化。关于每个功用:
在内核源代码中查找其界说。
能够运用Elixir(参阅https://elixir.bootlin.com)。
留意:某些函数称号或许不存在,称号与modulename_init相对应。然后,在相应的模块中查找初始化代码。
删去不必要的功用:
经过检查相应源目录中的Makefile,找到哪个内核装备参数可编译代码。
拖延加载处理:
查找功用所属的模块(假如有)。假如或许,请稍后加载此模块。
优化必要的功用:
查找能够用于削减勘探时刻的参数,并查找module_param宏。
查找推延循环和对称号中包括delay的函数的调用, 能够削减此类推延,并检查代码是否依然有用。
1.3 减小内核尺度
首要,咱们专心于在不删去功用的情况下缩小尺度
首要机制是运用内核模块
将发动时不需求的一切内容编译为模块
有两个优点:内核更小且加载速度更快,初始化代码更少
删去用户空间不需求的功用:
CONFIG_KALLSYMS,CONFIG_DEBUG_FS,CONFIG_BUG
用专为嵌入式体系规划的功用:CONFIG_SLOB,CONFIG_EMBEDDED
然后考虑内核紧缩的方法:
依据存储读取速度和CPU解紧缩内核之间的平衡,需求对不同的紧缩算法进行测验。还主张在内核优化进程结束时测验紧缩选项,由于成果或许会因内核巨细而异。
Lzo和Gzip似乎是最好的解决计划。 但这成果取决于存储和CPU功用,故在决议计划是必须进行测验。
别的内核的编译选项也有能够优化的或许:
CONFIG_CC_OPTIMIZE_FOR_SIZE:能够运用gcc -Os而不是gcc -O2编译内核。
这样的优化会优先考虑代码巨细,但会献身代码速度。
成果:初始引导时刻更好(较小的发动时刻),可是较慢的内核代码或许会使功用下降。体系运转速度会变慢!
1.4 推延驱动程序和初始化调用
假如有点功用无法编译为模块(例如,网络或模块子体系),能够测验推延履行。内核不会缩小,但某些初始化将被推延,所以发动变快。一般,您能够修正probe()函数以回来-EPROBE_DEFER,直到它们准备好运转停止。
有关支撑此功用的详细信息,请拜见
https://lwn.net/ArTIcles/485194/。
1.5 封闭控制台输出
控制台输出实际上要花费许多时刻(十分慢的设备)。 产品中或许不需求。经过在内核指令行中传递quiet参数来禁用它。但依然能够运用dmesg获取内核音讯。这一步一般主张等最终一步再做,否则将丢失控制台进行调试。
1.6 预置jiffy
每次引导时,Linux内核都会校准推延循环(用于udelay()函数)。这将丈量每个jiff y(lpj)值的循环次数。只需求丈量一次!在内核发动音讯中找到 lpj值:
CalibraTIng delay loop.。。 996.14 BogoMIPS (lpj=4980736)
然后将lpj = 《value》添加到内核指令行:
CalibraTIng delay loop (skipped) preset value.。 996.14 BogoMIPS (lpj=4980736)
1.7 多处理器
SMP初始化很慢,即便您只要一个中心CPU,一般也会在默许装备中启用它(默许装备应支撑多个体系)。因而,假如只要一个CPU内核,请保证将其禁用。BeagleBone Black上的成果:紧缩内核巨细:-188 KB
要节约最终的毫秒数,您或许需求删去不必要的功用:
CONFIG_PRINTK = n与quiet指令行参数具有相同的作用,可是您无权拜访内核音讯。可是,您将具有一个十分小的内核。
在Thumb2形式下编译内核:CONFIG_THUMB2_KERNEL(任何ARM东西链都能够做到)。
模块装卸
块层(Block layer)
网络仓库
USB仓库
电源办理功用
CONFIG_SYSFS_DEPRECATED
输入:键盘/鼠标/触摸屏
削减CONFIG_LEGACY_PTY_COUNT的值或设置pty.legacy_count内核参数.
修改连载引荐:嵌入式Linux发动时刻优化的隐秘之一东西链/应用程序优化
修改连载引荐:嵌入式Linux发动时刻优化的隐秘之二文件体系