XV6

对于单核环境,XV6 使用 PIC(programmable interrupt controller)。

PIC 全称 Programmable Interrupt Controller,通常是指 Intel 8259A 双片级联构成的,最多支持 15 个 interrupts 的中断控制系统。

APIC 全称 Advanced Programmable Interrupt Controller, APIC 是为了多核平台而设计的。它由两个部分组成 IOAPIC 和 LAPIC,其中 IOAPIC 通常位于南桥中用于处理桥上的设备所产生的各种中断,LAPIC 则是每个 CPU 都会有一个。

IOAPIC 通过 APICBUS(现在都是通过 FSB / QPI)将中断信息分派给每个 CPU 的 LAPIC,CPU 上的 LAPIC 能够智能的决定是否接受系统总线上传递过来的中断信息,而且它还可以处理 Local 端中断的 pending、 nesting、masking,以及 IOAPIC 于 Local CPU 的交互处理。

为了能够正常的使用 PIC 来管理系统中断,就需要对它进行初始化。8259A 支持两种类型的命令字,一类是初始化命令字 ICW1~4,另一类是操作命令字 OCW1~3,其中每一个命令字的各个 bit 都有其代表的特定意义。下述是一个初始化 Master 的一个 sample code:

MOVAL,00010001b  ; 级联,边沿触发,需要写 ICW4 
OUT20H,AL        ; 写 ICW1 
MOVAL,01000000B  ; 中断类型号 40H 
OUT21H,AL        ; 写 ICW2 
MOVAL,00000100B  ; 主片的 IR2 引脚从片 
OUT21H,AL        ; 写 ICW3 
MOVAL,00010001B  ; 特殊完全嵌套,非缓冲,自动结束 
OUT21H,AL        ; 写 ICW4 

1. 相关代码

XV6 中的 PIC 代码在 picirq.c