嵌入式Linux啟動時間優化的秘密之四-啟動腳本

2020-12-01 電子發燒友

嵌入式Linux啟動時間優化的秘密之四-啟動腳本

逸珺 發表於 2020-04-21 09:22:52

  本文主要講述嵌入式Linux啟動時間優化的秘密,我們繼續上篇沒有講完的嵌入式Linux啟動時間優化方法,本文主要會講啟動腳本。想看上一篇的請查看本文結尾的連結。

  啟動腳本

  1.優化初始化腳本和系統啟動

  有多種方法可以減少啟動應用程式之前執行啟動腳本中花費的時間:

  僅在啟動必要的依賴項之後,儘快啟動應用程式。

  簡化shell腳本

  可以嘗試執行啟動腳本之前啟動應用程式

  1.1.bootchart

  如果想更詳細地了解用戶區的引導順序,則可以使用使用grabserial中的bootchart來實現,例如:

 

  那麼如何配置並使用bootchart 呢?

  在busybox中配置使用bootchartd(CONFIG_BOOTCHARTD = y)

  通過命令行init = / sbin / bootchartd 引導您的開發板

  將/var/log/bootlog.tgz從目標複製到開發主機

  生成時間表:

  cd bootchart-《version》

  java -jar bootchart.jar bootlog.tgz

  bootchart 參見 http://www.bootchart.org

  1.2. systemd

  如果將systemd用作初始化程序,則可以使用systemd-analyze。

  http://www.freedesktop.org/software/systemd/man/systemd-analyze.html

  1.3. init 進程

  在所有依賴項啟動之後,應儘快啟動:

  取決於您的init進程。在這裡,我們假設使用sysV init腳本。

  init腳本按字母數字順序運行,並以字母開頭(K表示停止(殺死),S表示開始)。

  將應用程式啟動腳本使用最小的號碼。

  甚至可以用應用程式替換init!如果可以成為第一個啟動的應用程式,啟動速度無疑大大加快!

  直接通過一個啟動腳本啟動所有服務(例如/etc/init.d/rcS)。這消除了對/ bin / sh的多次調用。

  甚至可以直接在應用程式的C代碼中掛載文件系統:如

  1.4 減少fork的使用

  fork/exec系統調用開銷很大。故從Shell調用可執行文件的速度很慢。

  即使BusyBox實現的shell中echo也會導致fork 系統調用!

  在BusyBox配置中選擇Shells-》 Standalone shell,以使Shell儘可能調用小程序。

  管道和反引號也由fork/exec實現。應減少它們在腳本中的使用。例:

  cat /proc/cpuinfo | grep model

  應修改為:

  grep model /proc/cpuinfo

  更詳細,請參考:

  http://elinux.org/Optimize_RC_Scripts

  又例如:

 

  僅此一項優化就可以在ARM AT91SAM9263系統(200MHz)上節省87毫秒!

  1.5 減小固件的尺寸

  剝離可執行文件和庫,刪除僅用於開發和調試的ELF部分。strip命令由交叉編譯工具鏈提供。默認情況下在Buildroot中完成的。

  superstrip超級剝離

  http://muppetlabs.com/~breadbox/software/elfkickers.html。

  使用strip可以剝離出Linux未用於啟動可執行文件的更多位。Buildroot停止支持它,因為它可能破壞可執行文件。 僅在保存一些字節至關重要時才嘗試。

  還可以嘗試https://packages.debian.org/sid/mklibs上提供的mklibs:

  mklibs產生精簡的共享庫,其中僅包含一組特定的可執行文件所需的例程。對於像OpenGL和QT這樣的大型庫確實很有用。它甚至可以在沒有原始碼的情況下工作。

  在Yocto中可用,但在Buildroot中不可用(2019.02狀態)。

  限制:mklibs可以刪除傾斜的庫(由應用程式「手動」加載),因為它看不到它們。

  3.5.5 快速啟動畫面顯示

  可以使用fbv顯示啟動畫面,

  http://freshmeat.sourceforge.net/projects/fbv

  使用armel,可以只使用我們的靜態編譯二進位文件:

  https://github.com/bootlin/static-binaries/tree/master/fbv/

  但是在MicrochipAT91SAM9263系統上很慢為878毫秒!

  為了更快地執行此操作,可以轉儲幀緩衝區framebuffer中的內容:

  fbv -d 1/root/logo.bmp

  cp /dev/fb0/root/logo.fb

  lzop -9/root/logo.fb

  然後儘早在initramfs中將其複製回:

  lzopcat/root/logo.fb.lzo 》 /dev/fb0

  編輯連載推薦:嵌入式Linux啟動時間優化的秘密之一工具鏈/應用程式優化

  編輯連載推薦:嵌入式Linux啟動時間優化的秘密之二文件系統

  編輯連載推薦:嵌入式Linux啟動時間優化的秘密之三-內核

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • 嵌入式Linux開發環境的搭建之:嵌入式開發環境的搭建
    本文引用地址:http://www.eepw.com.cn/article/257141.htm5.1嵌入式開發環境的搭建5.1.1嵌入式交叉編譯環境的搭建linux作業系統文章專題:linux作業系統詳解(linux不再難懂)交叉編譯的概念在第4章中已經詳細講述過,搭建交叉編譯環境是嵌入式開發的第一步,也是必備的一步。
  • 嵌入式Linux的GDB調試環境建立
    嵌入式Linux的GDB調試環境由Host和Target兩部分組成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。
  • 基於嵌入式Linux的語音識別系統硬軟體設計
    在嵌入式Linux作業系統下,運用多進程機制完成了對語音識別晶片、超聲波測距和雲臺的控制,並將語音識別技術應用於多角度超聲波測距系統中。通過測試,系統可以通過識別語音指令控制測量方向,無需手動幹預,最後將測量結果通過語音播放出來。
  • ARM Linux根文件系統Root Filesystem的製作
    經過很長時間的摸爬滾打,我終於能夠白手起家建立一個根文件系統了。其實我也不懂得原理,只是告訴大家我的作法,其中也不免有錯誤,歡迎大家指正。首先介紹根文件系統的組成:目錄、Shell、庫、腳本,一個個來。
  • 如何在MIPS平臺上使用Yocto設備定製的嵌入式系統Linux
    在這些設備上運行的軟體很有可能是高度定製的針對嵌入式系統的Linux。若要使用OS用作特定的任務,或優化工作流,那麼,最理想的便是運行定製版Linux。 本文將簡要闡述設計師如何使用Yocto開源基礎設備,在MIPS平臺上定製嵌入式Linux發行版——使設計師能聚焦於產品本身,而不是創建定製發行版帶來的複雜性。
  • 程式設計師及嵌入式的一些學習建議
    誤區一、全身投入學習桌面或伺服器版本linux系統很多想學嵌入式linux 的同學經常問我,我不會linux系統,怎麼學習嵌入式linux開發,於是他們就花費了大量的精力和時間去研究學習桌面版本linux系統的使用,什麼redhat 、federo,、ubuntu等等都用過,如何配置linux,linux的各種使用命令都背的滾瓜爛熟,linux各種伺服器的配置,還原備份各種操作非常熟悉
  • 嵌入式Linux用Qt Designer快速開發
    它是嵌入式公司Trolltech的Qt軟體包的一個組成部分。如果用戶使用的是KDE桌面,那麼Qt已經自動安裝上了,Qt Designer也很有可能已經被安裝好。如果用戶的系統沒有安裝,那麼針對不同的版本,可以很方便地找到KDE Development Tools,並安裝之。
  • 嵌入式Web伺服器技術及其在電力系統中的應用綜述
    而嵌入式Web伺服器技術作為結合了Web技術和現場工作要求特點的一項新技術,是一種很好的解決方案。 本文分析和介紹了嵌入式Web伺服器技術,並探討了其在電力系統中的應用實例和應用前景。2 嵌入式Web伺服器技術2.1 概述 嵌入式Web伺服器(Embedded Web Server, EWS)是指將Web伺服器引入到現場測試和控制設備中,在相應的硬體平臺和軟體系統的支持下,使傳統的測試和控制設備轉變為具備了以TCP/IP為底層通信協議,Web技術為核心的基於網際網路的網絡測試和控制設備[2,3]。
  • 嵌入式Linux設備驅動開發之:實驗內容——test驅動
    本文引用地址:http://www.eepw.com.cn/article/257106.htm1.實驗目的該實驗是編寫最簡單的字符驅動程序,這裡的設備也就是一段內存,實現簡單的讀寫功能,並列出常用格式的Makefile以及驅動的加載和卸載腳本。讀者可以熟悉字符設備驅動的整個編寫流程。
  • 九步走:優化Linux生產伺服器的經驗之談
    【IT168 資訊】生產環境下的Linux伺服器有精準、穩定、高效、安全等需求,其優化也是有著很多的竅門。本文分享了九條平時進行Linux生產伺服器優化的經驗,內容涉及郵件伺服器、Web伺服器、網絡配置、內存管理等方面。
  • 無盤啟動在Debian 4.0 Etch的實現方法
    可以分以下幾步來做:  1、在本地硬碟上安裝一個Debian 4.0 Etch  2、編譯兩個必要的程序iscsistart 和 fwparam_ibft  3、安裝其他必要的軟體包  4、修改網絡腳本  5、創建initramfs腳本  6、兩個腳本的內容  1、在本地硬碟上安裝一個
  • 在VIM中實現對嵌入式軟體的調試
    其強大的gdb調試工具可以方便地對嵌入式平臺上的程序進行跟蹤調試;而Linux下強悍的VIM編輯器,不僅可以方便地調用make文件對代碼進行編譯,而且通過腳本的配置還可輕鬆地成為高效的代碼編輯環境。流傳著這樣一種說法,「世界上的程式設計師分三種,一種使用Emacs,一種使用VIM,剩餘的是其他。」不去辯論這句話的對與錯,單純從字面意義上來理解,也足見VIM的魅力了。
  • 基於STM32單片機啟動文件的作用和啟動過程解析
    基於STM32單片機啟動文件的作用和啟動過程解析 工程師周亮 發表於 2018-11-09 16:15:19 一、啟動文件的作用是: 1.初始化堆棧指針
  • linux網卡啟動的時候,使用 NetworkManager 調度網絡服務
    網絡管理調度dispatcher 可以在連接網絡後啟動這些服務,並在網絡關閉時停止它們。要使用這一功能, 需要啟動 NetworkManager-dispatcher.service。 並且將腳本加到 /etc/NetworkManager/dispatcher.d 目錄。
  • linux系統編寫Systemd Service方法
    CentOS7.3學習筆記總結(七十)-linux系統編寫Systemd Service方法在Centos7以前的版本中,系統管理員都是通過把bash腳本放到/etc/init.d/目錄下來控制服務狀態,比如啟動start、停止stop,重啟restart等。而在CentOS7版本中,就不在採用這種方法,而是採用了Unit配置文件來管理服務。
  • 利用Yocto創建獨有的嵌入式 Linux 應用
    作為靈活多變且經濟高效的解決方案,嵌入式 Linux展現了巨大的價值,並廣泛應用於消費電子設備、網絡設備、零售點和行業應用程式。然而,廣泛的應用也意味著多樣化的業務需求,嵌入式解決方案開發人員必須構建定製Linux 版本來滿足其特定需求。
  • 如何在Linux Ubuntu中安裝IntelliJ IDEA最新版
    官方Linux二進位文件可從以下連結下載:  下載IntelliJ IDEA 2017.2:https://www.jetbrains.com/idea/download/#section=linux  解壓縮包,運行ide文件夾中的idea.sh啟動IDE,可以手動創建應用程式啟動器。
  • Linux提權的幾種常用方式
    1、內核漏洞提權提起內核漏洞提權就不得不提到髒牛漏洞(Dirty Cow),是存在時間最長且影響範圍最廣的漏洞之一。低權限用戶可以利用該漏洞實現本地提權,同時可以通過該漏洞實現Docker容器逃逸,獲得root權限的shell。
  • 嵌入式智能排洩系統的設計
    本文設計的智能人工肛門由四個模塊構成:壓力傳感器探測模塊、超聲傳感器探測模塊、報警模塊以及單片機控制模塊,如圖2所示。壓力傳感器分析腸腔壓力變化,超聲傳感器探測模塊分析腸腔內容物是氣體、液體、固體。超聲波傳感器探測模塊:單片機發出啟動超聲波傳感器時,555晶片便產生40 kHz的高頻振蕩脈衝,進入超聲波發射器,超聲波發射器發生40 kHz的超聲波,超聲波穿過腸腔,發射後的回波或衰減後的超聲波被超聲波接收器接收後的微弱信號經放大電路放大,包絡檢波電路優化信號波形,剔除幹擾低頻成分信號,得到所需要的高頻信號,最後經A/D轉換到達單片機。
  • 安卓螞蟻森林能量腳本V1.3-無需ROOT+支持模擬器
    安卓螞蟻森林能量腳本-無障礙模式,無需Root權限功能收自己+偷列表收別人澆給自己的水幫列表收能量模式定時模式 (手動定時啟動腳本)掛機模式 (循環掛機運行腳本)自動模式 (自動檢測好友能量成熟剩餘時間並定時運行腳本)以上為已完成的功能(自動模式未添加)