28.1. IO-APIC

作者:

Ingo Molnar <mingo@kernel.org>

大多数(所有)符合Intel-MP标准的SMP主板都具有所谓的“IO-APIC”,这是一种增强型中断控制器。 它使我们能够将硬件中断路由到多个CPU,或者CPU组。 没有IO-APIC,来自硬件的中断将仅传递到启动操作系统的CPU(通常是CPU#0)。

Linux支持所有符合标准的SMP主板,包括具有多个IO-APIC的主板。 在高端服务器中使用多个IO-APIC来进一步分配IRQ负载。

某些较旧的主板上存在(一些)已知的损坏,内核通常会解决这些错误。 如果您的符合MP标准的SMP主板无法启动Linux,请首先查阅linux-smp邮件列表存档。

如果您的机器可以使用启用的IO-APIC IRQ正常启动,那么您的/proc/interrupts将如下所示

hell:~> cat /proc/interrupts
           CPU0
  0:    1360293    IO-APIC-edge  timer
  1:          4    IO-APIC-edge  keyboard
  2:          0          XT-PIC  cascade
 13:          1          XT-PIC  fpu
 14:       1448    IO-APIC-edge  ide0
 16:      28232   IO-APIC-level  Intel EtherExpress Pro 10/100 Ethernet
 17:      51304   IO-APIC-level  eth0
NMI:          0
ERR:          0
hell:~>

一些中断仍然被列为“XT PIC”,但这没有问题; 这些IRQ源都不是性能关键型的。

在不太可能的情况下,您的主板没有创建可用的mp-table,您可以使用pirq =启动参数来“手动构造”IRQ条目。 但是,这并非易事,无法自动化。 一个示例/etc/lilo.conf条目

append="pirq=15,11,10"

实际数字取决于您的系统,您的PCI卡及其PCI插槽位置。 通常,PCI插槽在连接到PCI芯片组IRQ路由设备(传入的PIRQ1-4线)之前会“菊花链”连接

          ,-.        ,-.        ,-.        ,-.        ,-.
PIRQ4 ----| |-.    ,-| |-.    ,-| |-.    ,-| |--------| |
          |S|  \  /  |S|  \  /  |S|  \  /  |S|        |S|
PIRQ3 ----|l|-. `/---|l|-. `/---|l|-. `/---|l|--------|l|
          |o|  \/    |o|  \/    |o|  \/    |o|        |o|
PIRQ2 ----|t|-./`----|t|-./`----|t|-./`----|t|--------|t|
          |1| /\     |2| /\     |3| /\     |4|        |5|
PIRQ1 ----| |-  `----| |-  `----| |-  `----| |--------| |
          `-'        `-'        `-'        `-'        `-'

每个PCI卡都会发出一个PCI IRQ,可以是INTA,INTB,INTC或INTD

      ,-.
INTD--| |
      |S|
INTC--|l|
      |o|
INTB--|t|
      |x|
INTA--| |
      `-'

这些INTA-D PCI IRQ始终“特定于卡”,它们的实际含义取决于它们所在的插槽。 如果您查看菊花链连接图,则插槽4中的卡发出INTA IRQ,它将最终成为PCI芯片组的PIRQ4上的信号。 大多数卡发出INTA,这在PIRQ线之间创建了最佳分配。 (正确分配IRQ源不是必需的,PCI IRQ可以随意共享,但是拥有非共享中断有利于性能)。 插槽5应用于显卡,它们通常不使用中断,因此它们也不会菊花链连接。

因此,如果您的SCSI卡(IRQ11)在插槽1中,Tulip卡(IRQ9)在插槽2中,则必须指定以下pirq =行

append="pirq=11,9"

以下脚本尝试从您的PCI配置中找出这样的默认pirq =行

echo -n pirq=; echo `scanpci | grep T_L | cut -c56-` | sed 's/ /,/g'

请注意,如果跳过几个插槽或主板没有进行默认的菊花链连接,则此脚本将无法工作。 (或者IO-APIC以某种奇怪的方式连接了PIRQ引脚)。 例如,如果在上述情况下,您的SCSI卡(IRQ11)在插槽3中,并且插槽1为空

append="pirq=0,9,11"

[值“0”是通用的“占位符”,保留给空(或不发射IRQ)的插槽。]

通常,总是可以找到正确的pirq =设置,只需正确地排列所有IRQ编号...但这将花费一些时间。 “不正确”的pirq行将导致启动过程挂起,或者设备无法正常工作(例如,如果它是作为模块插入的)。

如果您有2个PCI总线,则最多可以使用8个pirq值,尽管这样的主板往往具有良好的配置。

请做好准备,可能需要一些奇怪的pirq行

append="pirq=0,0,0,0,0,0,9,11"

使用巧妙的试错技术来找出正确的pirq行...

祝你好运,如果此文档未涵盖任何问题,请发送邮件至linux-smp@vger.kernel.orglinux-kernel@vger.kernel.org