第三章 你應該知道的硬件知識
3.1 APIC和PIC共存下的系統
PIC徹底走進歷史的日子已經不遠,Windows已經開始叫囂要放棄對PIC系統的支持,新的架構也徹底和PIC說byebye(例如我們偉大的IA64^_^)。當然,PIC還會繼續在單片機、嵌入式領域發揮餘熱,這就不是我們所能理會的了。但目前PIC和APIC共存的情況還普遍存在,MP spec爲PIC和APIC共存的平臺規定了三種模式:PIC mode、Virtual Wire Mode、Symmetric I/O Mode。
筆者:Symmetric這個單詞打着甚爲麻煩,下文把Symmetric I/O Mode稱爲APIC mode。
三種模式中,PIC mode和Virtual Wire Mode互斥存在,所謂有你沒它。APIC mode是所有MP平臺最終進入的模式。Spec規定,爲了PC/AT compatibility,系統在RESET後首先進入PIC mode或者Virtual Wire mode,操作系統(或BIOS)在適當時候切換入APIC mode。
IMCR,Interrupt Mode Configuration Register,中斷模式配置寄存器,控制當前系統的中斷模式——PIC?還是APIC?當系統RESET後,該寄存器清0,系統默認進入PIC模式。此時BSP(Boot Startup Processor,多處理器系統中第一個啓動的CPU)的NMI和INTR腳爲硬連線,直接從外部接入,不經過APIC。下圖顯示了這個結構:
圖3-1 PIC模式中斷連接圖
注意圖中的虛線,PIC模式下,外部中斷通過PIC直接到達BSP的INTR腳,而NMI直接連接BSP的NMI腳。
對IMCR寫1,可將系統切換至APIC模式。此時外部中斷直接通過APIC到達CPU,NMI則連接LAPIC的LINT1腳。
題外話 —— IMCR的訪問
MP spec規定,I/O端口22h和23h用於支持IMCR寄存器。對22h端口寫70h可選中IMCR,此時對23h端口讀/寫即可。此外,如果PIC mode沒有實現,IMCR則可能沒有實現。MP table的MP feature information字節的IMCRP bit報告平臺是否有ICMR。
筆者:IMCR和PIC mode可能已被埋入了歷史的黃土。筆者查閱了ICH9(ICH即南橋)的spec,沒有找到該寄存器的描述。Google了一下,除了mp spec其它地方都沒提到它。竊以爲,此物已死。
顧名思義,該模式有一條“虛導線”。這條“虛導線”就是APIC——LAPIC或IOAPIC。除此之外,該模式和PIC模式沒有大的區別。
IOAPIC用作“虛導線”情況如下:
圖3-2 Virtual Wire Mode —— IOAPIC
如圖虛線,外部中斷通過PIC連接的IOAPIC管腳,最終到達BSP。當然,連接PIC的這個管腳需要被配置成ExtINT模式。
筆者:spec對IOAPIC用作Virtual Wire的描述只有寥寥數語。根據前面介紹IOAPIC的內容,我們來猜測一下IOAPIC是什麼樣的。首先,IOAPIC的PRT表已經配置好了,不然無法向LAPIC發中斷消息。其次由於外部中斷即連接PIC又連接IOAPIC,爲了避免出現中斷復接的情況,IOAPIC中除了連接PIC的管腳,其它的都應該被mask。連接PIC的管腳delivery mode配置成ExtINT。再來猜猜PIC是什麼樣的。圖中沒有話出,但PIC的INTA腳肯定是連到了BSP的,因爲對於配置成ExtINT的中斷消息,CPU要通過INTA腳應答PIC,並接收中斷的vector …… 以上純屬個人猜測
LAPIC用作Virtual Wire的情況:
圖3-3 Virtual Wire Mode —— LAPIC
還是看圖中虛線,這次PIC接的是BSP的LINT0腳,當然,該管腳也要配置成ExtINT模式。
筆者:MP spec沒說如何從Virtual Wire Mode切換到APIC模式。我們再猜測一下,重新配置模式爲ExtINT(LAPIC或IOAPIC)的管腳,將PIC的所有管腳mask掉?
沒什麼好說的,直接看圖:
圖3-4 APIC mode
一個要求,進入APIC模式後要將PIC的所有管腳mask掉。