本文主要講述嵌入式Linux啟動(dòng)時(shí)間優(yōu)化的秘密,我們繼續(xù)上篇沒(méi)有講完的嵌入式Linux啟動(dòng)時(shí)間優(yōu)化方法,本文主要會(huì)講啟動(dòng)腳本。想看上一篇的請(qǐng)查看本文結(jié)尾的鏈接。
啟動(dòng)腳本
1.優(yōu)化初始化腳本和系統(tǒng)啟動(dòng)
有多種方法可以減少啟動(dòng)應(yīng)用程序之前執(zhí)行啟動(dòng)腳本中花費(fèi)的時(shí)間:
僅在啟動(dòng)必要的依賴(lài)項(xiàng)之后,盡快啟動(dòng)應(yīng)用程序。
簡(jiǎn)化shell腳本
可以嘗試執(zhí)行啟動(dòng)腳本之前啟動(dòng)應(yīng)用程序
1.1.bootchart
如果想更詳細(xì)地了解用戶(hù)區(qū)的引導(dǎo)順序,則可以使用使用grabserial中的bootchart來(lái)實(shí)現(xiàn),例如:
那么如何配置并使用bootchart 呢?
在busybox中配置使用bootchartd(CONFIG_BOOTCHARTD = y)
通過(guò)命令行init = / sbin / bootchartd 引導(dǎo)您的開(kāi)發(fā)板
將/var/log/bootlog.tgz從目標(biāo)復(fù)制到開(kāi)發(fā)主機(jī)
生成時(shí)間表:
cd bootchart-《version》
java -jar bootchart.jar bootlog.tgz
bootchart 參見(jiàn) http://www.bootchart.org
1.2. systemd
如果將systemd用作初始化程序,則可以使用systemd-analyze。
http://www.freedesktop.org/software/systemd/man/systemd-analyze.html
1.3. init 進(jìn)程
在所有依賴(lài)項(xiàng)啟動(dòng)之后,應(yīng)盡快啟動(dòng):
取決于您的init進(jìn)程。在這里,我們假設(shè)使用sysV init腳本。
init腳本按字母數(shù)字順序運(yùn)行,并以字母開(kāi)頭(K表示停止(殺死),S表示開(kāi)始)。
將應(yīng)用程序啟動(dòng)腳本使用最小的號(hào)碼。
甚至可以用應(yīng)用程序替換init!如果可以成為第一個(gè)啟動(dòng)的應(yīng)用程序,啟動(dòng)速度無(wú)疑大大加快!
直接通過(guò)一個(gè)啟動(dòng)腳本啟動(dòng)所有服務(wù)(例如/etc/init.d/rcS)。這消除了對(duì)/ bin / sh的多次調(diào)用。
甚至可以直接在應(yīng)用程序的C代碼中掛載文件系統(tǒng):如
1.4 減少fork的使用
fork/exec系統(tǒng)調(diào)用開(kāi)銷(xiāo)很大。故從Shell調(diào)用可執(zhí)行文件的速度很慢。
即使BusyBox實(shí)現(xiàn)的shell中echo也會(huì)導(dǎo)致fork 系統(tǒng)調(diào)用!
在BusyBox配置中選擇Shells-》 Standalone shell,以使Shell盡可能調(diào)用小程序。
管道和反引號(hào)也由fork/exec實(shí)現(xiàn)。應(yīng)減少它們?cè)谀_本中的使用。例:
cat /proc/cpuinfo | grep model
應(yīng)修改為:
grep model /proc/cpuinfo
更詳細(xì),請(qǐng)參考:
http://elinux.org/Optimize_RC_Scripts
又例如:
僅此一項(xiàng)優(yōu)化就可以在ARM AT91SAM9263系統(tǒng)(200MHz)上節(jié)省87毫秒!
1.5 減小固件的尺寸
剝離可執(zhí)行文件和庫(kù),刪除僅用于開(kāi)發(fā)和調(diào)試的ELF部分。strip命令由交叉編譯工具鏈提供。默認(rèn)情況下在Buildroot中完成的。
superstrip超級(jí)剝離
http://muppetlabs.com/~breadbox/software/elfkickers.html。
使用strip可以剝離出Linux未用于啟動(dòng)可執(zhí)行文件的更多位。Buildroot停止支持它,因?yàn)樗赡芷茐目蓤?zhí)行文件。 僅在保存一些字節(jié)至關(guān)重要時(shí)才嘗試。
還可以嘗試https://packages.debian.org/sid/mklibs上提供的mklibs:
mklibs產(chǎn)生精簡(jiǎn)的共享庫(kù),其中僅包含一組特定的可執(zhí)行文件所需的例程。對(duì)于像OpenGL和QT這樣的大型庫(kù)確實(shí)很有用。它甚至可以在沒(méi)有源代碼的情況下工作。
在Yocto中可用,但在Buildroot中不可用(2019.02狀態(tài))。
限制:mklibs可以刪除傾斜的庫(kù)(由應(yīng)用程序“手動(dòng)”加載),因?yàn)樗床坏剿鼈儭?/strong>
3.5.5 快速啟動(dòng)畫(huà)面顯示
可以使用fbv顯示啟動(dòng)畫(huà)面,
http://freshmeat.sourceforge.net/projects/fbv
使用armel,可以只使用我們的靜態(tài)編譯二進(jìn)制文件:
https://github.com/bootlin/static-binaries/tree/master/fbv/
但是在MicrochipAT91SAM9263系統(tǒng)上很慢為878毫秒!
為了更快地執(zhí)行此操作,可以轉(zhuǎn)儲(chǔ)幀緩沖區(qū)framebuffer中的內(nèi)容:
fbv -d 1/root/logo.bmp
cp /dev/fb0/root/logo.fb
lzop -9/root/logo.fb
然后盡早在initramfs中將其復(fù)制回:
lzopcat/root/logo.fb.lzo 》 /dev/fb0
編輯連載推薦:嵌入式Linux啟動(dòng)時(shí)間優(yōu)化的秘密之一工具鏈/應(yīng)用程序優(yōu)化
評(píng)論