时钟管理上pit 和 apic如何协调工作的?
假设当前硬件没有hpet。而是pit + apic,由pit来产生全局的时钟中断,而apic产生本地时钟中断..并且最终调用的clock_event_device->handler为tick_periodic。
现在有个疑问,pit 和apic是如何协调工作的?
ulk里面描述的,是说PIT的中断函数是timer_interrupt,它只会处理全局tick事件该处理的事情,比如增加jiffies,比如更新wall time.
而APIC的中断处理函数是smp_apic_timer_interrupt,它只会处于自己本地CPU的任务,比如定时器超时判断,进程调度等。
但是linux 2.6.30代码上已经不太一样,如下:
static void tick_periodic(int cpu)
{
会设定某个CPU来处理全局tick事件处理。
假设pit是没有工作的话,只有apic那是可以理解的,就是其中一个CPU会做更多额外的工作。(作为全局tick)
但是,如果加上了pit这个全局tick,它也周期性的发生中断,并且接手这个中断处理的还不是特定的CPU,
那就这里不就乱套了,真的是疑问。
if (tick_do_timer_cpu == cpu) {
write_seqlock(&xtime_lock);
/* Keep track of the next tick event */
tick_next_period = ktime_add(tick_next_period, tick_period);
do_timer(1);
write_sequnlock(&xtime_lock);
}
update_process_times(user_mode(get_irq_regs()));
profile_tick(CPU_PROFILING);
}
页:
[1]