禁用刻度中断时,如何更新时间



阅读Linux手册后 -

了解Linux内核

我遇到了未解决的问题。tick中断处理程序是内核保持时间数据结构更新的地方。在手册中,关于恢复丢失的壁虱中断的解释非常有限,例如 -

cur_timer指向timer_hpet对象:在这种情况下,HPET芯片是 计时器中断。Mark_Offset方法检查是否丢失了计时器中断 自上次tick以来;在这种不太可能的情况下,它相应地更新Jiffies_64。

那么,有人可以阐明Linux内核如何在滴答滴答丢失的情况下跟踪时间?"相应地"代表什么?

您可以读取HPET值。中断很有用,但不需要。

"相应地更新jiffies_64"意味着将其设置为应该拥有的值,如果中断没有丢失。

完整段落如下,请注意上一个句子

cur_timer指向timer_hpet对象:在这种情况下,HPET芯片是 计时器中断的来源。mark_offset方法检查没有计时器 自上次tick以来,中断已经丢失。在这种不太可能的情况下,它会更新 jiffies_64。接下来,该方法记录了当前值 定期HPET计数器。

jiffies_64在每个计时器中断增加一个(tick)。因此,如果禁用了几个刻度的计时器中断,Jiffies_64将无法增加几次,从而丢失了时间。那么,如何在禁用计时器中断时如何保持jiffies_64更新?

可以肯定的是,jiffies_64是在禁用计时器中断时会更新。因此,它可能丢失了几个tick 暂时

,但将在下一个计时器中断进行纠正,并且由cur_timer-> mark_offset()完成。请记住Mark_OffSet()记录上一个tick的精确时间。值得注意的是,精确时间不是内核维护的时间,而是计时器芯片维护的。A 计时器芯片是一个独立芯片,它具有由其自己的时钟驱动的反击,每个时钟都增加一个。芯片的计时器中断可能会被禁用,其计数器不断增加。精确的时间并不是真正的时间,而是芯片的 counter !因此,在每个计时器中断中,mark_offset()保存计时器芯片计数器。在保存计数器之前,Mark_Offset()将上次保存的计数器与当前计时器芯片计数器进行比较,以查看是否丢失了计时器中断。

假设每次产生计时器中断时,计时器芯片计数器会增加一个。因此,如果未丢失计时器中断,则Mark_Offset()保存的计数器加1应等于当前计时器的计数器Mark_Offset()尝试将芯片计数器保存在计时器中断处理程序中。如果不相等,则会通过比较保存的计数器和芯片计数器之间的差异而丢失计时器中断,我们将知道丢失了多少中断。由于Jiffies_64在每个计时器中断增加一个,因此我们知道需要将多少添加到Jiffies_64,因此更新Jiffies_64。

请注意,只有在计时器芯片有计数器时才能找到丢失的计时器中断。对于HPET是正确的,但对于坑芯片而言并非如此。对于坑芯片,我想它会丢失。

参考了解Linux内核。mark_offset()p233,Jiffies_64 P234,Xtime P235,中断处理程序p237

中的mark_offset()

最新更新