怎样在 1 秒内启动 linux-mile米乐体育

尽可能快的启动系统,对于自动化设备是非常重要的。系统能够在用户无法感知的时间内启动,也就意味着在不需要工作时,可以完全切断电源,而不是挂起进入休眠状态。本文基于 atmel at91 系列片上系统和 nand 闪存,经过一系列的优化,将 linux 系统启动时间,从最初的 11 秒,降低到最终的 656 毫秒。

背景知识

系统从上电到完全启动,需要经过许多过程。一个简化的启动流程大概包含:

  • 硬件重置
  • 启动引导程序(bootloader)
  • 操作系统初始化
  • 应用程序执行

其中硬件非常关键,但是硬件一般难以更改。后续的优化,主要针对引导程序、linux 内核和应用程序展开。

引导程序优化

引导程序主要完成对 cpu 的基础设置,处理 arm 标记(atags,arm tags)或设备树(device trees),切换存储管理单元(mmu,memory management unit)等工作。

对于u-boot,常用的优化方式有:

  • 删除不不要的功能:如网络加载等,如果不需要,那么直接移除这些代码吧;
  • 关闭不需要的功能
  • 关闭内核镜像验证
  • 关闭引导程序输出
  • 关闭启动延迟
  • 将通用功能的引导程序修改成一个优化后的初始程序加载器(initial program loader,ipl),对于u-boot,可以通过 spl(second program loader,第二阶段程序加载器)来实现。

内核优化

linux 内核被设计的非常灵活,可以针对需要的功能做各种配置优化。因此,优化内核对于系统启动速度是至关重要的。

首先,移除一切不要的驱动,尽可能的减少内核加载的内容,能够大大缩短系统启动时间。其次,还有很多内核选择可能需要进一步尝试,比如内核压缩方式,对于嵌入式系统来说,lzo 压缩方式,通常会是一个不错的选择。最后,还可以通过定制一些启动参数,达到加快启动的目的。例如可以通过“lpj=”参数,预设每个循环需要的节拍数(loops per jiffy,lpj)的值,避免系统在启动时自动推算。这样在基于 armv5 的系统中,可以节省 100ms 以上的时间。

对于内核启动的优化,可以通过 bootgraph.pl 脚本(位于内核源码的 script/bootgraph.pl)来绘制内核启动耗时图表,用以分析启动最耗时的地方。这个脚本使用非常简单,直接将 dmesg 的输出作为其输入,即可生成 svg 图表:

dmesg perl scripts/bootgraph.pl > output.svg

生成的图表如下图,

图中每一个色段表示一个功能的初始化耗时。可以简单的关闭不需要的功能,或者针对功能进行特定的优化。

除了内核本身之外,内核所在的文件系统也对系统启动有着非常大的影响。对于使用闪存芯片作为存储的系统来说,ubifs 是一个很好的选择。它能够容忍意外断电,有着出色的挂载速度,以确保系统快速启动。

应用程序优化

内核完成系统启动之后,接来下就是执行应用程序。对于应用程序的优化,主要有两部分,一部分是由应用程序来接管启动的 init 进程,另一部分是优化应用程序的链接方式。

标准的 systemv init 程序,需要执行一堆启动脚本。对于嵌入式系统来说,大部分是没有意义的。另一部分(比如挂载文件系统),可以由应用程序自己来实现。然后,可以在内核启动参数中通过“init=”参数,将 init 进程直接指定为应用程序。

应用依赖的动态链接库,会按照以下顺序查找:

  • ld_preload 环境变量指定的路径(一般对应文件/etc/ld.so.preload);
  • elf .dynamic 节中 dt_rpath 入口指定的路径,若 dt_runpath 入口不存在的话;
  • 环境变量 ld_library_path 指定的路径,但如果可执行文件有 setuid/setgid 权限,则忽略这个路径;编译时指定–library-path 会覆盖这个路径;
  • elf .dynamic 节中 dt_runpath 入口指定的路径;
  • ldconfig 缓存中的路径(一般对应/etc/ld.so.cache 文件),若编译时使用了-z nodeflib 的链接选项,则此步跳过;
  • /lib,然后/usr/lib 路径 ,若使用了-z nodeflib 链接选项,则此步亦跳过;

因此,尽可能的将应用程序依赖的动态链接库放到优先查找的路径,可以加快链接速度。对于交叉编译环境特别需要注意,主机上的动态链接库位置和目标系统上的位置可能不一致,这会增加应用程序执行时动态链接库的加载时间。

总结

基于上面提到的三个优化点,可以将系统的启动时间,从最初的 11s 降低到 656ms(数据参考 jan altenberg 在都柏林举行的嵌入式 linux 会议上的演讲稿)。从硬件到引导程序再到内核最后到应用程序,每个启动步骤都有自己可优化的地方,经过一些简单的优化,就可以减少系统的启动时间。

相关视频:how to boot linux in one second – jan altenberg

展开全文
内容来源于互联网和用户投稿,文章中一旦含有米乐app官网登录的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系米乐app官网登录删除

最新文章

知识分享
说到硬派越野,想必大家都非常熟悉了,尤其是近几年更是异常的火爆,市场前景也是非常的广阔。近...…
知识分享
当前里程:6998公里当前油耗:7.00l/100km油耗:三保过了一段时间了,也是在4s...…
知识分享
说到德系车,我们往往能想到的就是大众,大众汽车的燃油经济性不错,新车的故障率也比较低,而且...…
知识分享
据了解,这辆本田思域是2013款的,具体车型为十周年纪念1.8l自动豪华版。首次上牌是在2...…
网站地图