Printk与sched_clock_init的一点分析
在分析Linu內核啟動的過程中,發現一段“不平常”的日志,感覺產生這段日志的代碼肯定是“不可思議”的。因此就大致分析了一下:
日志如下:
[ 0.000000] console [ttyMT0] enabled
[ 2.157770] Calibrating delay loop... 1694.10 BogoMIPS (lpj=4235264)
更精細的日志如下:
??????? [??? 0.000000] start:sched_clock_init.
??????? [??? 2.100505] end? :sched_clock_init.
與這段日志有關的代碼是:
void sched_clock_init(void)
{
??? /*printk(KERN_CRIT “start:sched_clock_init.\n”)*/
??? sched_clock_running = 1;
??? /*printk(KERN_CRIT “end? :sched_clock_init.\n”)*/
}
難道這一句簡簡單單的賦值就會花費兩秒是的時間??那么就分析一下相關的代碼:sched_clock_running作用和printk的實現。
?
1.??????sched_clock_running的作用
分析發現,調用sched_clock_running的地方僅僅有函數sched_clock_cpu():
u64 sched_clock_cpu(int cpu)
{
??? if (unlikely(!sched_clock_running))
?????? return 0;
?
??? return sched_clock();
}
很明顯,如果sched_clock_running為0(unlikely已經說明sched_clock_running很少為0),則返回0;如果不為0,調用sched_clock返回當前的調度時鐘時間(相對系統起始的時間,單位為納秒)。
函數sched_clock_cpu()被大約四個函數調用cpu_clock() / local_clock / update_rq_clock() / ttwu_queue()。
?
綜上可知,執行sched_clock_init之前,獲取的調度時鐘時間都是0,執行sched_clock_init之后,取得的調度時鐘時間都是有非零值的。
?
2.??????Printk()的實現
Printk的實現都在文件./kernel/printk.c中。Printk() ->??vprintk(),而在vprintk()會通過cpu_clock()獲取時間。而有上可知,能否打印時間是和sched_clock_init有沒有被執行是有直接關系的。
?
3.??????結論
通過分析,可以知道,日志中顯示的兩秒的差距不是因為執行語句花費了兩秒,而是因為在該語句之前,沒有獲取到有效的調度時鐘時間。
?
轉載于:https://www.cnblogs.com/youngerchina/p/5624440.html
總結
以上是生活随笔為你收集整理的Printk与sched_clock_init的一点分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL针对Swap分区的运维注意点
- 下一篇: php格式化金额函数分享