Linux kernel 初始化加速

2021-07-02 17:06:00 字數 1384 閱讀 5974

時間測量

說到效能調整,第一件該幹的的事就是看下時間到底消耗在**。俗話說的好:知己知彼,百戰百勝;過度優化,萬惡之首

因此手頭上要有稱心如意的時間測試工具,方法。其實我是不太喜歡工具的,工具這東西可遇不可求,而且不如寫**順手。

1. printk_time

在核心編譯選項中開啟config_printk_time,重新編譯核心後,系統啟動後就可以看到每一條printk前都有乙個時間戳了,這樣就有個大概的輪廓,哪

個驅動消耗了更多的時間,當然這個資訊對我們效能調整來說粒度太粗了

2. initial_debug巨集

上面的printk_time只是在printk附加上當時的系統時間,對於那些沒有printk資訊輸出的驅動來說是無法提供啟動時間資訊的,initial_debug派上了用場,開啟這個巨集後,每個驅動的初始化起始時間和結束時間都列印出來了。有了這個時間,基本就可以確定哪些部分需要優化了。我的做法是只關注耗時10000us以上的驅動。

3. ktime_t

呼叫ktime_get 獲取時間,我最喜歡的時間測量方法,對於可疑的耗時函式,可如下測試

ktime_t start, end;

start = ktime_get()

candidate_func(arg...)

end = ktime_get()

printk(kern_alert "%s:  start time=%d.%d, end time=%d.%d\n", __func__, start.tv.sec, start.tv.nsec, end.tv.sec, end.tv.nsec);

可以很準確的計算candidate_func的時間,當然如果candidate_func中引發了排程,時間就沒那麼準確了。

4 printk

盡量去掉printk對時間測量的影響,可以調整kernel/printk.c中的default_console_loglevel巨集,把級別較低的資訊去掉

效能優化方法

1. hard code lpj,在uboot啟動引數增加 lpj=3997696. 其中的3997696替換為你的機器啟動資訊獲取的值,這個一般能節省200ms

2. 裁剪核心,這塊比較大,要單獨開一篇來介紹,裁剪的好處有兩點:第一減少kernel的尺寸,這也就相應的減少了載入kernel image的時間,第二也減少了不必要的初始化

3.**調整:

根據時間測試,找到耗時瓶頸,看看是否能進行優化。

4. 優化裝置io驅動,提高資料的讀寫速度,kernel啟動完成到android launcher完成,幾乎無處不涉及到檔案的讀寫,io速度對啟動時間的影響重大,**是人寫的,所以平台特定的io**絕對有優化的空間



初始化 指定初始化

id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...

初始化 1 預設初始化 列表初始化

初始化的基本概念 事實 初始化和賦值是兩個完全不同的操作。初始化,是建立變數時賦予其乙個初始值。賦值,是把物件的當前值擦除,用乙個新值代替。列表初始化 p39 作為c 11新標準的一部分,用花括號 來初始化變數得到了全面應用。出於某些原因,這種初始化的方式叫做列表初始化。現在,無論是初始化物件還是某...

初始化 MyBatis初始化之載入初始化

在mybatis初始化過程中,大致會有以下幾個步驟 1.建立configuration全域性配置物件,會往typealiasregistry別名註冊中心新增mybatis需要用到的相關類,並設定預設的語言驅動類為xmllanguagedriver 3.構建defaultsqlsessionfacto...