kernel壓縮方式
kernel有不同的壓縮格式,常見的如gz、xz、lzma等。
不同的壓縮格式,解壓速度就不同 ,通過比較不同壓縮方式的啟動時間和flash占用情況,選擇一種符合實際情況的,以此進行優(yōu)化。
加載位置
內核鏡像可以由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優(yōu)化
如前面提到,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進行優(yōu)化。
內核initcall_module并行
initcall有很多等級,但比較耗時的是module。
如果是多核,可以考慮將module_initcall并行執(zhí)行來節(jié)省時間。
目前內核do_initcalls是一個一個按照順序來執(zhí)行,可以修改成新建內核線程來執(zhí)行
減少pty/tty個數
加入initcall打印之后,發(fā)現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等編譯進內核
-
模塊
+關注
關注
7文章
2822瀏覽量
52804 -
內核
+關注
關注
4文章
1436瀏覽量
42494 -
Linux
+關注
關注
88文章
11628瀏覽量
217997
發(fā)布評論請先 登錄
嵌入式Linux啟動時間優(yōu)化的秘密之三-內核
嵌入式Linux啟動時間優(yōu)化的秘密之四-啟動腳本
蜂鳥E203內核優(yōu)化方法
教你如何快速啟動Linux 系統(tǒng)
linux內核編譯
全志Tina Linux 啟動優(yōu)化
linux內核啟動流程
linux內核無法啟動

Linux內核啟動速度優(yōu)化的幾個方法
評論