您的位置 首页 被动

嵌入式Linux发动时刻优化的隐秘之三-内核

嵌入式Linux启动时间优化的秘密之三-内核-本文主要讲述嵌入式Linux启动时间优化的秘密之三-内核,我们继续上篇没有讲完的嵌入式Linux启动时间优化方法,本文主要会讲内核系统。想看上一篇的请查看本文结尾的链接。 内核 1.有用的调试手段 1. 1 内核初始化度量函数 要找出最长执行时间的内核初始化函数,请在内核命令行中添加initcall_debug。将内核日志中得到如下日志: 如使用initcall_debug可能需要在内核配置中使用CONFIG_LOG_BUF_SHIFT增加日志缓冲区的大小。还可能需要使能CONFIG_PRINTK_TIME和CONFIG_

  本文首要叙述嵌入式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发动时刻优化的隐秘之二文件体系

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/86829.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部