阅读Linux手册后 -
Understanding The Linux Kernel
我留下了未解决的问题。 tick中断处理程序是内核保持时间数据结构更新的地方。在手册中,关于恢复丢失的嘀嗒中断的解释非常有限,例如 -
cur_timer指向timer_hpet对象:在这种情况下,HPET芯片是其来源 定时器中断。 mark_offset方法检查没有丢失定时器中断 自上次打勾;在这种不太可能的情况下,它会相应地更新jiffies_64。
那么,任何人都可以了解linux内核如何记录时间,以防丢失中断? “相应”代表什么?
答案 0 :(得分:2)
您只需阅读HPET值即可。中断很有用,但不是必需的。
"相应更新jiffies_64"如果中断没有丢失,则意味着将其设置为应该具有的值。
答案 1 :(得分:0)
完整的语法如下,请注意最后一句话。
每个计时器中断(一个滴答声),cur_timer指向timer_hpet对象:在这种情况下,HPET芯片是 定时器中断源。 mark_offset方法检查是否没有计时器 自上次滴答以来中断已丢失;在这种不太可能的情况下,它会更新 jiffies_64相应地。 下一步,该方法记录当前的 定期的HPET计数器。
jiffies_64都增加1。因此,如果定时器中断被禁用了多个滴答声,那么jiffies_64将无法多次增加,从而失去了跟踪时间。那么如何在禁用计时器中断的情况下使jiffies_64更新?
当禁用计时器中断时,可以确定是否不更新jiffies_64。因此,它可能会暂时失去一些滴答声。
但是它将在下一个定时器中断处得到纠正,这是通过cur_timer-> mark_offset()完成的。记住mark_offset()记录了最后一个刻度的 确切时间 。值得注意的是, 确切时间 不是内核维护的时间,而是定时器芯片维护的时间。 计时器芯片是一种独立芯片,其计数器由其OWN时钟驱动,并且每个时钟加一。芯片的定时器中断可能被禁用,其计数器不断增加。而确切时间并不是真正的时间,而是芯片的计数器!因此,在每个计时器中断中,mark_offset()都会保存计时器芯片的计数器。在保存计数器之前,mark_offset()将上次保存的计数器与当前计时器芯片的计数器进行比较,以查看是否丢失了计时器中断。
假设每次产生定时器中断时,定时器芯片的计数器加一。因此,如果没有丢失计时器中断,则在mark_offset()尝试将芯片计数器保存在计时器中断处理程序中时,mark_offset()保存的计数器加1应该等于当前计时器的计数器。如果不相等,则定时器中断会丢失,通过比较保存的计数器和芯片计数器之间的差,我们将知道丢失了多少个中断。由于每个计时器中断都会将jiffies_64加1,因此我们知道需要向jiffies_64中添加多少,从而相应地更新jiffies_64。
请注意,只有在计时器芯片具有计数器的情况下才能找到丢失的计时器中断。对于HPET来说是这样,但对于PIT芯片则不是。对于PIT芯片,我想它已经丢失了。
参考了解Linux内核。 mark_offset()P233, jiffies_64 P234, xtime P235, 中断处理程序P237中的mark_offset()