嵌入式產品中,系統啟動速度是很關鍵的指標,對系統啟動速度的優化,通常我們稱之為“ 要對系統啟動速度進行優化,首先要知道如何統計系統啟動的時間。 下面介紹幾種統計內核啟動耗時的方法,以及對內核啟動速度優化的幾個方法。 打開kernel配置: 登錄后復制 打開后,每個printk的前面都會顯示時間戳 主要用來測量內核啟動過程各個階段的耗時 眾所周知, 在 登錄后復制 開啟后,就能打印每個 內核自帶了一個工具用于統計啟動時間: 使用該工具需要打開內核配置 系統啟動之后,執行命令: 登錄后復制 用瀏覽器查看 這個工具有點類似于 除了內核自帶的工具,也有開源的工具可用: bootchart是一個用于linux啟動過程性能分析的開源軟件工具,在系統啟動過程自動收集CPU占用率、進程等信息,并以圖形方式顯示分析結果,可用作指導優化系統啟動過程。 最后也會成圖片供做分析,例如: 可以找一個在系統啟動過程中空閑的 通過示波器抓取波形可以得到各階段耗時。 通常該方法被用來測量整個啟動的耗時,或者各階段的耗時,該方法也是用的比較多的。 不同的壓縮格式,解壓速度就不同,通過比較不同壓縮方式的啟動時間和flash占用情況,選擇一種符合實際情況的,以此進行優化。 內核鏡像可以由 對于 即把加載地址和運行地址設置為不同地址,可以減少耗時。 裁剪內核是必要的,如果內核鏡像太大,那么解壓內核就需要很長時間,所以內核要盡量裁剪。 裁剪內核,可以減少解壓耗時。初始化內容少了,也會減少耗時。 因此裁剪內核時,要考慮將不需要的功能都去掉。 如下 登錄后復制 如果沒有 如前面提到, 登錄后復制 根據打印信息,可以對耗時較多的 如果是多核,可以考慮將 目前內核 加入 登錄后復制 只把必須要加進內核的才編譯進內核,其他的編譯成模塊。 例如將必要的 如果是 一般我們的程序都是放到 這項技術是必須要芯片支持才行,可以看看芯片手冊中對 以上對系統啟動速度的優化,歸根結底是提供一些思路、一些方法。 要優化啟動速度,通常來說需要對整個系統的啟動有比較深入的了解。 優化無止境,需要根據目標來進行優化,綜合考慮啟動速度和效果。快啟
”。一、啟動耗時統計
printk time
kernel hacking --->
[*] Show timing information on printks
initcall_debug
kernel
啟動時會執行不同等級的initcall
,而每個initcall
的耗時也是可以統計的。kernel
的cmdline
中加入參數initcall_debug=1
:initcall_debug=1
setargs_nand=setenv bootargs console=${console} earlyprintk=${earlyprintk} root=${nand_root} initcall_debug=${initcall_debug} init=${init}
initcall
函數調用及耗時。bootgraph
scripts/bootgraph.pl
CONFIG_PRINTK_TIME=y
,并且在cmdline
中加上"initcall_debug=1
"dmesg|perl $(kernel_dir)/script/bootgraph.pl > out.svg
out.svg
文件,可以看到內核啟動過程中各個階段的耗時。perf
的火焰圖,可以統計啟動各階段的耗時。bootchart
bootchart
。
kernel cmdline
。將其中的init
修改為“init=/sbin/bootchartd
”。bootchartd
會從/proc/stat
,/proc/diskstat
,/proc/[pid]/stat
中采集信息,經過處理后保存為bootchart.tgz
文件pc
上通過pybootchartgui.py
工具將bootchart.tgz
轉換為bootchart.png
,方便分析bootchar
主要用來測量掛載文件系統到主應用程序啟動過程中的耗時gpio+示波器
GPIO
,在適當位置設置GPIO
電平。二、內核優化方法
kernel壓縮方式
kernel
有不同的壓縮格式,常見的如gz
、xz
、lzma
等。加載位置
kernel
自解壓,也可以由uboot
進行解壓。kernel
自解壓的情況,如果壓縮過的kernel
與解壓后的kernel
地址沖突,則會先把自己復制到安全的地方,然后再解壓,防止自我覆蓋。這就需要耗費復制的時間。內核裁剪
預設置lpj數值
LPJ
也就是loops_per_jiffy
,每次啟動都會計算一次,但如果沒有做修改的話,這個值每次啟動算出來都是一樣的,可以直接提供數值跳過計算。log
所示,有skipped
,lpj
由timer
計算得來,不需要再校準calibrate
了。[ 0.019918] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
skipped
,則可以在cmdline
中添加lpj=xxx
進行預設initcall優化
initcall
耗時是可以打印出來的,在cmdline
中設置initcall_debug=1
,即可打印跟蹤所有內核初始化過程中調用的順序以及耗時。[ 0.021772] initcall sunxi_pinctrl_init+0x0/0x44 returned 0 after 9765 usecs
[ 0.067694] initcall param_sysfs_init+0x0/0x198 returned 0 after 29296 usecs
[ 0.070240] initcall genhd_device_init+0x0/0x88 returned 0 after 9765 usecs
[ 0.080405] initcall init_scsi+0x0/0x90 returned 0 after 9765 usecs
[ 0.090384] initcall mmc_init+0x0/0x84 returned 0 after 9765 usecs
initcall
進行優化。內核initcall_module并行
initcall
有很多等級,但比較耗時的是module
。module_initcall
并行執行來節省時間。do_initcalls
是一個一個按照順序來執行,可以修改成新建內核線程來執行減少pty/tty個數
initcall
打印之后,發現pty/tty init
耗時很多,可減少個數來縮短init
時間。initcall pty_init+0x0/0x3c4 returned 0 after 239627 usecs
initcall chr_dev_init+0x0/0xdc returned 0 after 36581 usecs
內核module
clock
、tty
、pinctrl
等編譯進內核三、其他優化
uboot
RISC-V
架構,可以考慮去掉uboot
。XIP
xip
:eXecute In Place
。即芯片內執行,是指CPU
直接從存儲器中讀取程序代碼執行,而不用再讀到內存中。flash
中,系統啟動時,把程序從flash
拷貝到ddr
中執行,而xip
技術則不需要拷貝程序到ddr
,所以速度會很快。SPI
的描述是否支持XIP
功能。四、總結
以上就是很有用的速度優化:讓系統啟動速度更快的詳細內容,更多請關注www.92cms.cn其它相關文章!