darling54454 发表于 2016-09-11 12:57

时钟管理上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]
查看完整版本: 时钟管理上pit 和 apic如何协调工作的?