linux内核timer_interrupt()源码
时间: 2023-06-17 13:05:01 浏览: 245
timer-interruption.zip_源码
以下是Linux内核4.19版本中timer_interrupt()函数的源码实现:
```
asmlinkage __visible void __weak timer_interrupt(struct pt_regs *regs)
{
struct cpu_data *cpu = get_cpu_ptr(smp_processor_id());
struct clock_event_device *evt = cpu->evtdev;
unsigned long next_jiffies = jiffies + 1;
if (unlikely(time_after_eq(next_jiffies, cpu->last_jiffies + TICK_NSEC))) {
/*
* Some of this is really subtle. If we're in the middle of a tick
* already, we don't want to update the tick count - that could
* confuse the heck out of anyone trying to do timing. So make sure
* we don't update the tick until after the tick period has
* expired.
*/
if (time_after(next_jiffies, cpu->last_jiffies + TICK_NSEC)) {
int clock_was_set = 0;
while (time_after_eq(next_jiffies, cpu->last_jiffies + TICK_NSEC)) {
cpu->last_jiffies += TICK_NSEC;
update_wall_time();
clock_was_set = tick_nohz_update_jiffies(&cpu->tick_dep_mask);
if (cpu_is_offline(smp_processor_id()))
return;
}
if (clock_was_set)
tick_program_event(evt, cpu->next_timer_interrupt);
}
/*
* We must make sure that the jiffies update is visible
* before we test time_after_eq().
*/
smp_wmb();
if (time_after_eq(next_jiffies, READ_ONCE(jiffies)))
__generic_touch_nmi_watchdog();
if (unlikely(in_nmi()))
return;
/*
* If we missed any timer interrupts, correct this now
* by advancing the local timer and updating wall time
* again.
*/
while (time_after_eq(next_jiffies, READ_ONCE(jiffies))) {
cpu->last_jiffies += TICK_NSEC;
update_wall_time();
tick_nohz_idle_enter();
}
}
evt->event_handler(evt);
}
```
timer_interrupt()函数是中断处理程序,用于处理定时器中断。该函数首先获取当前CPU的事件设备指针,然后计算出下一次中断的时间,如果下一次中断的时间已经到了,则更新 jiffies 值并调用事件处理函数。如果下一次中断的时间还没有到,则继续等待下一次中断。函数中还包含了一些调用其他函数的代码块,用于更新时间值、设置时钟事件等。
阅读全文