Intel® 64 and IA-32 Architectures Software Developer's Manual:Vol 3 Section 10

第十章

高級可編程中斷處理器(APIC)


高級可編程中斷處理器(參考以下章節的本地APIC)在IA-32的Pentium處理器上被引入(參照22.27節,高級可編程中斷處理器),同時包含在P6家族,Pentium 4,Intel 志強處理器和其他較新的Intel 64和IA-32處理器家族中(參照10.4.2章節,本地APIC的存在)。本地APIC爲處理器提供兩項主要功能:
  • 接收來自處理器中斷引腳、內部源、外部I/O APIC(或者其他外部中斷處理器)的中斷。發送中斷到處理器內核去處理
  • 在多處理器系統(MP)中,把核間中斷(IPI)消息發送至或者接收從其他邏輯處理器通過系統總線。IPI消息被分配至系統中處理器間的中斷或者執行整個系統的功能(例如,啓動處理器或者在一組處理器間分配工作)。
外部的I/O APIC是Intel系統芯片組的一部分。它的主要作用是接收來自系統外部和它相關I/O的中斷事件然後作爲中斷消息傳達到本地APIC。在MP系統中,I/O APIC也提供了一個機制去把外部中斷通過系統總線分配至可選處理器或者處理器組的本地APIC。
這一章描述了本地APIC和它的編程接口。同時也總攬了本地APIC和I/O APIC之間的接口。獲取關於I/O APIC更多信息請聯繫Intel。
當一個本地APIC發送一箇中斷到它處理器核心去處理時,處理器使用中斷或者異常處理機制,在第6章有描述,中斷和異常處理。參照6.1節,中斷和異常總攬,獲取中斷和異常處理的介紹。

10.1 本地和I/O APIC 總攬

每一個本地APIC包含一套APIC寄存器(參照表10-1)集合和控制中斷分發至處理器核心、IPI消息生成的相關硬件。而APIC寄存器被內存映射,並且可以使用MOV指令進行讀寫。
本地APIC可以通過以下源接收中斷:
  • 本地連接的I/O設備
    這些中斷產生於由一個直接連接到處理器本地中斷引腳(LINT0和LINT1)的I/O設備發起的邊沿或水平信號。該I/O設備可能也連接到一個8259類型中斷控制器,而該控制器反過來再通過一個本地中斷引腳連接到處理器。
  • 外部連接的I/O設備
    這些中斷產生於由一個連接到I/O APIC中斷輸入引腳的I/O設備發起的邊沿或水平信號。中斷會被當做I/O中斷消息從I/O APIC發送到一個或更多的處理器。
  • 核間中斷(IPI)
    一個Intel 64或者IA-32處理器可以通過系統總線使用IPI機制去中斷另一個或者一組處理器。IPI也被用於軟中斷、中斷轉發或者搶佔式調度。
  • APIC定時器生成中斷
    當可編程的APIC定時器到期時,定時器可以被編程去發送一個本地中斷給它相關的處理器(參照10.5.4,APIC定時器)。
  • 性能監視計數器中斷
    當一個性能監視計數器溢出時,P6家族,Pentium 4,和Intel至強處理器提供了發送一箇中斷到相關處理器的能力(參照18.15.5.8節,當溢出時生成一箇中斷)。
  • 熱傳感器中斷
    當內部熱傳感器失效時,Pentium 4和Intel至強處理器提供了發送一箇中斷給自己的能力(參照14.7.2,熱監視器)。
  • APIC內部錯誤中斷
    當一個錯誤條件在本地APIC內部被觸發(例如嘗試訪問未實現的寄存器),APIC可以編程去發送一箇中斷給相關的處理器(參照10.5.3節,錯誤處理)。
