嵌入式linux系统快速启动优化的方法

news2024/12/28 1:59:17

1、嵌入式设备的启动过程

(1)上电首先执行芯片内部固化的代码,这段代码会将BootLoader读取到芯片的iRAM中执行,初始化内存,并将BootLoader代码搬运到内存中继续运行;
(2)BootLoader是启动引导代码,主要作用是将内核加载到内存中并启动。RAM架构的芯片是uboot,X86架构的芯片是BIOS。
(3)内核会初始化外设,挂载根文件系统并执行启动脚本,脚本里会加载驱动并启动应用程序;

2、减少启动时间的思路分析

(1)减少启动时间可以从硬件和软件两方面进行考虑,其中首先考虑软件优化,硬件主要是电路板设计时进行考虑,后期不方便修改,并且修改硬件会带来较高的成本;
(2)优化的思路可以大致分为两个方向:提高运行的速度,或者裁剪掉不需要的代码以减小程序体积;
(3)软件上大致可以分为系统基础环境的优化和应用程序的优化,两部分可以分开考虑;

3、硬件

3.1、内存ddr类型的选择

(1)内存分为DDR2、DDR3、DDR4,以及低功耗的LPDDR,版本越新的DDR运行速度越快;
(2)首先查阅芯片的数据手册,指定芯片支持哪些版本的DDR,然后再去选择合适的DDR版本;
(3)启动慢也可能是内存容量太小导致,需要分析内存是否是启动慢的瓶颈;

3.2、外存类型的选择

(1)外存分为机械硬盘和闪存,机械硬盘是磁原理,闪存是电学原理,机械硬盘一般来说比闪存慢;
(2)闪存也分为SD卡、eMMC、Nand Flash等,不同的闪存读写速度是不一样的,可以更换读写速度更快的外存来减少开机启动的时间;
(3)同样的外存在不同的模式下的读写速度也是不一样的,比如Nand flash分为四线写和单线写,四线写比单线写要快;

3.3、芯片各模块的时钟频率

(1)芯片是分时钟域的,不同的外设时钟频率是可以配置的,一般来说,在允许的时钟频率范围内,时钟频率越快,设备的运行速度就越快;
(2)在芯片的数据手册里会说明各个模块推荐的时钟频率,先检查当前设备运行时的时钟频率是否是推荐的时钟频率;
(3)推荐的时钟频率不一定是最快的时钟频率,可以将时钟频率提高到超过推荐的时钟频率,但是这里有风险的,对芯片没有足够的了解不建议这样做;
补充:这里说的主要是芯片的主频,以及内存和外存的时钟频率;

4、软件

4.1、uboot的优化

4.1.1、设置启动延时为0

(1)配置boot下的环境变量bootdelay为0。bootdelay是uboot的启动延时时间,目的是让程序员可以进入到uboot的命令行下进行操作,延时的单位是秒,一般来说延时一秒就可以,如果要追求极致的启动时间,可以将bootdelay设置成0秒;
(2)bootdelay设置成0秒会引入另一个问题,就是进入不了uboot的命令行,调试很麻烦。当设备的应用程序或者内核启动失败后,不能进入到uboot下进行调试或者升级等操作,需要使用芯片的烧录工具重新烧录程序,比较麻烦;

4.1.2、配置boot阶段不做内核校验

(1)方法:在uboot下的命令行中输入: setenv verify n;saveenv,关闭内核校验;
(2)uboot在启动内核前可能会校验内核镜像是否正确,如果内核镜像出错,在uboot阶段做不做校验,系统都会挂死,因此不做校验理论上不会出问题;

4.1.3、删减不必要的功能

(1)在实际的产品开发中,有的uboot在启动时会默认去连接固定ip的tftp服务器并下载升级文件进行升级,可以考虑删除。这样做的好处是当设备的局域网中有这个ip的tftp服务器,设备就可以自动的升级,很方便;带来的问题就是uboot每次启动都要尝试去连接tftp服务器,增加启动时间;
(2)有的uboot会在启动阶段去初始化USB系统,检测U盘并识别FAT32文件系统,同样也是便于用U盘在uboot启动阶段进行自动升级,好处是直接将U盘插到设备重启便可以升级,坏处是每次启动都要去检测U盘,增加启动时间;
总结:上面介绍的两个功能,都是和业务无关,便于调试和升级的,如果当前的项目已经不能通过其他的方法去优化启动时,可以考虑去除掉;根据实际使用的uboot去删除掉不影响业务的功能,也可以将uboot分为发测版和debug版本,只需要删除发测本uboot中不必要的功能,在debug版本中保留,这样调试就用debug版本,出厂用发测版本也是可以的;

