查看内核中每个函数花费的时间 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變量,增加日志輸出的作用
總結
以上是生活随笔為你收集整理的查看内核中每个函数花费的时间 initcall_debug的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: IMX6的相关音频结构体的定义
- 下一篇: 4.x版本内核中platform_dev