這些中斷源:處理器LINT0和LINT1引腳,APIC 定時器,性能監視計數器,熱傳感器,內部APIC 錯誤檢測器都被稱爲本地中斷源。在接收到一個來自本地中斷源的信號,本地APIC分發該中斷到處理器核心,而這是使用一個被設置好的中斷分發協議,通過被稱爲本地向量表或者LVT(參照10.5.1,本地向量表)的一組APIC寄存器完成的。本地向量表中的一項對應於一個本地中斷源,而這允許一個指定的中斷分發協議設置於每個源。例如,LINT1引腳被用作NMI引腳,本地向量表裏的LINT1項被設置成用向量號2(NMI 中斷)分發一箇中斷給處理器核心。
本地APIC處理來自其他兩個中斷源(外部連接的I/O設備和IPI)的中斷是通過它的IPI消息處理機制。
一個處理器可以通過給它的本地APIC上的中斷命令寄存器(ICR)編程來生成IPI(參照10.6.1章, 中斷命令寄存器(ICR))。寫ICR的行爲可以觸發一個IPI消息並且派發到系統總線(對於奔騰4和Intel至強處理器)或者APIC總線(對於奔騰和P6家族處理器)。參照10.2節,系統總線VSAPIC總線。
IPI可以被髮送給系統中其他的處理器或者發起者處理器(自中斷)。當目標處理器接到一個IPI中斷後,它的本地APIC自動處理該消息(使用例如向量號和觸發模式的信息)。參照10.6節,派發核間中斷,詳細說明本地APIC的IPI消息傳遞和處理機制。
本地APIC同時也可以接收通過I/O APIC連接的外部設備的中斷(參照圖10-1)。I/O APIC負責接收由系統硬件和I/O設備生成的中斷,並且把它們以中斷消息的形式發給本地APIC。


在單核系統本地APIC和I/O APIC的關係
[圖10-1,在單核系統本地APIC和I/O APIC的關係]

I/O APIC上的一個特定引腳可以被編程生成一個特定的中斷向量,當assert時。I/O APIC也有一個“虛擬線模式”,該模式允許自己與一塊標準的8259A類型外部中斷控制器通訊。記住,本地APIC可以被關閉(參照10.4.3節,打開或關閉本地APIC)。這就允許了相應的處理器核心能夠直接接收來自一個8259A中斷控制器的中斷。
本地APIC和I/O APIC被設計用於多核系統(參照圖10-2和10-3)。每個本地APIC處理來自I/O APIC的中斷,來自系統總線上處理器的IPI,和來自自己生成的中斷。中斷也可以通過本地中斷引腳分發給單獨的處理器;然而,這個機制在多核系統上並沒有廣泛使用。


用於多核系統Intel至強處理器的本地APIC和I/O APIC
[圖10-2,用於多核系統Intel至強處理器的本地APIC和I/O APIC]


用於多核系統P6家族處理器的本地APIC和I/O APIC
[圖10-3,用於多核系統P6家族處理器的本地APIC和I/O APIC]

IPI機制通常被用在多核系統中去發送固定中斷(指定了中斷向量號的中斷)和給系統總線上的處理器發送特定中斷。例如,一個本地APIC可以使用一個IPI去把一個固定中斷髮給另一個處理器來尋求服務。特定IPI(包括NMI、INIT、SMI和SIPI IPI)允許一個或多個總線上的處理器去執行全系統啓動,以及控制功能。
下面章節關注本地APIC並且它已經實現於奔騰4,Intel至強,P6家族處理器。在以下章節中,術語“本地APIC”和“I/O APIC”就指的是用在P6處理器家族的本地和I/O APIC,用在P4和至強處理器的本地和I/O xAPIC(參照10.3節,Intel 82489DX 外部 APIC,APIC,xAPIC)。

10.2 系統總線 VS. APIC總線

對於P6家族和奔騰處理器,I/O APIC和本地APIC通過3位APIC內部總線通訊(參照圖10-3)。本地APIC也使用該APIC總線發送和接收IPI。該APIC總線和它上面的消息對於軟件是不可見的,並且沒有歸類到體系結構中去。
從奔騰4和至強處理器開始,I/O APIC和本地APIC(使用xAPIC架構)的通訊通過系統總線(參照圖10-2)。I/O APIC給系統總線上的處理器發送中斷請求是通過橋接硬件完成的,而它是Intel芯片組的一部分。該橋接硬件生成要路由給本地APIC的中斷消息。在本地APIC之間的IPI是可以直接在系統總線上傳送的。

10.3 Intel 82489DX 外部 APIC, APIC, xAPIC

