SMP的Timer Interrupt初始化问题
最近在看2.6.17在i386上的SMP timer interrupt初始化的时候遇到一个问题。我最初的理解是:只要IO APIC和Local APIC初始化完成了,第二个CPU也就应该能接收到timer interrupt了。对应代码,我觉得只要init() -> smp_prepare_cpus() -> smp_boot_cpus() ->
smpboot_setup_io_apic() -> setup_IO_APIC()和start_secondary() -> local_irq_enable()都执行到了,就应该可以了。
于是我在自己的Dual-core笔记本上作了一个测试。上面所说的初始化完成后,CPU 0收到了70个tick,CPU 1没有收到Tick(意料之中)。我估计CPU 1在过几个Tick的延迟就应该也能收到tick了。出乎意料,直到CPU 0收到了7000多个Tick之后,CPU 1才开始接受Tick。
更让我惊讶的是,如果我在init()中调用sleep_on_timeout(),那么我调用的timeout是多少,CPU 1接受到第一个Tick的时间就会延迟多少。百思不得其解的是:当CPU 0接收到7000多个Tick的时候,CPU 0和CPU 1都已经进入cpu_idle()了。init()也已经开始执行ram disk里的映像了——似乎kernel本身的初始化已经完成。CPU 1到底在等待什么?——或者说到底是什么操作才真正打开CPU 1的timer interrupt?
烦请高手看一下。谢谢。
页:
[1]