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.org或linux-kernel@vger.kernel.org。