P6家族和奔騰處理器中的本地APIC是Intel 82489DX 外部 APIC的架構子集。參照 17.26.1,本地APIC與82489DX之間的軟件可見差異。
用在奔騰4和Intel至強處理器(稱爲xAPIC架構)的APIC架構是用在P6家族處理器APIC架構的擴展。APIC和xAPIC架構的主要 差異是,在xAPIC架構中本地APIC和I/O APIC通過系統總線通訊,而APIC架構中他們通訊是靠APIC總線(參照10.2,系統總線 VS. APIC總線)。同時,一些APIC架構的特性也被擴展或者修改在xAPIC架構之中。這些擴展和修改寫在下面章節的注意事項當中。

10.4 本地 APIC

以下章節描述了本地APIC的架構和怎麼檢測它,識別它,查看它的狀態。怎樣給本地APIC編程的描述在10.5.1節,本地向量表,和10.6.1節,中斷命令寄存器。

10.4.1 本地 APIC 結構圖

圖10-4給出了一張本地 APIC的功能結構圖。可以通過讀寫它的寄存器實現本地APIC的軟件交互。APIC寄存器被映射到了物理內存起始地址0xFEE00000的4K區域中。對於正確的APIC操作,內存映射地址必須指定爲強不可緩存。參照10.3節,緩存訪問模式。
在多核系統配置中,Intel 64或者IA-32的APIC寄存器在系統總線上最初被映射成同樣的4K區域。軟件可以選擇去更改初始的不同4K區域給所有的本地APIC,或者把每一個本地APIC的寄存器映射到它自己的4K區域。參照10.4.5節,重定位本地APIC寄存器,描述瞭如何重定位APIC寄存器的基址。


注意事項

對於P6家族,奔騰4,和Intel至強處理器,APIC處理所有4K APIC內部寄存器地址的內存訪問,並且不會產生額外的總線週期。對於有片上APIC的奔騰處理器,總線週期是當訪問APIC寄存器空間時被產生。因此,對於要運行在奔騰處理器上的軟件,系統軟件不應該直接映射APIC寄存器到常規系統內存。如果這麼做,可能會導致一個#UD異常或者不可預期的行爲。

本地APIC結構
圖10-4, 本地APIC結構

表10-1描述了APIC寄存器怎樣被映射進4K的寄存器空間。寄存器有32位,64位或者256位寬度;所有的均128位對齊。所有32位寄存器應當使用128位對齊的32位load和store進行訪問。一些處理器可能支持小於32位的load或者store到部分APIC寄存器。這個只是特定模式的行爲,並不能保證在所有處理器上都工作。大寬度寄存器(64位或者256位)必須使用多個load或者store進行訪問,而每一次訪問必須128位對齊。
表10-1中的本地APIC寄存器並不是MSR寄存器。與本地APIC編程相關的MSR寄存器只有IA32_APIC_BASE_MSR(參照10.4.3節,打開或者關閉本地APIC)。


這裏寫圖片描述1
這裏寫圖片描述2
表10-1,本地APIC寄存器地址映射

注意事項:

1. 奔騰4和Intel至強處理器不支持;
2. 奔騰4和Intel至強處理器引入。APIC寄存器和它相關的功能獨立實現,並且可能不在以後的IA-32或者Intel 64位處理器上;
3. 奔騰Pro處理器引入。APIC寄存器和它相關的功能獨立實現,並且可能不在以後的IA-32或者Intel 64位處理器上。


10.4.2 本地 APIC 的打開

從P6家族處理器開始,片上本地APIC的打開和關閉可以被CPUID指令檢測到。當CPUID指令以源操作數EAX=1執行後,返回的EDX第9位表示是打開(1)或者關閉(0)。

10.4.3 本地 APIC 的啓動或者停止

本地APIC可以用以下兩種方式被啓動或者停止:

1. 使用IA32_APIC_BASE MSR(MSR地址0x1B,參照圖10-5)中的全局APIC打開/關閉標記:

  • 當 IA32_APIC_BASE[11] = 0時,處理器從功能上等同於沒有片上APIC的IA-32處理器。CPUID的APIC(參照10.4.2,本地 APIC 的打開)特性位也被置成了0。
  • 當 IA32_APIC_BASE[11] = 0時,基於3位總線APIC的處理器APIC通常不能重新啓動,除非系統冷啓動。這3位總線將丟棄可能有必要完成重新啓動的仲裁。某一APIC的功能可能被打開(例如:性能和熱檢測的中斷生成)。
  • 對於使用前端總線(FSB)分發中斷的處理器,軟件可以通過設置和重置IA32_APIC_BASE[11]來關閉或者打開APIC。一次硬件重置並不需要重新啓動APIC功能。
  • 當IA32_APIC_BASE[11]被置0後,最先對APIC的初始化可能失效並且APIC可能返回到10.4.7.1節描述的狀態,上電或者重置之後的本地APIC狀態。

