本博文将为后续对内核时钟时间管理,ACPI等内容的讨论导入一些铺垫性的东西。

早先的单处理器系统,采用的是大家非常熟悉的8259芯片作为PIC,单个8259可以连接8个外设的中断信号线,主从级联的情形下可以达到15个。8259与处理器间的主要接口pin脚是INTR和INTA,一个用来触发CPU进入中断处理,另一个则是CPU响应外部中断信号。这种UP系统中,处理器与中断相关的外部引脚主要有两个INTR和NMI.8259一般位于主板的南桥芯片中,只适用于UP系统。

现在多处理器(SMP)系统已经非常普遍,因为8259采用pin脚直连的方式,所以在SMP系统中8259已经被APIC(Advanced Programmable Interrupt Controller)所取代。SMP系统中APIC一般分成两个组成部分:LAPIC和IOAPIC。LAPIC即Local APIC,一个集成在处理器内部的芯片,它即可产生中断也能接收来自IOAPIC的中断,同时它还有一个Timer功能,可以为所属的处理器提供本地时钟功能,此外它还可以给发送中断消息给其他处理器IPI(Inter Processor Interrupt)。IOAPIC一般位于南桥芯片上,与8259功能类似,主要作external device interrupts hub,它通过system bus以interrupt message的形式与各处理器中的LAPIC进行互动,IOAPIC即可用于UP系统,也可用于SMP系统。在集成了LAPIC的处理器中,处理器与中断相关的外部引脚为LINT0和LINT1(参考intel开发者手册V3A Figure 8.4. Local APIC Structure)。相对于8259,IOAPIC可以处理更多的外设中断,比如ICH9中单个IOAPIC总共可以支持24个中断,而且可以将接收到的中断分发到不同的处理器中,这与8259有本质的区别。

即便MP已经非常普及,但为了兼容性方面的考虑,8259在现有的平台上依然存在,我这样说,有两个依据:一是最近我通过ACPI来获取系统中APIC的信息,这段代码的输出结合ACPI规范,可以很清晰地看到所谓的dual 8259在我的测试平台上存在。另一个是,几年前我仿照Linux内核写得一个非常小的半成品内核,其中关于中断部分,只用到了8259,在尘封了七八年之后,我几个月前又用新的gcc编译了那个小内核,在最新的几个测试平台(intel和amd的都有)都能正常运行。

02-05 17:42