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