1. 程式人生 > >嵌入式linux優化

嵌入式linux優化

嵌入式linux優化,可以從三部分進行考慮: bootloader,linux,根檔案系統

1. bootloader

    uboot只是做系統啟動過程中,所依賴的硬體初始化,為kernel的載入執行做準備,所以,bootloader在整個系統啟動過程中只消耗1妙左右,相比較整個啟動過程的10+, 20+妙可以忽略,甚至,對bootloader進行優化,毫無效果可言,簡直是浪費我們寶貴的時間。

2.  linux

    kernel是緊接著uboot執行完之後執行的,kernel的啟動時間根據不同平臺,不同廠家,不同版本的核心,以及根據嵌入式產品的複雜程度,kernel的啟動時間相差還是很大的,一般情況,核心佔據整個系統啟動過程中幾秒到10幾秒。如果想要優化kernel的啟動時間,就要清楚的知道kernel啟動過程中,都有哪些模組啟動,並且這些模組啟動精確時間是多少,這樣就可以針對那些耗時長的,或者沒有使用到的模組進行優化。得到那些資訊可以基本可以有兩種方法:

    1) 使用dmesg記錄的後臺啟動資訊

        編譯核心的時候,設定CONFIG_PRINTK_TIME=y,這樣就可以在系統啟動之後,在後臺終端使用dmesg命令,就可以得到帶有時間戳的資訊記錄,我們通過分析這些資訊,可以得到啟動模組,以及這些模組啟動過程中的耗時。

     2)  使用bootgraph.pl工具

        編譯核心的時候,設定CONFIG_PRINTK_TIME=y,CONFIG_BOOT_TRACER=y(如果核心中有則設定,版本不同而已),在kernel正式啟動時,在uboot向kernel傳遞引數,增加printk.time=1 和 initcall_debug兩個引數,啟動系統,進入系統的後臺終端,使用以下用以下命令進行操作

$ dmesg > /tmp/boot.log
    

    然後,將boot.log傳輸到pc上,並且將boot.log放到kernel的目錄下,就是剛才scripts/bootgraph.pl的同目錄

$ cat boot.log | perl scripts/bootgraph.pl > kernel.svg
    

    使用瀏覽器開啟得到的kernel.svg,如下圖,就可以一眼看到圖形化的kerlnel啟動的詳細資訊


    這樣,就可以根據圖示的資訊,使用make menuconfig重新配置kernel,該去除的去除,該模組化的模組化,重新編譯核心,就可以將linux的啟動耗時縮短,使我們的linux啟動的時候,明顯的快很多。

3. 檔案系統 (只說systemd管理系統的情況)

    核心啟動到最後,就是將檔案系統掛載,掛載檔案系統後,還需要將檔案系統中的服務策劃程式或者守護程序啟動,這也會消耗一部分的時間,像linux優化一樣,我們要找到需要優化的部分,在使用systemd管理檔案系統的,我們就可以使用systemdt提供的一個分析工具,就可以很塊的得到linux一樣的圖。

    系統啟動完成後,進入系統的後臺終端:

$ systemd-analyze plot > boot.svg   
    

    將boot.svg傳輸到pc端,使用瀏覽器開啟boot.svg,如下圖:


    左邊空白部分就是kernel的啟動時間,右邊有字的,就是啟動時間,啟動過程中耗時,以及這些程式的狀態,都可在這幅向量圖上一眼看出。 我們也就可以根據上述圖示資訊,進行對檔案系統進行改刪除的刪除,該禁止的禁止,縮短我們的啟動時間。


針對Linux, 檔案系統優化過後,重寫載入到我們的嵌入式系統中,發現,我們的系統啟動過程飛的一樣完成了。

嵌入式linux優化,可以從三部分進行考慮: bootloader,linux,根檔案系統

1. bootloader

    uboot只是做系統啟動過程中,所依賴的硬體初始化,為kernel的載入執行做準備,所以,bootloader在整個系統啟動過程中只消耗1妙左右,相比較整個啟動過程的10+, 20+妙可以忽略,甚至,對bootloader進行優化,毫無效果可言,簡直是浪費我們寶貴的時間。

2.  linux

    kernel是緊接著uboot執行完之後執行的,kernel的啟動時間根據不同平臺,不同廠家,不同版本的核心,以及根據嵌入式產品的複雜程度,kernel的啟動時間相差還是很大的,一般情況,核心佔據整個系統啟動過程中幾秒到10幾秒。如果想要優化kernel的啟動時間,就要清楚的知道kernel啟動過程中,都有哪些模組啟動,並且這些模組啟動精確時間是多少,這樣就可以針對那些耗時長的,或者沒有使用到的模組進行優化。得到那些資訊可以基本可以有兩種方法:

    1) 使用dmesg記錄的後臺啟動資訊

        編譯核心的時候,設定CONFIG_PRINTK_TIME=y,這樣就可以在系統啟動之後,在後臺終端使用dmesg命令,就可以得到帶有時間戳的資訊記錄,我們通過分析這些資訊,可以得到啟動模組,以及這些模組啟動過程中的耗時。

     2)  使用bootgraph.pl工具

        編譯核心的時候,設定CONFIG_PRINTK_TIME=y,CONFIG_BOOT_TRACER=y(如果核心中有則設定,版本不同而已),在kernel正式啟動時,在uboot向kernel傳遞引數,增加printk.time=1 和 initcall_debug兩個引數,啟動系統,進入系統的後臺終端,使用以下用以下命令進行操作

$ dmesg > /tmp/boot.log
  

    然後,將boot.log傳輸到pc上,並且將boot.log放到kernel的目錄下,就是剛才scripts/bootgraph.pl的同目錄

$ cat boot.log | perl scripts/bootgraph.pl > kernel.svg
  

    使用瀏覽器開啟得到的kernel.svg,如下圖,就可以一眼看到圖形化的kerlnel啟動的詳細資訊


    這樣,就可以根據圖示的資訊,使用make menuconfig重新配置kernel,該去除的去除,該模組化的模組化,重新編譯核心,就可以將linux的啟動耗時縮短,使我們的linux啟動的時候,明顯的快很多。

3. 檔案系統 (只說systemd管理系統的情況)

    核心啟動到最後,就是將檔案系統掛載,掛載檔案系統後,還需要將檔案系統中的服務策劃程式或者守護程序啟動,這也會消耗一部分的時間,像linux優化一樣,我們要找到需要優化的部分,在使用systemd管理檔案系統的,我們就可以使用systemdt提供的一個分析工具,就可以很塊的得到linux一樣的圖。

    系統啟動完成後,進入系統的後臺終端:

$ systemd-analyze plot > boot.svg   
  

    將boot.svg傳輸到pc端,使用瀏覽器開啟boot.svg,如下圖:


    左邊空白部分就是kernel的啟動時間,右邊有字的,就是啟動時間,啟動過程中耗時,以及這些程式的狀態,都可在這幅向量圖上一眼看出。 我們也就可以根據上述圖示資訊,進行對檔案系統進行改刪除的刪除,該禁止的禁止,縮短我們的啟動時間。


針對Linux, 檔案系統優化過後,重寫載入到我們的嵌入式系統中,發現,我們的系統啟動過程飛的一樣完成了。