日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

嵌入式產品中,系統啟動速度是很關鍵的指標,對系統啟動速度的優化,通常我們稱之為“快啟”。

要對系統啟動速度進行優化,首先要知道如何統計系統啟動的時間。

下面介紹幾種統計內核啟動耗時的方法,以及對內核啟動速度優化的幾個方法。

一、啟動耗時統計

printk time

打開kernel配置:

kernel hacking --->
[*] Show timing information on printks

登錄后復制

打開后,每個printk的前面都會顯示時間戳

主要用來測量內核啟動過程各個階段的耗時

initcall_debug

眾所周知,kernel啟動時會執行不同等級的initcall,而每個initcall的耗時也是可以統計的。

kernelcmdline中加入參數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

bootchart是一個用于linux啟動過程性能分析的開源軟件工具,在系統啟動過程自動收集CPU占用率、進程等信息,并以圖形方式顯示分析結果,可用作指導優化系統啟動過程。

    修改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有不同的壓縮格式,常見的如gzxzlzma等。

    不同的壓縮格式,解壓速度就不同,通過比較不同壓縮方式的啟動時間和flash占用情況,選擇一種符合實際情況的,以此進行優化。

    加載位置

    內核鏡像可以由kernel自解壓,也可以由uboot進行解壓。

    對于kernel自解壓的情況,如果壓縮過的kernel與解壓后的kernel地址沖突,則會先把自己復制到安全的地方,然后再解壓,防止自我覆蓋。這就需要耗費復制的時間。

    即把加載地址運行地址設置為不同地址,可以減少耗時。

    內核裁剪

    裁剪內核是必要的,如果內核鏡像太大,那么解壓內核就需要很長時間,所以內核要盡量裁剪。

    裁剪內核,可以減少解壓耗時。初始化內容少了,也會減少耗時。

    因此裁剪內核時,要考慮將不需要的功能都去掉。

    預設置lpj數值

    LPJ也就是loops_per_jiffy,每次啟動都會計算一次,但如果沒有做修改的話,這個值每次啟動算出來都是一樣的,可以直接提供數值跳過計算。

    如下log所示,有skippedlpjtimer計算得來,不需要再校準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

    只把必須要加進內核的才編譯進內核,其他的編譯成模塊。

    例如將必要的clockttypinctrl等編譯進內核

    三、其他優化

    uboot

    如果是RISC-V架構,可以考慮去掉uboot

    XIP

    xipeXecute In Place。即芯片內執行,是指CPU直接從存儲器中讀取程序代碼執行,而不用再讀到內存中。

    一般我們的程序都是放到flash中,系統啟動時,把程序從flash拷貝到ddr中執行,而xip技術則不需要拷貝程序到ddr,所以速度會很快。

    這項技術是必須要芯片支持才行,可以看看芯片手冊中對SPI的描述是否支持XIP功能。

    四、總結

    以上對系統啟動速度的優化,歸根結底是提供一些思路、一些方法。

    要優化啟動速度,通常來說需要對整個系統的啟動有比較深入的了解

    優化無止境,需要根據目標來進行優化,綜合考慮啟動速度和效果。

以上就是很有用的速度優化:讓系統啟動速度更快的詳細內容,更多請關注www.92cms.cn其它相關文章!

分享到:
標簽:優化 很有用 更快 系統啟動 速度
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定