2. 使用APIC軟件打開或者關閉在僞中斷向量寄存器中的標記(參照圖10-23):

  • 如果IA32_APIC_BASE[1]爲1,軟件可以通過清除在僞中斷向量寄存器(參照圖10-23)中的APIC軟件啓動/關閉標誌臨時停止本地APIC。當在軟件停止態下的本地APIC的狀態描述在10.4.7.2章節,軟件停止後的本地APIC狀態
  • 當本地APIC在軟件停止狀態時,可以通過設置APIC軟件啓動/停止標誌爲1來重新啓動
對於奔騰處理器,APICEN引腳(與PICD1引腳共用)在上電或者重置停止本地APIC時被用到。
請記住,LVT裏每一項都有一個標記位,該標記被用於禁止中斷被分發到所選本地中斷源的處理器上(LINT0和LINT1引腳,APIC計時器,性能監視計時器,熱傳感器,內部APIC錯誤檢測器)。

10.4.4 本地 APIC 狀態和基址

本地APIC的狀態和基址保存在IA32_APIC_BASE的MSR(參照圖10-5)。MSR位的功能描述見下:
  • BSP 位, 第8位 ——表明該處理器是否爲引導處理器(BSP)。參照 8.4節,多處理器(MP)初始化。隨着上電或者重置,被選的BSP該標記會被置爲1,同時其他的處理器(AP)該標記被置爲0
  • APIC 全局使能標記, 第11位 ——啓動或停止本地APIC(參照10.4.3節,啓動或停止本地APIC)。這個標記在奔騰4,Intel志強和P6家族處理器上是可用的,但是並不能保證在以後的Intel 64或者IA-32處理器上還是在這個位置。
  • APIC基址,第12位至35位 ——指定了APIC寄存器的基址。這24位拼接上低端12位的擴展後組成基址。自動頁對齊。隨着上電或者重置,基址被設爲FEE0 0000H。
  • 第0到7位,第9和10位,第36(MAXPHYADDR)到63位爲保留位


IA32_APIC_BASE MSR(P6家族的APIC_BASE_MSR)
圖10-5 IA32_APIC_BASE MSR(P6家族的APIC_BASE_MSR)


10.4.5 重定位本地APIC寄存器

奔騰4,Intel志強,P6家族處理器允許APIC寄存器的起始地址從FEE0 0000H重定位到其他的物理地址,這個通過修改IA32_APIC_BASE MSR的24位基址地址位即可。APIC架構的這個擴展解決了在內存映射時的衝突問題,它允許MP系統中的單個處理器能夠映射他們的APIC寄存器到屋裏內存上的不同位置。

10.4.6 本地APIC ID

上電以後,系統硬件分配一個唯一的APIC ID給系統總線(對於奔騰4和Intel志強處理器)或者APIC 總線(對於P6家族和奔騰處理器)上的每一個APIC。硬件分配APIC ID是基於系統拓撲和包括了插口位置和簇信息的解碼內容(參照圖8-2)。
在MP系統中,本地APIC ID也被BIOS和操作系統用作處理器ID。一些處理器允許軟件修改APIC ID。然而,修改APIC ID軟件的能力是由處理器模式規定的。因此,系統軟件應該避免寫本地APIC ID寄存器。EBX寄存器的第24到31位的值(當執行CPUID EAX[1])總是爲APIC ID的初值(由平臺初始化)。即使軟件改變了本地APICID寄存器該值也是正確的,
處理器收到硬件分配的APIC ID(或初始APIC ID)是通過A11#引腳,A12#引腳,BR0#到BR3#引腳(對於奔騰4,Intel至強和P6家族處理器),BE0#到BE3#引腳(對於奔騰處理器)。由這些引腳組成的APIC ID被存在本地APIC ID寄存器的APIC ID域(參照圖10-6),同時被用於處理器的初始APIC ID。


