目录
一、概述
本文记录一下x86下 APIC的基本工作原理。
二、APIC
8259只适用用单处理器,为了适用SMP提出APIC。一个典型的APIC有LAPIC和I/O APIC组成,如下图:
我们根据前面分析看看这两部分具体的组成和功能,对于I/O APIC来说,它有24个中断引脚,用于接收外部中断,而在其内部将pin和vector进行映射
2.1 I/O APIC
2.1.1 功能
I/O APIC 将pin上产生的中断上报给LAPIC,这个过程和8259A有所不同
- I/O APIC 将中断信息格式化成一个消息放在系统总线上传递给LAPIC
- I/O APIC通过直接写I/O APIC内存映射地址,在系统总线上传递消息,这无须cpu ack,其中断相应更快
典型的I/O APIC有24个pin,前面说过,中断控制器都要提供pin对应vector的映射关系,在I/O APIC中这是由PRT(programmable redirection table)提供的,它的每一项称为RTE(redirection table entry),当I/OAPIC某个管脚接收到中断信号后,会根据该管脚对应的RTE,格式化出一条中断消息,发送给某个CPU的LAPIC。I/O APIC可以有多个,当多个I/O APIC存在时,使用GSI代表每个I/O APIC管脚的编号。
RTE的格式如下:
- 当destination mode是physical时,使用APIC ID指定唯一的目的CPU;当destination mode是Logical 时,使用mask指定目的CPU
interrupt vector指定了pin对应的vector,这里注意I/O APIC没有优先级,优先级和vector有关,vector / 8属于同一个优先级,而优先级由LAPIC指定,后面会说。
2.1.2 I/O APIC 访问
通过下面mmio map出来的寄存器间接访问内部的寄存器(IOREGSEL指定要访问的寄存器,IOWIN读出)
看一下实际物理空间布局:
fec00000-fec003ff : IOAPIC 0
fed00000-fed003ff : HPET 0
fed00000-fed003ff : pnp 00:04
fee00000-fee00fff : Local APIC
内部寄存器的index如下:
- 注意IOREDTBL寄存器相应的偏移对应了pin,这样就暗含了pin和vector的关系
2.1.3 I/O APIC中断流程
外设的产生中断,按照预先 配置在PRT中的信息产生到目的,指定vector的中断消息。
2.2 Local APIC
2.2.1 功能
Local APIC的中断源有:
- 本地中断:APIC timer,Thermal sensor,Performance monitor counter,CMCI等
- 外部中断: I/O APIC
- IPI
2.2.2 Local APIC 访问
根据具体版本不同Local APIC或者由mmio访问或者由msr访问(rdmsr, wrmsr)
Local APIC的基地址由IA32_APIC_BASE指定
Local APIC对应的寄存器很多,具体参照手册,这里简单的列举
和8259A类似的有ISR[0:254],IRR[0:254],TMR[0:254](trigger mode register)。
本地中断相关的配置:
上述寄存器对应的field如下:
- vector这里和I/O APIC一样,中断vector,其他的filed也和I/O APIC一致
- 对于timer,one-shot代表一次性计数;periodic代表周期性计数,TSC-deadline代表指定TSC值计数
IPI相关配置
核间中断,向一个或者一组logical processor发送
寄存器的filed如下:
只说一下和前面相比增加的field
Destination shorthand
- No shorthand,使用destination field和destination mode
- self 给自己发
- all including self 给所有发
- all excluding self 给除去自己的所有发
优先级
Local APIC vector越大,优先级越高,其通过vector / 16 将256个中断向量分为16个priority class,其中0无效,1不使用。那么vector由此分成两个部分
通过TPR(Task Priority Register),只有高于下图Task-Priority Class的中断才能响应。
这里还有一个PPR(Process Priority Register),它是一个只读寄存器表示当前优先级,格式和TPR一样,只有TPR vector优先级高于PPR,中断才能被响应。PPR的值是由TPR和ISR中的vector共同决定的,将二者的Task-Priority Class进行比较,最高值就是处理器当前最高优先级
这个意思就是说ISR存着CPU正在执行的中断的级别,根据它得到的当前最高优先级,那么此时有优先级低的中断过来就先不响应了。
在x86_64中CR8作为TPR
【1】82093AA 数据表 - Intel Corporation