4.2、内核:关闭打印、文件系统类型

4.2.1、减小内核尺寸

(1)在编译内核时,首先就要指定配置文件,配置文件决定了哪些代码将会被编译链接;
(2)在配置文件中,有些模块在设备中并没有用到,编译链接这些未使用的模块不会影响内核的运行但会导致内核镜像的体积变大,比如你的设备没有用到USB模块和pcie模块,这两个模块的代码在配置文件中就可以不开启;
总结:在配置文件中关闭掉未使用的模块,以减小内核镜像的体积。删除配置项需要十分确定删除的模块未被用到,没有把握不要顺便删除;

4.2.2、关闭打印

(1)在内核启动参数中添加quiet参数:console ==ttySACO, 115200 quiet;
(2)quiet参数的作用是在内核启动过程中不往串口输出打印启动,但仍可以用dmesg命令查看内核的启动打印;
(3)也可以提高内核的打印等级,只打印你关心的信息,修改内核打印等级参考博客:《修改内核printk函数打印等级》;

4.2.3、取消kernel阶段的BogoMIPS计算

在这里插入图片描述

(1)方法:配置bootargs,在bootargs中加上lpj=5996544;
(2)BogoMIPS用于衡量CPU运行速度,设置lpj=5996544可以取消该计算过程,lpj参数就是告诉内核BogoMIPS的值从而不要去计算;

4.2.4、内核的解压缩

(1)内核镜像是压缩的内核+解压缩代码头,压缩算法有多种,比如gzip、lzo、xz、lzma、lz4等,不同的压缩算法带来不同的压缩比和解压缩时间,具体选用何种压缩算法取决于存储和CPU性能,可以尝试几种压缩算法做比较,或者直接咨询芯片技术支持人员;内核镜像的组成参考博客:《vmlinuz/vmlinux、Image、zImage与uImage的区别》;
(2)拓展:现在的嵌入式设备,稍微功能复杂点采用的外存都是以G为单位,使用压缩内核也就节省几兆的空间,内核镜像是不是可以不压缩,直接使用未压缩的内核镜像,这样就多占用一点外存,节省掉解压缩的时间,这个方案我没有在实际工作中见到过,我觉得理论上是可行的。

4.2.5、不加载不必要的驱动

(1)实际产品中使用的基础系统环境大多都是参考的芯片厂商出的demo板,demo板的功能是很齐全的,而实际的产品功能没有demo板这么多;
(2)根据产品的实际情况,在根文件系统中删除掉没有使用的.ko文件,不要加载未使用的驱动,减少启动时间;

4.3、根文件系统

4.3.1、减小根文件系统的体积

(1)根文件系统主要包含:动态库、命令、应用程序、开机脚本、ko驱动文件;
(2)删除掉未使用的命令,也就是修改busybox的配置文件,不要编译未使用的命令,同时将busybox去除符号表;
(3)在发测版本中去除掉应用程序的符号表,减小体积;
(4)删除掉未使用的ko文件;

4.3.2、选择合适的文件系统

flash类型适合的文件系统类型
块存储介质 (包括存储卡, eMMC)ext2、ext3、ext4、squashfs、xfs、 jfs、reiserfs、cramfs
Raw 闪存JFFS2、YAFFS2、UBIFS、ubiblock +SquashFS

(1)块存储介质是指带控制单元的flash,控制单元可以进行坏块管理、CRC校验等功能;Raw 闪存是指单纯的存储颗粒的集合,不带有控制单元,坏块管理、CRC校验等都需要内核去完成,比如Nand flash;
(2)不同的存储介质会采用不同的文件系统,这个需要对文件系统有比较深的了解,或者知道不同存储介质适合的文件系统;
(3)经验值:根文件系统在产品中不需要也不应该被修改,根文件系统最好是只读文件系统,因此在产品中根文件系统中一般采用squashfs文件系统,对于只读分区,最佳挂载时间和读取性能,非常适合需要只读的根文件系统。

