md.*_*mal 4 c linux timer linux-device-driver linux-kernel
内核维护一个名为的全局变量jiffies,该变量保存系统启动时的滴答/定时器中断数。
每次发生定时器中断时,内部内核计数器的值都会增加。
在无滴答内核/动态滴答中,中断不会定期发生,jiffies增量的值如何?
无论配置如何,从定时器中断处理程序jiffies调用该do_timer()函数时,始终会更新的值。“正常”内核和“无滴答”内核之间真正的变化只有在这种中断可能发生时才会发生。
首先,让我澄清一下,没有真正的“无滴答”内核之类的东西。内核总是需要在至少一个 CPU 上发生滴答。除非所有 CPU 都空闲,否则至少有一个 CPU 必须保持调度时钟中断,以支持准确计时。我强烈建议阅读Documentation/timers/NO_HZ.txt有关该主题的更多非常有用和有见地的信息。
特别是,该jiffies值仅由同一个 CPU 更新(即全局变量tick_do_timer_cpu)。以下两种情况是可能的:
在周期性滴答的情况下,使用tick_handle_periodic()处理程序。此处理程序仅调用tick_periodic(),然后调用按刻度do_timer(1)递增。jiffies1
在非周期性刻度的情况下,tick_nohz_handler()使用 。此处理程序调用tick_sched_do_timer(), 调用tick_do_update_jiffies64(),jiffies动态更新计算自上次更新以来发生的滴答数(可以大于1),借助ktime_t传递的tick_nohz_handler()和 获得的ktime_get()。