本地APIC ID寄存器
圖10-6 本地APIC ID寄存器

對於P6家族和奔騰處理器,本地APIC ID寄存器中APIC ID域一共4位。從0H到EH編碼可以唯一標識連接到APIC總線的15個處理器。對於奔4和Intel至強處理器,xAPIC規範擴展到了8位。這可以標識系統中的255個處理器。

10.4.7 本地APIC 狀態

以下章節描述了本地APIC的狀態和寄存器,場景有:上電或者重置之後,本地APIC被軟件設爲停止,一次INIT重置,一次INIT-deassert消息。
x2APIC將引入32位ID;參照10.12節。

10.4.7.1 上電或重置之後的本地APIC 狀態

隨着上電或者 重置處理器,本地APIC的狀態和寄存器如下:
  • 以下寄存器被重置爲全0:
    • IRR,ISR,TMR,ICR,LDR和TPR
    • 計時器初始計數和當前計數寄存器
    • 劃分配置寄存器
  • DFR寄存器被重置爲全1
  • LVT寄存器被重置爲0,標記位爲1
  • 本地APIC版本寄存器不受影響
  • 本地APIC ID寄存器被設置上唯一APIC ID。(奔騰和P6家族處理器)。Arb ID寄存器也被設置爲APIC ID寄存器的值。
  • 僞中斷向量寄存器被初始化成000000FFH。通過設置第8位成0,軟件可以停止本地APIC。
  • 如果是單核心處理器或者多核中的BSP(參照8.4.1節,BSP和AP處理器);本地APIC將正常地響應INIT和NMI消息,INIT#信號和STPCLK#信號。如果處理器是多核系統並且是AP,本地APIC也將響應,這點和BSP一樣。此外,還能響應SIPI消息。對於P6家族處理器,AP不會響應STPCLK#信號。

10.4.7.2 被停止之後的本地APIC 狀態

當僞中斷向量寄存器中的APIC軟件啓動或停止標記被顯示清除(不同於在上電或者重置期間清除),本地APIC被臨時停止(參照10.4.3節,啓動或停止本地APIC)。當處於軟件停止狀態下,操作和本地APIC的響應如下:
  • 本地APIC正常響應INIT、NMI、SMI、SIPI消息
  • 等待IRR和ISR寄存器的中斷被拿到,並且請求標記或者被CPU處理
  • 本地APIC依然可以發出IPI。如果不希望通過IPI機制發送中斷,軟件有責任去避免通過該機制和ICR寄存器發出IPI
  • 當本地APIC停止,本地APIC進入軟件停止態之前,正在進行中的中斷接收或者IPI廣播會被完成
  • 所有LVT項的標記位被置。嘗試重置這些標記位被忽略
  • (對於奔騰和P6家族處理器)本地APIC繼續監聽所有的總線消息以便於保持Arb ID同步於其他

10.4.7.3 INIT重置(等待SIPI狀態)之後本地APIC 狀態

處理器的一次INIT重置可被初始爲兩種方式:
  • 通過使能處理器的INIT#引腳
  • 通過給該處理器發送一個INIT IPI(一次投遞模式的IPI設給INIT)
在通過以上一種機制接收到INIT,處理器響應開始初始化處理器核心和本地APIC。隨着INIT重置本地APIC的狀態和它上電或者重置之後一樣,而APIC ID和Arb ID寄存器不受影響。這個狀態也被稱爲等待SIPI狀態(也可以參照8.2節,多核系統初始化協議的要求和限制)

10.4.7.4 在接收到一個INIT-deassert IPI之後本地APIC 狀態

只有奔騰和P6家族處理器支持INIT-deassert IPI。一個INIT-deassert IPI並不影響APIC的狀態,除了用APIC ID寄存器填充Arb ID寄存器。

10.4.8 在接收到一個INIT-deassert IPI之後本地APIC 狀態

