clocksource注册流程
clocksource_register / clocksource_register_hz / clocksource_register_khz
__clocksource_register_scale
__clocksource_updatefreq_scale
clocks_calc_mult_shift /* 计算->mult和->shift */
clocksource_max_adjustment /* 计算->maxadj 11% */
clocksource_max_deferment /* 计算->max_idle_ns */
clocksource_enqueue
clocksource_enqueue_watchdog
clocksource_select
一个问题是clocksource的->mult和->shift是如何确定的。clocksource_register由调用者直接指定,clocksource_register_hz和clocksource_register_khz则根据时钟源频率和->mult的最大位数按以下算法计算得到。
->mult与->shift的算法
nsecs = (cycles / F) * NSEC_PER_SEC = (cycles * mult) >> shift其中F为时钟频率,NSEC_PER_SEC为纳秒时钟频率,即10^9。将cycles=F带入上式,得
NSEC_PER_SEC = (F * mult) >> shift
根据频率单位可缩放scale(1为Hz,1000为KHz)