LightSeed
2009-6-10
繼續前一章節。
APIC 是裝置的擴充組合用來驅動 Interrupt 控制器。在目前的建置中,系統的每一個部份都是經由 APIC Bus 連接的。"本機 APIC" 為系統的一部份,負責傳遞 Interrupt 至指定的處理器;舉例來說,當一台機器上有三個處理器則它必須相對的要有三個本機 APIC。自 1994 年的 Pentium P54c 開始Intel 己經將本機 APIC 建置在它們的處理器中。實際建置了 Intel 處理器的電腦就己經包含了 APIC 系統的部份。
系統中另一個重要的部份為 I/O APIC。系統中最多可擁有 8 個 I/O APIC。它們會收集來自 I/O 裝置的 Interrupt 訊號且在當那些裝置需要 interrupt 時傳送訊息至本機 APIC。每個 I/O APIC 有一個專有的 interrupt 輸入 (或 IRQ) 號碼。Intel 過去與目前的 I/O APIC 通常有 24 個輸入 -- 其他的可能有多逹 64 個。而且有些機器擁有數個 I/O APIC,每一個分別有自己的輸入號碼,加起來一台機器上會有上百個 IRQ 可供裝置 Interrupt 使用。
① APIC效率高。8259引起的HW反應很慢,也因此而導致中斷的效率不夠高。
② Method of Interrupt Transmission:The I/O APIC transmits interrupts through memory writes on the normal datapath to the processor, and interrupts are handled without the need for the processor to run an interrupt acknowledge cycle.
③ Interrupt Priority:The priority of interrupts in the I/O APIC is independent of the interrupt number. Take an example, interrupt 10 can be given a higher priority than interrupt 3.
④ More Interrupts.:The I/O APIC in the ICH6 supports a total of 24 interrupts.
⑤ Multiple Interrupt Controllers.:The I/O APIC architecture allows for multiple I/O APIC devices in the system with their own interrupt vectors.
如圖7所示,在CPU這面和IO這面均要有相應的APIC Units才能成功運行APIC的MODE下。
圖7 I/O And Local APIC Units
①IOAPICID—IOAPIC IDENTIFICATION REGISTER
在此列出寄存器描述,詳細請參看spec,見表1
表1 Map of IOAPICID
Bit |
Description |
31:28 |
Reserved |
27:24 |
IOAPIC Identification—R/W. This 4 bit field contains the IOAPIC identification. |
23:0 |
Reserved |
②IOAPICVER—IOAPIC VERSION REGISTER
在此列出寄存器描述,詳細請參看spec 表2
表2 Map of IOAPICVER
Bit |
Description |
31:24 |
Reserved |
23:16 |
Maximum Redirection Entries — RO. This is the entry number (0 being the lowest entry) of the highest entry in the redirection table. It is equal to the number of interrupt input pins minus one and is in the range 0 through 239. In the ICH6 this field is hardwired to 17h to indicate 24 interrupts. |
15 |
PRQ — RO. This bit indicate that the IOxAPIC does not implement the Pin Assertion Register. |
14:8 |
Reserved |
7:0 |
Version — RO. This is a version number that identifies the implementation version.
|
③REDIR_TBL—Redirection Table
這個寄存器比較重要,它以64 bits為單位表示一個IRQ的全部屬性。詳細解釋請查看附錄B 表3
這個兩種控制器是在不同的時代為了滿足相同的需求而產生的,只是一種存在形式的不同而已,我們要分階段地去看待這兩種控制器。平時我們簡說的PIC模式,APIC模式其實就是說在中斷控制的時候是哪個在起作用,僅此而已。
在PIC模式下分配IRQ No.的時候有可能只有兩個號碼分配給PIRQy,那麼中間就需要繞一下。比如說PIRQA—IRQ5, PIRQB—IRQ9, PIRQC—IRQ5, PIRQD—IRQ5。但是在APIC的模式下就不會有這種情況,因為在南橋的datasheet裏就規定好了,PIRQA必定是IRQ16, PIRQB必定是IRQ17等等。我們可以看看ICH6中的截圖。見圖8
圖8 APIC在ICH6中的說明
在PIC和APIC模式中,ISA中斷應該說大部分都是相同的。只有個別是不同的。如果大家有興趣的話不妨研究一下ICH6或者它一系列的datasheet裏面有對他們的一個表格。在APIC datasheet裏面也有對ISA設備的中斷的詳細說明。我就不一一舉例了。
也許細心的讀者會發現在XP下(已經是APIC模式了),有極個別屬於PCI設備,但是它的中斷號碼卻不是IRQ16~IRQ23中的一個值。而是以前它在PIC模式下的IRQ No.(具體點說,在DOS下,筆者用ADU查看Smbus controller分配得到的IRQ是 IRQ5。在XP下,我用device manager查看Smbus controller分配得到的IRQ也是IRQ5。)我截了一个图下来,如下图
PCI设备中断在APIC下异常
哇哇,原來APIC也犯錯誤了!
NO,其實這並沒有犯錯誤。容我說說為什麼會出現這樣的情況。引用高手回答的話語原文如下:原作者,seanchang(H)
在windows 如果是使用APIC的hal的話. IRQ number如果跟BIOS 的一樣的話, 其實就是沒有windows driver驅動 .你只要從 device manager中的選擇driver 下的driver details. 有 driver在一定可以找到device driver的檔.話說為甚麼會如此呢? 其實是因為所有的PCI device一定會存在於 PCI bus. 如果沒有driver的話. Windows 會在device manager 中以問號的形式表示. 可是有些device 根本不需要driver(如 host controller). 在device manager中如果有問號, 使用者就會產生疑問. 因此我們可以可以建立一個對應的INF 來描述這個裝置, 而不需要真的有driver在. 這樣可以去掉那些帶問號的裝置(因為不需要driver), 以免造成誤會.有興趣可以去看看一個叫做machine.inf
原文出處大家可以到以下鏈結看看詳細過程。
http://www.programmer-club.com.tw/ShowSameTitleN/assembly/8137.html
表3