查看內核中每個函數花費的時間 initcall_debug

實現查看內核啓動的時候每個函數花費的時間

在uboot的環境變量中 添加如下信息,就可以在內核啓動的時候查看到每個函數花費的時間

添加: initcall_debug=1



Linux version 3.10.40

 

1. 使用說明

Documentation/kernel-parameters.txt中的說明如下:

         initcall_debug  [KNL] Trace initcalls as they are executed.  Useful

                            for working out where the kernel is dying during

                            startup.

說明initcall_debug是一個內核參數,可以跟蹤initcall,用來定位內核初始化的問題。在cmdline中增加initcall_debug後,內核啓動過程中會增加如下形式的日誌,在調用每一個init函數前有一句打印,結束後再有一句打印並且輸出了該Init函數運行的時間,通過這個信息可以用來定位啓動過程中哪個init函數運行失敗以及哪些init函數運行時間較長。

calling  init_workqueues+0x0/0x414 @ 1

initcall init_workqueues+0x0/0x414 returned 0 after 0 usecs

除了在啓動過程中會增加日誌外,在系統休眠喚醒過程中也會增加如下形式的日誌,可以用來定位休眠喚醒失敗及休眠喚醒時間太長的問題。

calling  xxxxxx.dma+ @ 6, parent: xxx.0

call xxxxxx.dma+ returned 0 after 2 usecs

 

2. 相關代碼

./init/main.c中聲明變量的地方如下,通過core_param,可以通過/sys/module/kernel/parameters/initcall_debug在用戶空間獲取initcall_debug的狀態,另外cmdline能起作用依賴的應該也是這行代碼,關於core_param的實現也很複雜,以後再研究。

bool initcall_debug;

core_param(initcall_debug, initcall_debug, bool, 0644);

do_one_initcall函數根據initcall_debug決定是直接調用啓動init函數還是調用do_one_initcall_debug,do_one_initcall_debug中在調用init函數時增加日誌及計算函數運行時間。

./kernel/power/main.c中根據initcall_debug設定pm_print_times_enabled,./drivers/base/power/main.c中根據pm_print_times_enabled在系統休眠喚醒中打印日誌。

 

遺留問題:

1. core_param的實現原理

2. 內核中他幾個地方判斷initcall_debug變量,增加日誌輸出的作用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章