NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

怎样在 1 秒内启动 Linux

  • 2015-12-02
  • 本文字数:1925 字

    阅读完需:约 6 分钟

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

背景知识

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

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

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

引导程序优化

引导程序主要完成对 CPU 的基础设置,处理 ARM 标记(ATAGS,ARM TAGS)或设备树(device trees),切换存储管理单元(MMU,Memory Management Unit)等工作。

重要通知:接下来 InfoQ 将会选择性地将部分优秀内容首发在微信公众号中,欢迎关注 InfoQ 微信公众号第一时间阅读精品内容。

对于 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 进程直接指定为应用程序。

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

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

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

总结

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


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2015-12-02 18:004345

评论

发布
暂无评论
发现更多内容

解密通义灵码:软件研发工具的“大脑”

阿里巴巴云原生

阿里云 云原生

Apache Flink 中 Watermark 机制详解及其核心原理与应用示例

木南曌

flink 实时计算 watermark

【OCI系列】走进甲骨文云服务器:– Console

Geek_2d6073

探索Garnet:微软开源的高性能分布式缓存存储系统

gogo

【OCI系列】走进甲骨文云服务器:打造专属的云资源管理空间

Geek_2d6073

通过ETL工具快速实现单据同步

RestCloud

数据同步 ETL 数据集成

浅谈前端路由原理hash和history

高端章鱼哥

开放签开源电子签章产品白皮书(简版)

开放签开源电子签章

开源 电子签章

2024南京国际消费电子展览会

AIOTE智博会

消费电子展会 消费电子博览会

图扑物联赋能港口智能照明

图扑物联

工业物联网 智慧港口 智能照明 web组态软件 云组态

敏捷开发最佳实践:组织架构实践案例之构建软硬件融合部落

PingCode

敏捷开发 敏捷流程

交易所搭建,交易所源码是怎么开发的?

西安链酷科技

交易所维护

外贸独立站怎么搭建?

九凌网络

项目经理的职业素养:从执行到战略的五级跃升

凌晞

项目管理 项目经理

2023 re:Invent | Amazon Q 与 Amazon CodeWhisperer 面向企业开发者提效利器

亚马逊云科技 (Amazon Web Services)

从 Linux 内核角度探秘 JDK MappedByteBuffer

不在线第一只蜗牛

Linux 测试

低代码与前端项目部署:革新软件开发的新篇章

EquatorCoco

前端 前端开发 低代码

一文趣谈Docker与低代码:软件开发的新风尚

快乐非自愿限量之名

Docker 软件开发 低代码 容器化

云PBX的介绍

ctsxiyou

通信 通讯 云pbx 云通讯

智启未来:TinyEngine 低代码引擎版本更新,畅享升级体验

OpenTiny社区

开源 前端 低代码 web开发

数据库与低代码:重塑软件开发的新范式

不在线第一只蜗牛

数据库 低代码 数据可视化

提升Java编程安全性-代码加密混淆工具的重要性和应用

一文读懂Partisia区块链的MOCCA 方案:让资产管理可信且可编程

大瞿科技

Rust Rocket简单入门

快乐非自愿限量之名

rust 后端 开发语言

直播预告|Sora 会怎样驱动视频编解码领域的突破与革新

声网

解锁第五代英特尔至强的AI“秘籍”:CPU也能运行大模型推理

E科讯

GaussDB(分布式)实例故障处理

快乐非自愿限量之名

分布式 故障

一分钟了解JAVA语言

高端章鱼哥

2024盘点:除了Redmine,还有哪些不错的项目管理工具

PingCode

项目管理 项目管理工具 Redmine

极盾故事|“账号在非常用IP、非工作时间频繁访问敏感数据”,某品牌咖啡是这样处理的!

极盾科技

数据集成之任务调度模式 v0.7

LIEN

开源 数据仓库 数据集成 业务融合 API对接

怎样在1秒内启动Linux_Linux_金灵杰_InfoQ精选文章