C 如何在无滴答的内核中增加jiffies?
内核维护一个名为C 如何在无滴答的内核中增加jiffies?,c,linux,timer,linux-kernel,linux-device-driver,C,Linux,Timer,Linux Kernel,Linux Device Driver,内核维护一个名为jiffies的全局变量,该变量保存系统启动时的时钟/计时器中断数 每次发生计时器中断时,内部内核计数器的值都会递增 在无滴答声内核/动态滴答声中,中断不会定期发生,jiffies的值是如何增加的?无论配置如何,jiffies的值总是从计时器中断处理程序调用函数进行更新。“正常”和“无滴答声”内核之间真正的变化是只有在这种中断发生时 首先,让我澄清一下,没有真正的“无滴答”内核。内核将始终需要在至少一个CPU上发生滴答声。除非所有CPU都处于空闲状态,否则至少有一个CPU必须保持
jiffies
的全局变量,该变量保存系统启动时的时钟/计时器中断数
每次发生计时器中断时,内部内核计数器的值都会递增
在无滴答声内核/动态滴答声中,中断不会定期发生,
jiffies
的值是如何增加的?无论配置如何,jiffies
的值总是从计时器中断处理程序调用函数进行更新。“正常”和“无滴答声”内核之间真正的变化是只有在这种中断发生时
首先,让我澄清一下,没有真正的“无滴答”内核。内核将始终需要在至少一个CPU上发生滴答声。除非所有CPU都处于空闲状态,否则至少有一个CPU必须保持调度时钟中断运行,以支持准确的计时。我强烈推荐阅读更多关于这个话题的有用和有见地的信息
特别是,jiffies
值仅由同一CPU(即全局变量)更新。以下两种情况是可能的:
- 如果是周期性的滴答声,则使用处理程序。这个处理程序只调用,然后调用
incrementingdo\u timer(1)
byjiffies
tick1
- 如果是非周期性的滴答声,则使用。此处理程序调用,该处理程序通过
传递并通过tick\u nohz\u处理程序()
获得的ktime\u get()
帮助,动态计算自上次更新以来发生的滴答数(可以超过ktime\u t
)1
jiffies
总是由同一个CPU更新,如果你检查代码,你会看到总是有一种检查if(CPU==tick\u do\u timer\u CPU)
在调用do\u timer()
之前,在CPU不需要时“暂停”滴答声(例如空闲)”-因此至少有一个CPU永远不会空闲(需要滴答声)?换句话说,“计时CPU”总是滴答作响?该CPU是在引导加载时静态定义的,还是每个后续勾选的特定CPU都是未知的?@narotello如果你阅读我链接的内核文档页面,你会更好地理解这一点。有三种可用模式:CONFIG\u HZ\u PERIODIC
、CONFIG\u NO\u HZ\u IDLE
和CONFIG\u NO\u HZ\u FULL
。现代内核的默认值是CONFIG\u NO\u HZ\u IDLE
。始终需要至少有1个CPU未处于无\u HZ\u满状态
。这并不排除所有CPU同时处于空闲状态的可能性,这种情况仍然可能发生,在这种情况下,实际上不需要设置时钟并维护更新的计时器,只有在至少一个任务正在运行(在任何CPU上)时才需要这样做。