Printk与sched_clock_init的一点分析
在分析Linu內(nèi)核啟動的過程中,發(fā)現(xiàn)一段“不平常”的日志,感覺產(chǎn)生這段日志的代碼肯定是“不可思議”的。因此就大致分析了一下:
日志如下:
[ 0.000000] console [ttyMT0] enabled
[ 2.157770] Calibrating delay loop... 1694.10 BogoMIPS (lpj=4235264)
更精細(xì)的日志如下:
??????? [??? 0.000000] start:sched_clock_init.
??????? [??? 2.100505] end? :sched_clock_init.
與這段日志有關(guān)的代碼是:
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”)*/
}
難道這一句簡簡單單的賦值就會花費(fèi)兩秒是的時間??那么就分析一下相關(guān)的代碼:sched_clock_running作用和printk的實(shí)現(xiàn)。
?
1.??????sched_clock_running的作用
分析發(fā)現(xiàn),調(diào)用sched_clock_running的地方僅僅有函數(shù)sched_clock_cpu():
u64 sched_clock_cpu(int cpu)
{
??? if (unlikely(!sched_clock_running))
?????? return 0;
?
??? return sched_clock();
}
很明顯,如果sched_clock_running為0(unlikely已經(jīng)說明sched_clock_running很少為0),則返回0;如果不為0,調(diào)用sched_clock返回當(dāng)前的調(diào)度時鐘時間(相對系統(tǒng)起始的時間,單位為納秒)。
函數(shù)sched_clock_cpu()被大約四個函數(shù)調(diào)用cpu_clock() / local_clock / update_rq_clock() / ttwu_queue()。
?
綜上可知,執(zhí)行sched_clock_init之前,獲取的調(diào)度時鐘時間都是0,執(zhí)行sched_clock_init之后,取得的調(diào)度時鐘時間都是有非零值的。
?
2.??????Printk()的實(shí)現(xiàn)
Printk的實(shí)現(xiàn)都在文件./kernel/printk.c中。Printk() ->??vprintk(),而在vprintk()會通過cpu_clock()獲取時間。而有上可知,能否打印時間是和sched_clock_init有沒有被執(zhí)行是有直接關(guān)系的。
?
3.??????結(jié)論
通過分析,可以知道,日志中顯示的兩秒的差距不是因?yàn)閳?zhí)行語句花費(fèi)了兩秒,而是因?yàn)樵谠撜Z句之前,沒有獲取到有效的調(diào)度時鐘時間。
?
轉(zhuǎn)載于:https://www.cnblogs.com/youngerchina/p/5624440.html
總結(jié)
以上是生活随笔為你收集整理的Printk与sched_clock_init的一点分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL针对Swap分区的运维注意点
- 下一篇: 查找字符串中第一个只出现一次的字符