禁用滴答中断时如何更新时间
How time is updated when tick interrupts are disabled
阅读Linux手册后-
Understanding The Linux Kernel
我还有未解决的问题。节拍中断处理程序是内核保持时间数据结构更新的地方。在手册中,关于恢复丢失的滴答中断的解释非常有限,例如-
cur_timer points to the timer_hpet object: in this case, the HPET chip is the source of
timer interrupts. The mark_offset method checks that no timer interrupt has been lost
since the last tick; in this unlikely case, it updates jiffies_64 accordingly.
那么,任何人都可以阐明 linux 内核如何在滴答中断丢失的情况下跟踪时间吗? 'accordingly' 代表什么?
您可以直接读取HPET值。中断很有用,但不是必需的。
"update jiffies_64 accordingly" 表示如果中断未丢失,则将其设置为应有的值。
全文如下,请注意最后一句。
cur_timer points to the timer_hpet object: in this case, the HPET chip is the
source of timer interrupts. The mark_offset method checks that no timer
interrupt has been lost since the last tick; in this unlikely case, it updates
jiffies_64 accordingly. Next, the method records the current value of the
periodic HPET counter.
jiffies_64 每个定时器中断(一个滴答)加一。因此,如果定时器中断被禁用几个滴答,jiffies_64 将无法增加几次,从而失去了对时间的跟踪。那么如何在禁用定时器中断的情况下保持 jiffies_64 更新?
可以肯定jiffies_64 不会 在禁用定时器中断时更新。所以它可能会暂时失去一些报价。
但它会在下一次定时器中断时被更正,它由 cur_timer->mark_offset() 完成。请记住 mark_offset() 记录了最后一个订单号的 确切时间 。需要注意的是精确时间不是内核维护的时间,而是定时器芯片维护的时间。 计时器芯片是一个独立芯片,它有一个由其自己的时钟驱动的计数器,每个时钟增加一个。芯片的定时器中断可能被禁用,其计数器不断增加。而精确时间并不是真正的时间,而是芯片的计数器!所以在每次定时器中断时,mark_offset()保存定时器芯片的计数器。在保存计数器之前,mark_offset()将上次保存的计数器与当前定时器芯片的计数器进行比较,看是否有定时器中断丢失。
假设每次产生定时器中断时,定时器芯片的计数器加1。所以如果没有定时器中断丢失,mark_offset()保存的计数器加1应该等于当前定时器的计数器,此时mark_offset()尝试在定时器中断处理程序中保存芯片的计数器。如果不相等,则定时器中断丢失,通过比较保存的计数器和芯片计数器的差值,我们可以知道丢失了多少个中断。由于每个定时器中断jiffies_64加1,我们知道jiffies_64需要加多少,因此相应地更新jiffies_64。
请注意丢失的定时器中断只有在定时器芯片有计数器的情况下才能找到。这对 HPET 是正确的,但对 PIT 芯片不是这样。 PIT芯片,估计丢了
参考了解 Linux 内核。
mark_offset() P233,
jiffies_64P234,
xtime P235,
mark_offset() 在中断处理程序 P237
阅读Linux手册后-
Understanding The Linux Kernel
我还有未解决的问题。节拍中断处理程序是内核保持时间数据结构更新的地方。在手册中,关于恢复丢失的滴答中断的解释非常有限,例如-
cur_timer points to the timer_hpet object: in this case, the HPET chip is the source of timer interrupts. The mark_offset method checks that no timer interrupt has been lost since the last tick; in this unlikely case, it updates jiffies_64 accordingly.
那么,任何人都可以阐明 linux 内核如何在滴答中断丢失的情况下跟踪时间吗? 'accordingly' 代表什么?
您可以直接读取HPET值。中断很有用,但不是必需的。
"update jiffies_64 accordingly" 表示如果中断未丢失,则将其设置为应有的值。
全文如下,请注意最后一句。
cur_timer points to the timer_hpet object: in this case, the HPET chip is the source of timer interrupts. The mark_offset method checks that no timer interrupt has been lost since the last tick; in this unlikely case, it updates jiffies_64 accordingly. Next, the method records the current value of the periodic HPET counter.
jiffies_64 每个定时器中断(一个滴答)加一。因此,如果定时器中断被禁用几个滴答,jiffies_64 将无法增加几次,从而失去了对时间的跟踪。那么如何在禁用定时器中断的情况下保持 jiffies_64 更新?
可以肯定jiffies_64 不会 在禁用定时器中断时更新。所以它可能会暂时失去一些报价。
但它会在下一次定时器中断时被更正,它由 cur_timer->mark_offset() 完成。请记住 mark_offset() 记录了最后一个订单号的 确切时间 。需要注意的是精确时间不是内核维护的时间,而是定时器芯片维护的时间。 计时器芯片是一个独立芯片,它有一个由其自己的时钟驱动的计数器,每个时钟增加一个。芯片的定时器中断可能被禁用,其计数器不断增加。而精确时间并不是真正的时间,而是芯片的计数器!所以在每次定时器中断时,mark_offset()保存定时器芯片的计数器。在保存计数器之前,mark_offset()将上次保存的计数器与当前定时器芯片的计数器进行比较,看是否有定时器中断丢失。
假设每次产生定时器中断时,定时器芯片的计数器加1。所以如果没有定时器中断丢失,mark_offset()保存的计数器加1应该等于当前定时器的计数器,此时mark_offset()尝试在定时器中断处理程序中保存芯片的计数器。如果不相等,则定时器中断丢失,通过比较保存的计数器和芯片计数器的差值,我们可以知道丢失了多少个中断。由于每个定时器中断jiffies_64加1,我们知道jiffies_64需要加多少,因此相应地更新jiffies_64。
请注意丢失的定时器中断只有在定时器芯片有计数器的情况下才能找到。这对 HPET 是正确的,但对 PIT 芯片不是这样。 PIT芯片,估计丢了
参考了解 Linux 内核。 mark_offset() P233, jiffies_64P234, xtime P235, mark_offset() 在中断处理程序 P237