前言
前面我們學習了8259A,但8259A 只適合單 CPU 的情況,為了充分挖掘 SMP 體系結(jié)構(gòu)的并行性,能夠把中斷傳遞給系統(tǒng)中的每個 CPU 至關(guān)重要。基于此理由,Intel 引入了一種名為 I/O 高級可編程控制器的新組件,來替代老式的 8259A 可編程中斷控制器。下面一起來學習一下APIC。
0 APIC概述
Intel從Pentium處理器開始引入了APIC(Advanced Programmable Interrupt Controller)機制,直譯為高級可編程中斷控制器。引入APIC機制是為了適應multiple processor(MP,多處理器)環(huán)境。
APIC經(jīng)歷了4個版本
最初的APIC屬于外部設(shè)備,以外部的82489DX芯片形式存在。在P6家族和Pentium處理器后,以APIC on Chip形式存在,引入了處理器內(nèi)部的local APIC架構(gòu),和82489DX 外部APIC相比較功能得到了擴展和增強。
Pentium 4和Intel Xeon處理器在APIC的基礎(chǔ)上進一步擴展,形成了xAPIC體系,以及最后在xAPIC基礎(chǔ)上再一次擴展的x2APIC體系。
1 APIC
每個logical processor(邏輯處理器)都有自己的local APIC,每個local APIC包括了一組local APIC寄存器,用來控制local和external中斷的產(chǎn)生、發(fā)送和接收等,也產(chǎn)生和發(fā)送IPI(處理器間的中斷消息)。local APIC寄存器組以內(nèi)存映射形式映射到物理地址空間上,因此軟件可以使用MOV指令進行訪問。
然而在x2APIC模式上local APIC寄存器映射到MSR寄存器組來代替映射內(nèi)存,軟件使用RDMSR和WRMSR指令來訪問local APIC寄存器。
如下所示,這是在支持Intel Hyper-Threading Technology的MP系統(tǒng)上,兩個logical processor(線程)共享一個processor core執(zhí)行單元。
每個local APIC有自己的local APIC ID,這個ID決定了logical processor在system bus上的地址,可以用于處理器間的消息接收和發(fā)送,也可用于外部中斷消息的接收。
標準PC上兩片級聯(lián)的8259提供了理論上15個中斷輸入源,但實際系統(tǒng)中這些中斷源遠遠不夠用。
從Pentium開始,微機系統(tǒng)中引入了高級可編程中斷控制器APIC(Advanced Programmable Interrupt Controller), APIC兼容PIC(Programmable Interrupt Controller)。
新型高級可編程中斷控制器SAPIC(StreamLined Advanced Programmable Interrupt Controller)是APIC的64位升級版本。
APIC可以用于單CPU和多CPU系統(tǒng)中。 引入APIC一方面是為了支持多處理器系統(tǒng)需要 ,使外部中斷能被有選擇地交給某一個CPU來處理。
CPU利用處理器間中斷IPI (Inter-Processor Interrupt),可以將一個外部中斷交給另一個CPU來處理 ,也可以在CPU之間發(fā)布消息,或者實現(xiàn)搶占式調(diào)度。
多處理器系統(tǒng)中,CPU通過彼此發(fā)送中斷來完成它們之間的通信。另一方面,擴展了系統(tǒng)可用的中斷數(shù)達到24個,分隔了PCI/ISA設(shè)備使用的中斷,在APIC系統(tǒng)中只有PCI設(shè)備才能使用16~23號中斷,而ISA設(shè)備仍然使用常規(guī)的0~15號中斷,解決了使用8259中斷控制器所帶來的中斷共享、中斷優(yōu)先級不易控制等問題。
ISA總線: (Industry Standard Architecture:工業(yè)標準體系結(jié)構(gòu))是為PC/AT電腦而制定的總線標準,為16位體系結(jié)構(gòu),只能支持16位的I/O設(shè)備,數(shù)據(jù)傳輸率大約是16MB/S。也稱為AT標準。ISA是IndustryStandardArchitecture的縮寫ISA插槽是基于ISA總線(IndustrialStandardArchitecture,工業(yè)標準結(jié)構(gòu)總線)的擴展插槽,其顏色一般為黑色,比PCI接口插槽要長些,位于主板的最下端。其工作頻率為8MHz左右,為16位插槽,最大傳輸率16MB/sec,可插接顯卡,聲卡,網(wǎng)卡已及所謂的多功能接口卡等擴展插卡。其缺點是CPU資源占用太高,數(shù)據(jù)傳輸帶寬太小,是已經(jīng)被淘汰的插槽接口。
ISA是8/16bit的系統(tǒng)總線,最大傳輸速率僅為8MB/s,但允許多個CPU共享系統(tǒng)資源。由于兼容性好,它在上個世紀80年代是最廣泛采用的系統(tǒng)總線,不過它的弱點也是顯而易見的,比如傳輸速率過低、CPU占用率高、占用硬件中斷資源等。后來在PC‘98規(guī)范中,就開始放棄了ISA總線,而Intel從i810芯片組開始,也不再提供對ISA接口的支持。
PCI-Express(peripheral component interconnect express)是一種高速串行計算機擴展總線標準,它原來的名稱為“3GIO”,是由英特爾在2001年提出的,旨在替代舊的PCI,PCI-X和AGP總線標準。PCI總線已成為了計算機的一種標準總線。
PCI總線取代了早先的ISA總線。有許多優(yōu)點,比如即插即用(Plug and Play)、中斷共享等。所謂即插即用,是指當板卡插入系統(tǒng)時,系統(tǒng)會自動對板卡所需資源進行分配,如基地址、中斷號等,并自動尋找相應的驅(qū)動程序。而不象舊的ISA板卡,需要進行復雜的手動配置。實際的實現(xiàn)遠比說起來要復雜。
在PCI板卡中,有一組寄存器,叫"配置空間"(Configuration Space),用來存放基地址與內(nèi)存地址,以及中斷等信息。以內(nèi)存地址為例。當上電時,板卡從ROM里讀取固定的值放到寄存器中,對應內(nèi)存的地方放置的是需要分配的內(nèi)存字節(jié)數(shù)等信息。
操作系統(tǒng)要根據(jù)這個信息分配內(nèi)存,并在分配成功后把相應的寄存器中填入內(nèi)存的起始地址。這樣就不必手工設(shè)置開關(guān)來分配內(nèi)存或基地址了。對于中斷的分配也與此類似。ISA卡的一個重要局限在于中斷是獨占的,而我們知道計算機的中斷號只有16個,系統(tǒng)又用掉了一些,這樣當有多塊ISA卡要用中斷時就會有問題了。PCI總線的中斷共享由硬件與軟件兩部分組成。
硬件上,采用電平觸發(fā)的辦法:中斷信號在系統(tǒng)一側(cè)用電阻接高,而要產(chǎn)生中斷的板卡上利用三極管的集電極將信號拉低。這樣不管有幾塊板產(chǎn)生中斷,中斷信號都是低;而只有當所有板卡的中斷都得到處理后,中斷信號才會回復高電平。
軟件上,采用中斷鏈的方法:假設(shè)系統(tǒng)啟動時,發(fā)現(xiàn)板卡A用了中斷7,就會將中斷7對應的內(nèi)存區(qū)指向A卡對應的中斷服務程序入口ISR_A;然后系統(tǒng)發(fā)現(xiàn)板卡B也用中斷7,這時就會將中斷7對應的內(nèi)存區(qū)指向ISR_B,同時將ISR_B的結(jié)束指向ISR_A。
以此類推,就會形成一個中斷鏈。而當有中斷發(fā)生時,系統(tǒng)跳轉(zhuǎn)到中斷7對應的內(nèi)存,也就是ISR_B。ISR_B就要檢查是不是B卡的中斷,如果是,要處理,并將板卡上的拉低電路放開;如果不是,則呼叫ISR_A。這樣就完成了中斷的共享。咱們繼續(xù)
值得注意的是,只有Windows 2000以后的操作系統(tǒng)才支持APIC, Linux可以支持但需要定制,缺省安裝并不支持。
BIOS運行于實模式,不支持APIC, APIC只有在保護模式下才能使用。 (因此8259A)
整個APIC系統(tǒng)可以分為兩大部分:LAPIC(Local APIC)和IO APIC,如圖23所示。
單核或者多核情況下,每個處理器中都有自己的LAPIC,而IO APIC是作為系統(tǒng)芯片組中一部分,在PCI-to-ISA bridge的LPC控制器內(nèi),系統(tǒng)最多有8個IO APIC。
LAPIC通過系統(tǒng)總線接收該處理器產(chǎn)生的本地中斷(例如時鐘中斷等)及處理器間中斷,并接收外部的中斷消息,如來自IO APIC的消息等。
IO APIC負責接收所有外部的硬件中斷,并翻譯成消息選擇發(fā)給接收中斷的處理器。
APIC功能可以被關(guān)閉。 APIC被關(guān)閉時,由集成在芯片組內(nèi)的8259功能模塊來處理中斷 , 此時LAPIC的引腳LINT0連接到INTR, LINT1連接到NMI 。本節(jié)介紹的APIC以Pentium 4和Xeon為主,Pentium采用的APIC有所不同。
8259A內(nèi)部結(jié)構(gòu)
2 LAPIC
典型地,8259兼容類的legacy中斷控制器是在uni-processor(單處理器)系統(tǒng)上使用,已不能適應于多處理器環(huán)境,而I/O APIC能適用于multi-porcessor(多處理器)環(huán)境上。
I/O APIC可以發(fā)送中斷消息到指向的logical processor上。I/O APIC屬于芯片組的一部分,現(xiàn)稱為PCH(Platform controller Hub),位于PCIto-ISA bridge(南橋芯片)的LPC控制器上。
各芯片組廠商的南橋名稱都有所不同,例如英特爾稱之為I/O路徑控制器(ICH,IO Controller Hub)或平臺路徑控制器(PCH)。因此后面看著叫PCH也不需要奇怪哦!!!
I/O APIC也有自己的寄存器,同樣也以內(nèi)存映射形式映射到物理地址空間上。
LAPIC(Local APIC,本地APIC)包含了8259和8254的功能。
Intel 8253/8254是一個可編程定時/計數(shù)器(PIT-Programmable Interval Timer)芯片,用于處理計算機中的精確時間延遲。該芯片提供了 3個獨立的16位計數(shù)器通道。每個通道可工作在不同的工作方式下, 并且這些工作方式均可以使用軟件來設(shè)置。對于PC/AT及其兼容微機系統(tǒng)采用的是8254芯片。Linux 0.11操作系統(tǒng)只對通道0進行了重新設(shè)置,使得該計數(shù)器工作在方式3下,并且每間隔10毫秒發(fā)出一個信號以產(chǎn)生中斷請求信號(IRQ0)。這個間隔定時產(chǎn)生的中斷請求就是Linux 0.11內(nèi)核工作的脈搏,它用于定時切換當前執(zhí)行的任務和統(tǒng)計每個任務使用的系統(tǒng)資源量(時間)。
它能響應以下幾種中斷:
- ① 系統(tǒng)中斷:IO APIC送來的系統(tǒng)中斷請求,由IO APIC交給中斷請求指定的目標處理器處理。
- ③ 本地中斷:本地APIC產(chǎn)生的系統(tǒng)中斷請求(計時器、LINT0/LINT1、性能監(jiān)控、溫度傳感器、錯誤)。本地中斷只能由該CPU處理。
從P6系列處理器開始,可以用特殊命令CPUID探測LAPIC的存在。如執(zhí)行以下命令:
MOV EAX, 1CPUID
返回值在EDX寄存器中,當返回值第9位為1時,表示本地APIC存在,否則表示不存在。
下面簡要介紹LAPIC的相關(guān)機制。
- (1)中斷發(fā)布方式
本地APIC的中斷發(fā)布方式分為靜態(tài)和動態(tài)兩種。
在靜態(tài)方式下,根據(jù)重定向表中的信息,中斷消息無條件地提交給某一個、幾個或全部CPU;
在動態(tài)方式下,中斷消息通過TPR (Task Priority Register)判斷提交給最低優(yōu)先權(quán)的CPU或焦點CPU(已接收或正在處理該中斷)。
如果有多個CPU都執(zhí)行相同優(yōu)先級的進程,則必須采用仲裁(Arbitration)技術(shù)。
- (2)IA32_APIC_BASE寄存器 在模式專用寄存器(Model Specific Register)中,有一個IA32_APIC_BASE寄存器,其索引為1BH。CPU通過它來配置和控制本地APIC,例如允許、禁止本地APIC及設(shè)置本地APIC寄存器的基地址。IA32_APIC_BASE寄存器的格式如圖24所示。
IA32_APIC_BASE寄存器
- E=1時,啟用本地APIC。
- BSP=1時,此CPU為引導處理器;
- BSP=0時,為應用處理器。
在多CPU系統(tǒng)中,只能有一個引導處理器。
本地APIC寄存器是多個寄32_APIC_BASE指定,使用4KB存儲器空間。
默認情況下,Intel將LAPIC的寄存器都映射到了物理地址0xFEE00000H。
本地APIC寄存器長度為32位、64位或者256位,所有地址邊界按照16字節(jié)即128位為邊界來訪問。APIC地址映射見表如下
- (3)局部向量表
偏移為320H~370H的6個本地APIC寄存器構(gòu)成局部向量表LVT(Local Vector Table) ,分別代表6種中斷:
- 計時器中斷、
- 溫度傳感器中斷、
- 性能監(jiān)控中斷、
- LINT0中斷、
- LINT1中斷
- 錯誤中斷。
LVT中各個寄存器的格式如圖25所示。
局部向量表LVT
- ① D16屏蔽位等于1時,對應的中斷類型被屏蔽。
- ② D15觸發(fā)位等于0時,邊沿觸發(fā);等于1時,電平觸發(fā)。
- ③ D14遠程位等于1時,本地APIC收到中斷請求。收到中斷結(jié)束命令時,置為0。
- ④ D13極性位等于0時,LINT0/LINT1高電平有效;等于1時,低電平有效。
- ⑤ D12狀態(tài)位等于1時,已經(jīng)向CPU提交了中斷請求,但CPU還沒有應答。
一共有5種提交模式,見表如下。
局部中斷提交模式
當提交模式等于000B時,CPU讀取LVT中的低8位作為中斷向量。
- (4)計時器中斷
本地APIC中的計時器相關(guān)寄存器包括當前計數(shù)寄存器CCR、計數(shù)初值寄存器CR和除數(shù)寄存器DCR。
給CR寄存器賦值時,初始值裝入CCR, CCR的值按一定頻率遞減,遞減的頻率等于系統(tǒng)總線頻率除以刻度系數(shù)。刻度系數(shù)由DCR確定。CCR的值遞減到0時,向處理器提交計時器中斷。
當計時器采用單次模式(循環(huán)位等于0)時 ,提交計時器中斷后,CCR的值一直保持為0,直到向CR寄存器裝入新的初值。采用循環(huán)模式時,提交計時器中斷后,CR的值重新到CCR,繼續(xù)遞減。計數(shù)過程中若初始計數(shù)寄存器被重置了,則將使用新的初始計數(shù)值,重新開始計數(shù)。
- (5)發(fā)布中斷
通過寫入ICR寄存器,CPU可以向自身或者其他CPU發(fā)布處理器間中斷IPI。ICR寄存器為64位,低32位的地址為FEE00300H,高32位的地址為FEE00310H。
ICR的主要功能包括:發(fā)送一個中斷給另外一個處理器;允許處理器轉(zhuǎn)發(fā)它收到的一個中斷,但不對另一個處理器的請求提供服務 ;把處理器定向到中斷本身,即執(zhí)行一次自我中斷;傳送特定的IPI,比如啟動IPI(SIPI)消息,到其他處理器。
ICR寄存器格式如圖26所示。
ICR寄存器中,D13、D16、D17、D20~D55均保留。其他位含義如下:
- ① D7~D0表示中斷向量號。
- ② D10~D8表示提交模式:
- a. 000(固定):傳送向量域中指定的中斷到目標處理器或者處理器組。
- b. 001(最低優(yōu)先權(quán)):除了把中斷傳送給目的域中指定的目標處理器組中的優(yōu)先級最低的處理器之外,其他同于固定模式。處理器傳送最低優(yōu)先權(quán)IPI的能力是與模型相關(guān)的,BIOS和操作系統(tǒng)軟件應該避免它。
- c. 010(SMI):傳送一個SMI中斷給目標處理器或者處理器組。為了與未來兼容,該向量域應該設(shè)成00H。
- d. 011(保留)。e. 100(NMI):傳送一個NMI中斷給目標處理器或者處理器組。忽略向量信息。
- f. 101(INIT):傳送一個INIT請求給目標處理器或者處理器組,使之執(zhí)行一次初始化。作為這個IPI消息的結(jié)果之一,所有處理器都執(zhí)行一次初始化。
- g. 110(未激活I(lǐng)NIT的電平):發(fā)送一個同步消息給系統(tǒng)中的所有本地APIC,把它們的仲裁ID設(shè)置成它們的APIC ID。對于這個傳送模式,電平標志必須設(shè)為0,觸發(fā)模式標志設(shè)為1,目標指示應為10(Pentium 4和Intel Xeon處理器中不支持)。
- ③ D11用來指定接收目標的模式。D11=0時,使用物理目標模式;D11=1時,使用邏輯目標模式。
- ④ D12提交狀態(tài)是只讀位。等于1時,表示上一次發(fā)送的IPI消息還沒有被目標CPU接收。
- ⑤ D14有效電平位。0表示無效電平;1表示有效電平。注意,無效電平可能是高電平或者低電平,有效電平也可能是高電平或者低電平。
- ⑥ D15觸發(fā)模式位。0表示邊沿觸發(fā);1表示電平觸發(fā)。
- ⑦ D19~D18目標指示位。等于00時,表示根據(jù)目標ID確定發(fā)送目標;等于01時,發(fā)送給自己;等于10時,發(fā)送給所有CPU;等于11時,發(fā)送給所有CPU(自己除外)。
- ⑧ D64~D56表示消息的目標地址(Message Destination Address, MDA)。目標地址的表示方式包括兩種:物理目標模式和邏輯目標模式。 下面介紹這兩種模式。
- 平面模式:本地APIC中的邏輯目標寄存器(Logic Destination Register, LDR)的高8位保存的是邏輯APIC標識,如圖28所示。將邏輯APIC標識與MDA相與,如果得到的結(jié)果有任何一位等于1,那么這個APIC就接收IPI消息。在平面模式下,由于邏輯APIC標識有8個二進制位,支持最多8個CPU。
LDR格式
* 集群模式:Pentium CPU支持平面集群模式和層次集群模式,而Pentium 4只支持層次集群模式。在層次集群模式下,在CPU的外部還必須設(shè)置專門的集群管理設(shè)備,支持最多15個集群,每個集群上最多連接4個APIC,每個集群使用單獨的APIC或系統(tǒng)總線。例9.14 假設(shè)三個CPU的logical模式配置為:CPU 1的LDR值為00000001b, CPU 2的LDR值為00010010b, CPU3的LDR值為00000100b,此時DFR的model值為0000b。IO APIC發(fā)出一條中斷消息,其Destination Mode為1, Destination field值為00000001b。試分析該中斷消息由哪些CPU接收。解答:三個LAPIC收到該消息后,CPU1、CPU3通過Destination field的高4位判斷出該消息目的地為本簇,再將自身Logical APIC ID的低4位與Destination field低4位進行位與操作,CPU1與結(jié)果不為0,故最終CPU1接收該中斷消息,CPU2、CPU3丟棄。
* 當?shù)?3~56位為FFH時,消息廣播給所有的APIC。
* 對于Pentium 4和Intel Xeon處理器來說,一個單個目的(本地APIC ID從00H到FEH)或?qū)λ蠥PIC的廣播(APIC ID是FFH)都可能在物理模式下指定。
* 對于P6系列和Pentium處理器來說,一個單個目的是由具有從0H到0EH的本地APIC ID的物理目的傳送模式指定的,允許APIC總線中訪問多達15個本地APIC。對所有本地APIC的廣播,是由0FH指定的。
* a.物理目標模式。每一個本地APIC都有唯一的APIC ID。在ICR寄存器的第63~56位中指定一個APIC ID,消息將發(fā)送給與它相同的另一個APIC。
* b.邏輯目標模式。使用邏輯目標模式發(fā)送IPI時,目標APIC可以采用平面模式和集群模式。本地APIC中有一個目標格式寄存器(Destination Format Register, DFR),如圖27所示,它的高4位(第31~28位)等于1111B時,表示平面模式;等于0000B時,表示集群模式。
- (6)處理中斷 本地APIC接收到系統(tǒng)中斷、處理器間中斷、本地中斷后,按照以下流程進行處理:
- ① 檢查系統(tǒng)中斷、處理器間中斷消息中的目標地址與本地APIC是否匹配,如果不匹配,則忽略此消息。
- ② 檢查中斷消息中的提交模式,如果是NMI、SMI、INIT、ExtINT或者SIPI,那么由這個CPU直接處理;否則設(shè)置IRR寄存器(共256位)中的相應位。
- ③ 當有IRR和ISR寄存器中記錄了中斷請求時,按照中斷請求的中斷向量、任務優(yōu)先權(quán)寄存器TPR、處理器優(yōu)先權(quán)寄存器PPR進行優(yōu)先級判斷,交給某一個CPU處理。
- ④ 中斷結(jié)束。提交模式為固定時,中斷服務程序?qū)慙APIC的EOI寄存器,將中斷從ISR寄存器中清除,如果是電平觸發(fā),LAPIC向系統(tǒng)總線發(fā)送一條消息,表示中斷處理結(jié)束。提交模式為NMI、SMI、INIT、ExtINT或者SIPI時,中斷服務程序不需要寫入EOI寄存器。
- (7)中斷請求寄存器IRR和中斷服務寄存器ISR
中斷請求寄存器IRR共256位,地址為FEE00200H~FEE00270H;中斷服務寄存器ISR也是256位,地址為FEE00100H~FEE00170H。
如果中斷的提交模式為固定方式,中斷請求寄存器IRR記錄了本地APIC已經(jīng)接收到的,但還沒有指派給某一個CPU的中斷。當CPU可以處理中斷時,IRR中具有最高優(yōu)先級的中斷(即中斷向量最大)對應的位被置為0,再將ISR中的對應位置為1。ISR中具有最高優(yōu)先級的中斷被發(fā)送給CPU進行處理。
在處理高優(yōu)先級的中斷時,如果發(fā)生了低優(yōu)先級的中斷,該中斷的IRR位置為1。在高優(yōu)先級的中斷處理完成后,中斷服務程序?qū)懭隕OI寄存器,清除高優(yōu)先級中斷的ISR位。這時低優(yōu)先級中斷就會被處理。在處理某個優(yōu)先級的中斷時,如果發(fā)生了相同優(yōu)先級的中斷,該中斷的IRR位置為1。前一個中斷處理完成后,后面的中斷才會被處理。在處理某個優(yōu)先級的中斷時,如果發(fā)生了更高優(yōu)先級的中斷,本地APIC可以向CPU發(fā)送中斷,前一個中斷被暫停,進入新的中斷服務程序。這就是中斷嵌套。
觸發(fā)模式寄存器TMR也是256位。當中斷的IRR位置為1時,邊沿觸發(fā)中斷的TMR位清為0,電平觸發(fā)中斷的TMR位置為1。
- (8)優(yōu)先權(quán) 中斷優(yōu)先權(quán)由它的中斷向量號決定,中斷優(yōu)先權(quán)等于中斷向量號除以16,即中斷向量號的高4位,范圍是2~15。注意,中斷向量號0~31由CPU保留。
任務優(yōu)先權(quán)寄存器TPR的地址為FEE00080H,格式如圖29所示。
任務優(yōu)先權(quán)寄存器TPR
處理器優(yōu)先權(quán)寄存器PPR的地址為FEE000A0H,格式如圖30所示。
處理器優(yōu)先權(quán)寄存器PPR
中斷優(yōu)先權(quán)大于任務優(yōu)先權(quán)時,中斷才會被處理。
CPU通過設(shè)置任務優(yōu)先權(quán)寄存器TPR,禁止低級別的中斷。例如,把TPR中的第7~4位(任務優(yōu)先權(quán))設(shè)為15時,那么所有的外部中斷(除NMI、SMI、INIT、ExtINT等)都會被屏蔽。而任務優(yōu)先權(quán)設(shè)為0時,這些外部中斷不被屏蔽。
處理器優(yōu)先權(quán)寄存器不能被程序所修改,是一個只讀寄存器。 它反映了當前CPU正在執(zhí)行的程序的優(yōu)先級。PPR的值是當前正在服務的中斷向量和TPR二者之間較高的值。
設(shè)ISRV是ISR中被設(shè)置為1的最高優(yōu)先權(quán)的中斷向量,ISR中所有位等于0時,ISRV等于0。PPR按照以下公式來確定:
IF TPR[7∶∶4] ≥ ISRV[7∶∶4]THEN PPR[7∶∶0]=TPR[7∶∶0]ELSE PPR[7∶∶4]=ISRV[7∶∶4]; PPR[3∶∶0]=0
- (9)消息信號中斷
PCI 2.2規(guī)范中引入了消息信號中斷MSI(Message Signaled Interrupts)。PCI設(shè)備可以用兩種方法向CPU發(fā)出中斷請求:
- ①用設(shè)備的一個引腳發(fā)送中斷請求信號;
- ②用MSI向處理器傳送中斷請求。
采用MSI向CPU發(fā)送中斷請求時,PCI設(shè)備發(fā)起一個PCI寫操作,向一個特殊的地址寫入一個特定數(shù)據(jù)。地址的格式如圖9-31所示,數(shù)據(jù)的格式如圖32所示。
MSI地址格式
MSI數(shù)據(jù)格式
在地址中,目標ID指定了MSI消息發(fā)送給哪一個(組)CPU, RH說明是否要把消息發(fā)送給一組中具有最低優(yōu)先權(quán)的CPU, DM則指示采用物理目標模式或者邏輯目標模式。
在數(shù)據(jù)部分,觸發(fā)模式有邊沿觸發(fā)和電平觸發(fā)兩種,后者又分高電平有效和低電平有效。提交模式分為固定、最低優(yōu)先級、SMI、NMI、INIT、ExtINT等幾種。
3 IO APIC
IO APIC用來替代傳統(tǒng)的8259中斷控制器,一般集成在ICH芯片組中。
ICH(I/O controller hub意思是“輸入/輸出控制器中心”,負責連接PCI總線,IDE設(shè)備,I/O設(shè)備等,是英特爾的南橋芯片系列名稱。
表7中列出了IO APIC管理下每個中斷源對應的中斷向量。
表七:每個中斷源對應的中斷向量
和8259相比,IO APIC能支持24個中斷源,不需要中斷應答周期,可以將中斷請求發(fā)送給某一個指定的CPU。
IO APIC的中斷優(yōu)先權(quán)由中斷向量來確定,與中斷源(IRQ)無關(guān)。 (所以軟件編程的時候這個中斷向量的設(shè)置很需要注意,也更加體現(xiàn)了APIC的靈活性)
系統(tǒng)中最多可以擁有8個IO APIC,每一個IO APIC都分別有自己的輸入編碼,加起來一臺PC上會有上百個IRQ可供設(shè)備中斷使用。
IO APIC和LAPIC共同起作用,如果系統(tǒng)中沒有IO APIC,那么LAPIC就沒有用處,此時操作系統(tǒng)會使用8259。Intel系統(tǒng)中常用82093AA芯片來作為IO APIC。
- (1)IO APIC寄存器地址 Intel系統(tǒng)中,IO APIC默認映射到物理地址FEC00000H。IO APIC一共有4個寄存器地址,見表8。
表八:IO APIC的寄存器
一共有64個32位內(nèi)部寄存器,其索引為0~63。內(nèi)部寄存器索引見表9。
表九:IO APIC內(nèi)部寄存器
- (2)重定向表
中斷重定向表中的每一項都有可以被單獨編程,用來指明中斷向量和優(yōu)先級、目標處理器及選擇處理器的方式。
重定向表中的信息用于把每個外部IRQ信號轉(zhuǎn)換為一條消息,然后通過APIC總線把消息發(fā)送給一個或者多個本地APIC單元。
重定向表的格式如圖33所示。
表十:重定向表
目標ID確定哪一個(組)CPU處理這個中斷。目標模式等于0時,即物理目標模式,目標ID的第59~56位表示某一個CPU的APIC ID;等于1時,即邏輯目標模式,目標ID的第53~56位與CPU中的邏輯APIC標識匹配,確定目標。
向CPU發(fā)送中斷時,擴展目標ID(8位)被放置在地址的第11~4位。地址格式如上圖所示。
屏蔽位等于1時,這個中斷不會向CPU發(fā)送。觸發(fā)模式分為邊沿觸發(fā)(D15=0)和電平觸發(fā)(D15=1)兩種,后者又分高電平有效(D13=0)和低電平有效(D13=1)。
在電平觸發(fā)時,遠程IRR位有效。等于1時,表示CPU的本地APIC已接受此中斷,收到本地APIC發(fā)送的EOI后,將此位清0。相對于本地APIC和CPU核心而言,IO APIC和本地APIC之間的傳遞是遠程的。
提交狀態(tài)等于1時,表示中斷消息已產(chǎn)生,但還沒有發(fā)送給本地APIC。提交模式分為固定(000B)、最低優(yōu)先級(001B)、SMI(010B)、NMI(100B)、INIT (101B)、ExtINT(111B)等幾種。
最低優(yōu)先級表示把這個中斷按照目標ID提交給PPR最低的CPU。重定向表的第7~0位表示該中斷對應的中斷向量號,在表7中列出了某系統(tǒng)中各個IRQ對應的中斷向量號。
以上就是對x86的中斷有了一個簡單的了解,后續(xù)我們接著來看看ARM的GIC。
這個名稱的由來,是由于繪制架構(gòu)圖時所派生出來的稱呼,第一次被提到這名詞時是在1991年采用PCl Local Bus架構(gòu)時。在Intel,PCl規(guī)格的創(chuàng)始者視PCI總線為整個PC平臺架構(gòu)的正中央。北橋芯片將PCl總線主干延伸至北邊,以支持CPU、存儲器或緩存(Cache)、以及其他攸關(guān)性能的功能。反之,南橋芯片將PCI總線主干延伸至南邊,并橋接起比較非攸關(guān)性能的I/O功能,例如磁盤接口等、音效等。CPU位于架構(gòu)圖的正北方,它透過較高速的北橋芯片鏈接北邊的系統(tǒng)設(shè)備,而北橋則透過較慢速的南橋芯片連接南邊的其他系統(tǒng)設(shè)備。雖然現(xiàn)今PC平臺架構(gòu)已將PCl總線主干取代,換上更快的I/O主干,但“橋”的傳統(tǒng)名稱仍然延續(xù)使用。北橋(英語:Northbridge)是基于Intel處理器的個人電腦主板芯片組兩枚芯片中的一枚,北橋用來處理高速信號,例如中央處理器、存儲器、顯卡(PCI Express接口或AGP接口),還有與南橋之間的通信。北橋芯片位置剛好跟南橋芯片位置相反,它是靠近CPU部分,被散熱片覆蓋的大的那塊芯片,主要功能是負責控制、連接和處理CPU與內(nèi)存、與南橋通信。北橋芯片是主板的關(guān)鍵芯片,負責管理二級高速緩存,內(nèi)存的類型和最大容量都由它決定,所以一般主板命名都是用北橋芯片的型號。有一些北橋會集成內(nèi)置顯示核心(如Intel GMA),也支持AGP或PCl Express接口。集成顯示核心的北橋若偵測到已安裝的PCle/AGP顯卡,會停止其GPU功能,但有些北橋可以允許同時使用集成式顯卡和安裝外加顯卡,作為多顯示輸出。英特爾在第一代Core i7中把存儲器控制器集成到了CPU,北橋的功能只剩下連接高速設(shè)備(如顯卡),此時Intel的南橋稱為IOH (Io Controller Hub)。從LGA 1156、LGA 2011開始,Intel處理器集成了北橋(存儲器控制器、高速PCl Express控制器和Intel HDGraphics),主板上只剩下南橋,Intel將其稱為平臺路徑控制器(PCH)。
4、APIC與8259A
APIC全稱是Advanced Programmable Interrupt Controller,高級可編程中斷控制器。
它是在奔騰P54C之后被引入進來的。在現(xiàn)在的計算機它通常由兩個部分組成,分別為LAPIC(Local APIC,本地高級可編程中斷控制器)和IOAPIC(I/O高級可編程中斷控制器)。
LAPIC在CPU中,IOAPIC通常位于南橋 。
APIC是在PIC (Programmable Interrupt Controller) 的基礎(chǔ)上發(fā)展而來的。
在傳統(tǒng)的單處理器的PC-AT 兼容的機器,通常使用8259A雙片級聯(lián)組成Legacy中斷控制器(如下圖所示)。一共可以連接15個設(shè)備(有一個管腳被用于串聯(lián)另一片8259)。PIC的優(yōu)先級規(guī)則比較簡單,0號管腳的優(yōu)先級最高。
PIC可以通過ICW(Initialization CommandWord)編程設(shè)置起始的Vector號。
PIC在單個CPU的環(huán)境下工作的挺好,可是當系統(tǒng)越來越復雜出現(xiàn)了多個CPU的情況,它就沒法很好的工作了。這種情況下所有的中斷都會丟給主8259連接的那個CPU,那么這個CPU就要處理所有的中斷,性能上就會有影響。在一個多處理器的系統(tǒng),任何一個CPU都應該能夠響應來自任何設(shè)備的中斷,這種就是所謂的對稱式多重處理(Symmetric Multiprocessing)
IOAPIC: IOAPIC的主要作用是中斷的分發(fā)。最初有一條專門的APIC總線用于IOAPIC和LAPIC通信,在Pentium4 和Xeon 系列CPU出現(xiàn)后,他們的通信被合并到系統(tǒng)總線中。
Virtual Wire Mode:虛擬接線模式,該模式主要是為了向前兼容,可以理解為就是PIC。在這種模式下,IOAPIC會把8259A的模擬硬件產(chǎn)生的中斷信號直接送給BSP。
如上圖所示,每個CPU/Core中都有一個LAPIC。相比較于IOAPIC, LAPIC會更復雜一些,它不僅能夠處理來自IOAPIC的中斷消息,它還可以處理IPI(Inter-Processor Interrupt Messages),NMI,SMI和Init消息。
LAPIC 默認使用基地址FEE00000h開始的4KB空間用來訪問內(nèi)部寄存器,從Pentium Pro開始引入一個APIC_BASE 的MSR,可以用來設(shè)置基地址在任何4KB對齊的64GB內(nèi)存地址空間。IRR:LAPIC已經(jīng)收到中斷但是還未提交CPU處理。ISR:CPU已經(jīng)開始處理中斷,但是尚未完成。TMR(Trigger Mode Register):中斷的觸發(fā)模式。EOI軟件寫入表示中斷處理完成。
-
處理器
+關(guān)注
關(guān)注
68文章
19177瀏覽量
229195 -
溫度傳感器
+關(guān)注
關(guān)注
48文章
2918瀏覽量
155899 -
寄存器
+關(guān)注
關(guān)注
31文章
5325瀏覽量
120046 -
中斷控制器
+關(guān)注
關(guān)注
0文章
59瀏覽量
9442 -
DCR
+關(guān)注
關(guān)注
1文章
54瀏覽量
18802
發(fā)布評論請先 登錄
相關(guān)推薦
評論