天天看點

嵌入式linux系統快速啟動優化的方法1、嵌入式裝置的啟動過程2、減少啟動時間的思路分析3、硬體4、軟體推薦

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計算

嵌入式linux系統快速啟動優化的方法1、嵌入式裝置的啟動過程2、減少啟動時間的思路分析3、硬體4、軟體推薦

(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等等的筆試題、面試常問問題等等知識,無論是學習基礎知識、面試刷題、交流工作經驗都是不錯的選擇。大家一起進步,歡迎留言交流。

連結:學習神器跳轉

嵌入式linux系統快速啟動優化的方法1、嵌入式裝置的啟動過程2、減少啟動時間的思路分析3、硬體4、軟體推薦
嵌入式linux系統快速啟動優化的方法1、嵌入式裝置的啟動過程2、減少啟動時間的思路分析3、硬體4、軟體推薦

繼續閱讀