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(即全局变量)更新。以下两种情况是可能的:

  • 如果是周期性的滴答声,则使用处理程序。这个处理程序只调用,然后调用
    do\u timer(1)
    incrementing
    jiffies
    by
    1
    tick

  • 如果是非周期性的滴答声,则使用。此处理程序调用,该处理程序通过
    tick\u nohz\u处理程序()
    传递并通过
    ktime\u get()
    获得的
    ktime\u t
    帮助,动态计算自上次更新以来发生的滴答数(可以超过
    1


相关:这个问题可能也很有趣。”“不滴答”并非没有中断如果没有工作要做,“无痒”就不会醒来。当有工作要做时,计时器中断将添加自上次中断以来的刻度,而不是向jiffies添加“1”刻度。既然没有工作,就没有人去看杰菲。对于其他中断源,计时器芯片硬件可以在执行代码之前读取“jiffies”以更正值。在“计时CPU”上的“无滴答”内核中滴答发生的频率是多少?如果我们有100Hz,无滴答和无滴答内核上的频率是否相同?“jiffies值仅由同一CPU更新”-仅在“无滴答”内核上或无论如何?@narotello频率相同,唯一的区别是“无滴答”内核能够在CPU不需要时“暂停”滴答(例如空闲)
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上)时才需要这样做。