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。