x86_64 架构中的APIC概述

425 阅读4分钟

x86_64架构中,有两种 APIC:Local APIC 和 I/O APIC。

I/O APIC 用于接收外部中断,Local APIC 主要用于处理器之间的中断(interprocessor interrupts -- IPIs )。

在 MP 系统中,APIC 架构图如下:

APIC_in_SMP.png

Local APIC 主要通过 ICR (interrupt command register)来发送 IPIs。中断命令寄存器( ICR )是一个64位的 local APIC 寄存器,它允许当前处理器给其它处理器发送 IPIs。中断命令寄存器( ICR )结构如下:

ICR.png

ICR 主要字段如下:

  • Vector

要发送中断的向量号.

  • Delivery Mode

指定要发送的 IPI 消息类型,主要有以下几种:

000 (Fixed)

传送指定的中断到目标处理器,中断号由 vector 字段指定。

010 (SMI -- Message signalled interrupts)

传送 SMI 中断到目标处理器。vector 字段必须为00H。

100 (NMI)

传送 NMI 中断到目标处理器。 vector 字段的值被忽略。

101 (INIT)

传送INIT 请求到目标处理器,这会导致目标处理器执行初始化。vector 字段必须为00H。

101 (INIT Level De-assert)

(在 Pentium 4 和 Intel Xeon 处理器上不支持。)给系统中的所有的 local APICs 发送同步信息,把他们的arbitration IDs(存储在 Arb ID 寄存器)设置为 APIC IDs。在这种传输模式下,level 标志位必须设置为 0 且触发模式位必须设置为 1。无论 Destination 字段及 Destination Shorthand 字段的值为多少,该 IPI 都会被发送给所有处理器;但是软件应该在编程时指定 Destination Shorthand 字段的值为 “all including self”(10)。

110 (Start-Up)

发送特殊的“start-up” IPI ( SIPI ) 到目标处理器。vector 字段指向启动代码。通过这种传输模式发送的 IPIs 不会自动重试,需要有软件来判断 SIPI是否成功发送以及是否要重新发送。

  • Destination Mode:

目标模式,共有两种:

0-- 物理目标模式

1 -- 逻辑目标模式

  • Level

对于INIT level de-assert 传送模式,该标志位必须置为 0;对于其它所有传送模式,该标志位必须置 1。(该标志位对于 Pentium 4 和 Intel Xeon 处理器无意义,总是被置为 1。)

  • Trigger Mode

对于INIT level de-assert 传送模式,有 edge(0)和 level(1)两种触发模式;其它传送模式会忽略该标志。(该标志位对于 Pentium 4 和 Intel Xeon 处理器无意义,总是被置为 0。)

  • Destination Shorthand

该字段指示是否使用速记符号来指定中断目标,如果是的话,使用的是哪种速记符号。目标速记符用来替代8位的目标字段(destination field),软件可以通过向 ICR 的低双字进行单次写入来实现消息发送。速记符有以下几种类型:软件自我中断(software self interrupt),向系统中包括发送者在内的所有处理器发送 IPIs 中断( IPIs to all processors in the system including the sender), 向系统中除发送者之外的所有处理器发送 IPIs 中断(IPIs to all processors in the system excluding the sender)。

00: (No Shorthand)

目标由destination 字段指定。

01: (Self)

软件给正在执行自己程序的处理器给发送中断,又称自我中断(self-interrupt)。

10: (All Including Self)

向系统中包括发送者在内的所有处理器发送 IPIs 中断。 APIC 会广播 IPI 消息,消息中 destination 字段的值因处理器而异。对于 Pentium 和 P6 家族处理器来说,destination 字段被设置为 FH ;对于 Pentium 4 和 Intel Xeon处理器来说,该字段被设置为 FFH。

11: (All Excluding Self)

向系统中除发送者之外的所有处理器发送 IPIs 中断。 APIC 会使用物理目标模式(physical destination mode)广播 IPI 消息,消息中 destination 字段的值因处理器而异。对于 Pentium 和 P6 家族处理器来说,destination 字段被设置为 FH ;对于 Pentium 4 和 Intel Xeon处理器来说,该字段被设置为 FFH。

  • Destination

该字段指定了目标处理器。仅当 Destination Shorthand 字段被设置成 00H 时,该字段才被使用。

如果 destination mode 字段被设置为物理模式(physical),那么对于 Pentium and P6 家族处理器来说,目标处理器的APIC ID保存在位 56 ~ 59中;对于 Pentium 4 和 Intel Xeon处理器来说,目标处理器的 APIC ID保存在位 56 ~ 63中。

如果 destination mode 字段被设置为逻辑模式(logical),对于 8 位 destination 字段的解释依赖于系统中所有处理器的 local APICs 的 DFR 和 LDR 的设置。

操作 ICR 有两种模式: XAPIC 模式和 x2APIC 模式

XAPIC 模式使用两个 32 位的寄存器 ICR_LOW (FFE0 0300H) and ICR_HIGH (FFE0 0310H)来寻址;x2APIC 模式使用 MSR 830H。

向 ICR 的低双字(低 32 位)写入数据会触发 IPI 的发送;向高32位写数据不会触发 IPI 消息发送。

参考资料:

Intel 64 and IA-32 Architectures Software Developer Manuals :

Vol. 3A 9.4 MULTIPLE-PROCESSOR (MP) INITIALIZATION

Vol. 3A 11.6 ISSUING INTERPROCESSOR INTERRUPTS