4.3.3、优化开机脚本的执行顺序

(1)开机脚本在嵌入式中主要是指/etc/init.d/rcS文件,这个文件会调用其余的脚本;
(2)开机脚本主要的工作是执行某些命令构建基础系统环境、加载驱动、调用应用程序;
(3)优化:尽量早的调用应用程序,先把业务跑起来,先加载应用必须依赖的驱动模块然后就去调用应用程序,在后面继续加载其余的驱动,这个需要根据设备的具体应用程序来确定;

4.3.4、优化解压缩的相关操作

(1)在某些设备中,可能某些文件是压缩的,目的是节省flash的空间,但是解压缩需要增加启动时间。比如将应用程序或者驱动程序压缩成压缩包,运行时先加载到内存进行解压缩再执行;
(2)在开机启动中,如果有解压缩的动作,考虑是否可以不使用压缩包的方式,用空间来换取时间;

4.4、应用

4.4.1、去除不必要的打印

(1)将应用的打印做出debug方式,可以通过某种方式来控制应用程序运行时是否往串口打印信息,默认不要开启打印,当需要调试时再将打印从串口输出;
(2)可以效仿内核的printk打印,在应用程序中也引入打印等级的机制,可以在命令行去修改打印等级;

4.4.2、减小可执行程序的体积

在发测版本程序中,使用arm-linux-stripstripe工具将应用程序的符号表去除掉,减小体积;

推荐

给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【二分查找】一文带你掌握二分法 (附万能模板)

目录一、简介二、易错点三、例子四、万能模板五、参考资料一、简介 哪怕没有学过编程的同学,也许不知道二分法这个名字,但也一定接触过它的核心思想。不了解的同学也没关系,我用一句话就能概括出它的精髓:将一个区间一分为二&…

注意力汇聚:Nadaraya-Watson 核回归

Nadaraya-Watson核回归是具有注意力机制的机器学习范例。 Nadaraya-Watson核回归的注意力汇聚是对训练数据中输出的加权平均。从注意力的角度来看,分配给每个值的注意力权重取决于将值所对应的键和查询作为输入的函数。 注意力汇聚可以分为非参数型和带参数型。 …

这5个Linux安全相关的命令,很实用!

1.ss ss更多人认为是“网络”命令,但该命令也可用于安全目的。 比如: ss:列出所有连接ss -a:列出侦听和非侦听端口ss -t:列出 TCP 连接 2.who who命令列出所有登录的人。 Linux 是多用户的,所以这个命…

VBA检查指定应用程序是否已经打开

VBA中提供了CreateObject和GetObject两种方法获得对象实例,二者的区别在于GetObject用于获取已经打开的应用程序对象,但是如果该应用程序并没有打开,那么将产生运行时错误,代码中需要加入额外的错误处理代码。 在任务管理器中可以…

第17讲:Python中元组的概念以及应用

文章目录1.元组的概念2.元组的基本使用2.1.定义一个元组2.2.定义一个空元组2.3.元组的元素是不可变的2.4.当元组中的元素是一个列表时列表中的元素可变2.5.当元组中只定义一个元素时的注意事项3.列表的所有操作同样适用于元组4.就是想修改元组中的某个元素1.元组的概念 Python…

CVE-2022-33980 Apache Commons Configuration 远程命令执行漏洞分析

漏洞描述 7月6日,Apache官方发布安全公告,修复了一个存在于Apache Commons Configuration 组件的远程代码执行漏洞,漏洞编号:CVE-2022-33980,漏洞威胁等级:高危。恶意攻击者通过该漏洞,可在目标…

3. 其他数仓/BI架构解析

文章目录1. 独立数据集市架构2. 辐射状企业信息工厂Inmon架构范式建模维度建模3. 混合辐射状架构与Kimball架构目前,经过长时间的演进,各种数仓架构之间的区别变得越来越小,且不论哪种数仓架构,都会涉及维度建模。下面是几种常见的…

《项目管理精华》读书笔记