本地APIC包含一個硬件直連的版本寄存器。軟件可以使用該寄存器去識別APIC版本(參照圖10-7)。此外,寄存器根據規範規定了本地向量表(LVT)項的個數。
本地APIC 版本寄存器的域如下:
  • Version 本地APIC的版本號:
    • 0XH 82489DX 不連續 APIC
    • 10H - 15H 集成APIC
    • 其他值保留
  • Max LVT Entry
    • LVT項個數減1。對於奔騰4和Intel志強處理器(有6個LVT項),Max LVT域的值爲5;對於P6家族處理器(有5個LVT項),這個值爲4;對於奔騰處理器(有4個LVT項),這個值爲3。對基於Intel微碼Nehalem處理器和之前的(有7個LVT項),該值爲6。
  • 抑制EOI廣播
    • 表明軟件是否可以通過設置僞中斷向量寄存器的第12位來抑制EOI消息廣播;參照10.8.5節和10.9節


本地APIC 版本寄存器
圖10-7 本地APIC 版本寄存器


10.5 處理本地中斷

以下章節講解了在本地APIC機制下的本地中斷的處理。本地APIC機制包括:處理器的LINT0和LINT1引腳,APIC計時器,性能監視計數器,熱傳感器,內部APIC錯誤檢測器。本地中斷處理機制包括:LVT,錯誤狀態寄存器(ESR),劃分配置寄存器(DCR),初始和當前計數寄存器

10.5.1 本地向量表

本地向量表(LVT)允許軟件去規定本地中斷以哪種方式派發給處理器核心。它包括以下32位APIC寄存器(參照圖10-8)
  • LVT CMCI 寄存器(FEE0 02F0H)
    • 當在支持CMCI的機器檢查庫中的修正機器檢查錯誤計數達到閾值時,規定了中斷的分發(參照15.5.1節,CMCI 本地APIC 接口)
  • LVT 計時器寄存器(FEE0 0320H)
    • 當APIC 計時器發出一箇中斷時,規定了中斷的分發(參照10.5.4節,APIC 計時器)
  • LVT 熱監視器寄存器(FEE0 0330H)
    • 當熱傳感器生成一箇中斷時,規定了中斷的分發(參照14.7.2節,熱監視器)。LVT的這一項是執行規範,並不是架構上的。如果執行,它會被定位在FEE0 0330H基址
  • LVT 性能計數寄存器(FEE0 0340H)
    • 當性能計數器發生一個溢出中斷時,規定了中斷的分發(參照18.15.5.8節,生成一次溢出中斷)。該LVT項是執行規範,並不是架構上的。如果執行,它會被定位在FEE0 0340H基址
  • LVT LINT0 寄存器(FEE0 0350H)
    • 當LINT0引腳信號態發出中斷時,規定了中斷的分發
  • LVT LINT1 寄存器(FEE0 0360H)
    • 當LINT1引腳信號態發出中斷時,規定了中斷的分發
  • LVT 錯誤寄存器(FEE0 0370H)
    • 當APIC檢測到一個內部錯誤時,規定了中斷的分發(參照10.5.3節,錯誤處理)
