欢迎关注我的头条号:Wooola,专注于Java、Golang、微服务架构,致力于每天分享原创文章、快乐编码和开源技术。

背景知识

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

  • 硬件重置
  • 启动引导程序(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 会议上的演讲稿)。从硬件到引导程序再到内核最后到应用程序,每个启动步骤都有自己可优化的地方,经过一些简单的优化,就可以减少系统的启动时间。

来源:codeceo 侵权提醒必删

roszhong指定rviz的点启动_怎样在1秒内启动 Linux相关推荐

  1. 360 mysql无法启动_安装MySQL 5后无法启动(不能Start service)解决方法小结

    转自:http://www.jb51.net/article/33375.htm 创建primay key过程中发生了断电,当电脑再次启动时候,发现mysql 服务无法启动,使用 net start ...

  2. mvp内粗泄露问题_如何在一小时内启动MVP服务器

    mvp内粗泄露问题 by Yisroel Yakovson 通过伊斯洛尔·雅科夫森 如何在一小时内启动MVP服务器 (How to Launch Your MVP Server in an Hour) ...

  3. java jetty启动_[深入浅出Jetty 04]Jetty的启动方式

    Jetty提供了众多的参数和配置来保证满足不同场景下的启动方式. 除了极大方便嵌入式启动之外,从程序外部也非常好容易启动jetty. [原文:http://www.blogjava.net/xylz/ ...

  4. win10关闭快速启动_注意:win10系统快速启动功能虽然好用,但也会带来一些麻烦...

    快速启动是首先在Windows 8中实现并延续到Windows 10的功能,可在启动电脑时提供更快的启动时间.这是一个很方便的功能,也是大多数人在不知情的情况下使用的功能,但有一些高手会禁用它,为什么 ...

  5. 计算机的硬盘 u盘启动,【电脑bios设置硬盘启动】电脑bios设置光驱启动_电脑bios设置u盘启动...

    2017-11-14 17:02:44 浏览量:94932 怎么在BIOS里设置硬盘启动?电脑在启动时会从硬盘寻找引导文件,从而启动系统,如果硬盘不是第一启动项,或者有两个硬盘,就会导致系统无法启动, ...

  6. 海尔台式计算机配置,海尔台式机电脑怎么设置u盘启动_海尔电脑如何设置usb启动...

    有不少海尔台式机电脑想要用U盘重装电脑,那么就需要设置U盘启动,但是很多用户并不知道要怎么设置U盘启动,我们可以通过bios来操作,接下来给大家分享一下海尔电脑设置usb启动的详细步骤如下. 准备工具 ...

  7. roszhong指定rviz的点启动_Rviz 实现 pannel 插件

    这个是鉴于另一个Github上的项目学习的 https://github.com/chaoli2/rviz_teleop_commander/tree/master/src 其中代码注释很清楚,大家也 ...

  8. win7开机卡在正在启动_手把手教你大白菜PE启动盘安装win7最详细的图解教程

    一.准备工作,制作好PE启动盘U盘一个,把所需要的文件提前复制到U盘里: 2,把启动盘插到电脑USB插口上: 3-1,按下电脑主机开机按钮: 3-2,如果电脑是打开的请重启电脑: 4,设置从U盘启动: ...

  9. mysql safe无法启动_(转)mysqld_safe无法启动的解决办法

    启动mysql时报错: Starting mysqld daemon with databases from /var/lib/mysql STOPPING server from pid file ...

最新文章

  1. php判断前端传的多个字段与数据库匹配
  2. 求首尾相接的数组的最大子数组和
  3. Linux下通过rm -f删除大量文件时提示-bash: /bin/rm: Argument list too long的解决方法...
  4. [Windows] Windows 8.1 取消在任务栏显示应用商店的应用
  5. 删除android系统自带的第三方软件
  6. Html5移动开发之Localstorage(本地存储)
  7. java dubbo 方案,Missing artifact com.alibaba:dubbo:jar:2.8.4 dubbo解决方案
  8. 应用安全 - 渗透测试 - .net网站
  9. 高并发库存秒杀场景,阿里巴巴数据库是这样应对的
  10. python-两种办法验证数据的类型
  11. mysql升级代码_phpstudy 升级mysql 及MySQL服务等问题(示例代码)
  12. BP神经网络的预测模型
  13. idea中从外部复制内容到里面不成功
  14. 【第三方服务】微信公众平台授权登录
  15. java 图片导出word_【freemaker实现导出word②】代码实现导出word(包括导出list数据和导出图片到word)...
  16. 二十一世纪大学英语读写教程学习笔记(原文)——7 - I Became Her Target(我成了她的靶子)
  17. IBM J9 Java 虚拟机正式开源;PyPI 官方库被发现混入了名字相似的恶意模块
  18. 海康大华RTSP转HLS直播
  19. Omorn - NJ301-1100 AND NX102-9000 - Socket - TCP 通讯
  20. RFID基础知识习题

热门文章

  1. 软件项目文档_什么是软件项目的好的文档?
  2. devops 文化_DevOps之外的无责文化示例
  3. 高帮足球鞋_高帮运动鞋和晕车症可以教给我们有关VR设计的知识
  4. ad交互式布线如何改变走向_走向开放:如何改变思维和工作方式
  5. 开源软件生态_基础,亮点和建立成功的开源生态系统
  6. raspberry pi_在Raspberry Pi上试用Docker
  7. (10)vue.js 指令(2)
  8. HTML5 文本语义元素
  9. Git笔记(15) 远程分支
  10. linux scp 输入密码,Linux scp远程复制数据不需要输入密码