《项目管理精华》读后感 《项目管理精华》书中用实例讲解了项目管理的基本流程及一些项目管理技巧,通俗易懂且让人有读下去的欲望。本书按照项目管理的五大过程组的顺序逻辑加上一些作者认为项目管理中比较有价值的内容来介绍的,十大知识领域穿插在这些…

nodejs+vue+elementui在线水果商城购物网站vscode项目

摘 要 1 Abstract 1 1 系统概述 4 1.1 概述 4 1.2课题意义 4 1.3 主要内容 4 2 系统开发环境 5 2.1 Vue技术介绍 5 端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 系统分为不同的层次:视图层&#…

哪个室内导航地图好用?画地图用什么软件好?

在互联网服务中,所有互联网巨头均斥巨资布局C端的地图服务,喜闻乐见的地图形式极大地方便了人们在日常生活中的查询位置、了解环境、导航等应用需求,因此取得了巨大的成功。但目前这些地图服务数据的颗粒度基本仅到城市级;园区、景…

CVE-2022-32532 认证绕过漏洞分析

前言 结合自身经历,在使用正则表达式去匹配流量特征时,由于正则表达式中元字符“.”不匹配换行符(\n、\r)导致一直提取不上所需的流量。而如今,之前踩过的坑却出现在了Apache Shiro框架之中… 漏洞描述 6月29日&…

《MySQL实战45讲》——学习笔记24 “Master/Slave主备同步机制“

binlog可以用来归档,也可以用来做主备同步,binlog在MySQL的各种高可用方案上扮演了重要角色;本篇主要介绍MySQL主备(M-S结构)的基本原理、不同格式binlog的优缺点和设计者的思考、MySQL双主结构和循环复制问题&#xf…

关于 Linux 系统

个人主页:ζ小菜鸡 大家好我是ζ小菜鸡,小伙伴们,让我们一起来学习Linux系统。 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连) 目录 一、Linux系统的组成 二、Linux 命令行的操作 三、Linux 目录结构 四、文件基本操作 五、用户及文件权限管…

jspssm小型药店药品管理系统

目 录 第一章 概述 1 1.1 研究背景 1 1.2开发意义 1 1.3 研究现状 1 1.4 研究内容 2 1.5论文结构 2 第二章 开发技术介绍 3 2.1 系统开发平台 3 2.2 平台开发相关技术 3 2.2.1 JSP技术介绍 3 2.2.2 Mysql数据库介绍 3 2.2.3 B/S架构 …

excel排名技巧:万能透视表加筛选找出销售冠军

在一组数据中统计单项排名第一的人员名单,如果用函数,我们需要考虑不同项目业绩相等的查找问题,需要考虑同项目业绩相等的查找问题。但如果用数据透视表加筛选,一切就很简单了。最后要么逐条地复制粘贴,要么用技巧合并…

ChatGPT 逆天测试,结局出乎预料

目录一、数学解题能力二、编程能力三、日常生活咨询四、问一些离谱的问题,它有啥反应?五、逆天大测试一、数学解题能力 据说 ChatGPT 会做数学题,给他几个条件不充分的问题,看看他是否真的会思考。 这家伙心理素质真好&#xff…

Uniswap 解析:恒定乘积做市商模型Constant Product Market Maker Model 的Vyper 实作

大纲 一. 前言 二. 恒定乘积做市商模型Constant Product Market Maker Model 1. 计入手续费 2. 程式码结构 3. 演算法核心与实作 4. 段落小结 三. 流动性Liquidity 1. 第一笔流动性注入、决定k值 2. 除了第一笔以外的情况 四. 结语 一. 前言 暨上一篇开始接触了Vyper 后&…

《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(2)-初识Fiddler让你理性认识一下

1.前言 今天的理性认识主要就是讲解和分享Fiddler的一些理论基础知识。其实这部分也没有什么,主要是给小伙伴或者童鞋们讲一些实际工作中的场景,然后隆重推出我们的猪脚(主角)-Fiddler。 1.1工作场景 做app测试,你是…

SpringMVC的工作原理

SpringMVC的工作原理图: SpringMVC流程 1、 用户发送请求至前端控制器DispatcherServlet。 2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处…

二叉树29:二叉搜索树中的插入操作

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:701.二叉搜索树中的插入操作 题目: 给定二叉搜索树(BST)的根节点 root 和要插入…