LVT性能計數寄存器和它相關的中斷在P6處理器上被引入,同時也在奔騰4和Intel至強處理器上。LVT熱監視器寄存器和它相關的中斷在奔騰4和Intel至強處理器上被引入。LVT CMCI寄存器和它相關的中斷在Intel至強5500處理上被引入。
如圖10-8所示,部分域和標誌是不可見的。
LVT表寄存器的設置規範如下:
  • Vector
    • 中斷向量號
  • 分發模式
    • 規定了哪種中斷類型被送到處理器。一些分發模式只在與特定的觸發模式下才生效。有如下分發模式:
    • 000(Fixed) —— 分發規定在向量域內的中斷
    • 010(SMI) —— 通過處理器的邏輯SMI信號路徑分發一個SMI中斷給處理器核心
    • 100(NMI) —— 分發一個NMI中斷給處理器。向量信息被忽略
    • 101(INIT) —— 分發一個INIT請求給處理器核心,而這會讓處理器執行一次INIT。當使用該分發模式,向量域應當被設爲00H以向前兼容。對於LVT CMCI寄存器, LVT熱監視寄存器,LVT性能計數寄存器,這是不支持的
    • 111(ExtINT) —— 使處理器響應中斷,類似於該中斷源於外部連接着的(8259A-兼容模式)中斷處理器。一次特殊的INTA總線週期,相當於ExtINT,會被路由給外部控制器。同時,外部控制器期望能夠提供向量信息。APIC的架構在一個系統中只有一個ExtINT源,通常在兼容模式橋中。系統中應該只有一個處理器有一個LVT項被配置使用該ExtINT分發模式。LVT CMCI寄存器,LVT熱傳感器寄存器,LVT性能計數寄存器不支持該模式
  • 分發狀態(只讀)
    • 以下表示了中斷分發狀態:
    • 0 (Idle) —— 該中斷源當前不活躍或者該源的前中斷已經分發到了處理器核心上,並且被接收到
    • 1 (Sending Pending) —— 表明該源的中斷已經被分發給了處理器核心,但還沒有被接收(參照10.5.5節,本地中斷的接收)
  • 中斷輸入引腳的極性
    • 規定了對應中斷引腳的極性:(0)拉高活躍、(1)拉低活躍
  • 遠程IRR標記(只讀)
    • 對於Fixed mode,水平觸發中斷,本地APIC接收中斷去服務時該標誌被設置,而收到一個來自處理器的EOI命令時被重置。對於邊緣觸發中斷和其他分發模式,該標誌的含義未定義
  • 觸發模式
    • 本地LINT0和LINT1引腳可以選擇觸發模式:(0)邊緣觸發;(1)水平觸發。只有分發模式是Fixed mode時,該標誌纔有效。當分發模式爲NMI,SMI或者INIT時,觸發模式保持邊緣觸發。當分發模式爲ExtINT時,爲水平觸發。計時器和錯誤中斷可以等同於邊緣觸發
    • 如果本地 APIC 不與 I/O APIC 連接使用,則爲Fixed mode;奔騰4,Intel至強和P6家族處理器保持使用水平觸發,不管是否邊緣觸發被選
    • 軟件應當把LVT LINT1寄存器的觸發模式設爲0(邊緣觸發)。LINT1不支持水平觸發
  • 標誌
    • 中斷標誌:(0)打開中斷接收;(1)禁止接收中斷。當本地 APIC 處理性能監視計數器中斷時,它會自動設置LVT性能監視計數寄存器的標誌。該標誌在重置時會被設置爲1。可以被軟件清除
  • 計時器模式
    • 第17到18位表示時鐘模式(參照10.5.4節)
    • 00 ——
    • 01 ——
    • 10 ——
    • 11 ——


本地向量表(LVT)
圖10-8 本地向量表(LVT)


10.5.2 有效的中斷向量

Intel 64和IA-32架構定義了256箇中斷向量號,從0到255(參照6.2節,異常和中斷向量)。本地和I/O APIC支持其中的240(16到255)個爲有效中斷
當0到15的中斷向量通過本地APIC被髮送或者接收,APIC會在它的錯誤狀態寄存器表明一個無效的向量(參照10.5.3節,錯誤處理)。Intel 64和IA-32架構保留16到31爲預定義中斷,異常,Intel保留編碼(參照表6-1)。然而,本地APIC並不把這個範圍內的向量作爲無效向量
當一個無效向量值(0到15)被寫到LVT項並且分發模式爲Fixed(第8到11位爲0)時,APIC可以激發一個無效向量錯誤,不論是否設置了標記位還是有中斷輸入

10.5.3 錯誤處理

本地APIC記錄了在錯誤狀態寄存器(ESR)中的錯誤,而該錯誤是在中斷處理過程中被檢測到的。ESR的格式如圖10-9;它包含以下標記:
  • 第0位:發送校驗和錯誤
    • 當本地APIC檢測到發送至APIC總線上消息的一個校驗和錯誤時設置。僅在P6家族和奔騰處理器上被使用
  • 第1位:接收校驗和錯誤
    • 當本地APIC檢測到接收到APIC總線上消息的一個校驗和錯誤時設置。僅在P6家族和奔騰處理器上被使用
  • 第2位:發送確認錯誤
    • 當本地APIC檢測到APIC總線上任意的APIC沒有確認發送的消息時設置。僅在P6家族和奔騰處理器上被使用
  • 第3位:接收確認錯誤
    • 當本地APIC檢測到APIC總線上任意的APIC沒有確認接收到的消息時設置。僅在P6家族和奔騰處理器上被使用
  • 第4位:可重定向IPI
      -
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章