0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

干貨!從硬件看中斷之APIC

冬至子 ? 來源:TrustZone ? 作者:Hcoco ? 2023-08-08 17:28 ? 次閱讀

前言

前面我們學(xué)習(xí)了8259A,但8259A 只適合單 CPU 的情況,為了充分挖掘 SMP 體系結(jié)構(gòu)的并行性,能夠把中斷傳遞給系統(tǒng)中的每個 CPU 至關(guān)重要。基于此理由,Intel 引入了一種名為 I/O 高級可編程控制器的新組件,來替代老式的 8259A 可編程中斷控制器。下面一起來學(xué)習(xí)一下APIC。

0 APIC概述

Intel從Pentium處理器開始引入了APIC(Advanced Programmable Interrupt Controller)機(jī)制,直譯為高級可編程中斷控制器。引入APIC機(jī)制是為了適應(yīng)multiple processor(MP,多處理器)環(huán)境。

APIC經(jīng)歷了4個版本

image.png

最初的APIC屬于外部設(shè)備,以外部的82489DX芯片形式存在。在P6家族和Pentium處理器后,以APIC on Chip形式存在,引入了處理器內(nèi)部的local APIC架構(gòu),和82489DX 外部APIC相比較功能得到了擴(kuò)展和增強(qiáng)。

Pentium 4和Intel Xeon處理器在APIC的基礎(chǔ)上進(jìn)一步擴(kuò)展,形成了xAPIC體系,以及最后在xAPIC基礎(chǔ)上再一次擴(kuò)展的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指令進(jìn)行訪問。

然而在x2APIC模式上local APIC寄存器映射到MSR寄存器組來代替映射內(nèi)存,軟件使用RDMSR和WRMSR指令來訪問local APIC寄存器。

如下所示,這是在支持Intel Hyper-Threading Technology的MP系統(tǒng)上,兩個logical processor(線程)共享一個processor core執(zhí)行單元。

image.png

每個local APIC有自己的local APIC ID,這個ID決定了logical processor在system bus上的地址,可以用于處理器間的消息接收和發(fā)送,也可用于外部中斷消息的接收。

標(biāo)準(zhǔn)PC上兩片級聯(lián)的8259提供了理論上15個中斷輸入源,但實際系統(tǒng)中這些中斷源遠(yuǎn)遠(yuǎn)不夠用。

從Pentium開始,微機(jī)系統(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ā)送中斷來完成它們之間的通信。另一方面,擴(kuò)展了系統(tǒng)可用的中斷數(shù)達(dá)到24個,分隔了PCI/ISA設(shè)備使用的中斷,在APIC系統(tǒng)中只有PCI設(shè)備才能使用16~23號中斷,而ISA設(shè)備仍然使用常規(guī)的0~15號中斷,解決了使用8259中斷控制器所帶來的中斷共享、中斷優(yōu)先級不易控制等問題。

ISA總線: (Industry Standard Architecture:工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu))是為PC/AT電腦而制定的總線標(biāo)準(zhǔn),為16位體系結(jié)構(gòu),只能支持16位的I/O設(shè)備,數(shù)據(jù)傳輸率大約是16MB/S。也稱為AT標(biāo)準(zhǔn)。ISA是IndustryStandardArchitecture的縮寫ISA插槽是基于ISA總線(IndustrialStandardArchitecture,工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)總線)的擴(kuò)展插槽,其顏色一般為黑色,比PCI接口插槽要長些,位于主板的最下端。其工作頻率為8MHz左右,為16位插槽,最大傳輸率16MB/sec,可插接顯卡,聲卡,網(wǎng)卡已及所謂的多功能接口卡等擴(kuò)展插卡。其缺點是CPU資源占用太高,數(shù)據(jù)傳輸帶寬太小,是已經(jīng)被淘汰的插槽接口。

ISA是8/16bit的系統(tǒng)總線,最大傳輸速率僅為8MB/s,但允許多個CPU共享系統(tǒng)資源。由于兼容性好,它在上個世紀(jì)80年代是最廣泛采用的系統(tǒng)總線,不過它的弱點也是顯而易見的,比如傳輸速率過低、CPU占用率高、占用硬件中斷資源等。后來在PC‘98規(guī)范中,就開始放棄了ISA總線,而Intel從i810芯片組開始,也不再提供對ISA接口的支持。

PCI-Express(peripheral component interconnect express)是一種高速串行計算機(jī)擴(kuò)展總線標(biāo)準(zhǔn),它原來的名稱為“3GIO”,是由英特爾在2001年提出的,旨在替代舊的PCI,PCI-X和AGP總線標(biāo)準(zhǔn)。PCI總線已成為了計算機(jī)的一種標(biāo)準(zhǔn)總線。

PCI總線取代了早先的ISA總線。有許多優(yōu)點,比如即插即用(Plug and Play)、中斷共享等。所謂即插即用,是指當(dāng)板卡插入系統(tǒng)時,系統(tǒng)會自動對板卡所需資源進(jìn)行分配,如基地址、中斷號等,并自動尋找相應(yīng)的驅(qū)動程序。而不象舊的ISA板卡,需要進(jìn)行復(fù)雜的手動配置。實際的實現(xiàn)遠(yuǎn)比說起來要復(fù)雜。

在PCI板卡中,有一組寄存器,叫"配置空間"(Configuration Space),用來存放基地址與內(nèi)存地址,以及中斷等信息。以內(nèi)存地址為例。當(dāng)上電時,板卡從ROM里讀取固定的值放到寄存器中,對應(yīng)內(nèi)存的地方放置的是需要分配的內(nèi)存字節(jié)數(shù)等信息。

操作系統(tǒng)要根據(jù)這個信息分配內(nèi)存,并在分配成功后把相應(yīng)的寄存器中填入內(nèi)存的起始地址。這樣就不必手工設(shè)置開關(guān)來分配內(nèi)存或基地址了。對于中斷的分配也與此類似。ISA卡的一個重要局限在于中斷是獨占的,而我們知道計算機(jī)的中斷號只有16個,系統(tǒng)又用掉了一些,這樣當(dāng)有多塊ISA卡要用中斷時就會有問題了。PCI總線的中斷共享由硬件與軟件兩部分組成。

硬件上,采用電平觸發(fā)的辦法:中斷信號在系統(tǒng)一側(cè)用電阻接高,而要產(chǎn)生中斷的板卡上利用三極管的集電極將信號拉低。這樣不管有幾塊板產(chǎn)生中斷,中斷信號都是低;而只有當(dāng)所有板卡的中斷都得到處理后,中斷信號才會回復(fù)高電平。

軟件上,采用中斷鏈的方法:假設(shè)系統(tǒng)啟動時,發(fā)現(xiàn)板卡A用了中斷7,就會將中斷7對應(yīng)的內(nèi)存區(qū)指向A卡對應(yīng)的中斷服務(wù)程序入口ISR_A;然后系統(tǒng)發(fā)現(xiàn)板卡B也用中斷7,這時就會將中斷7對應(yīng)的內(nèi)存區(qū)指向ISR_B,同時將ISR_B的結(jié)束指向ISR_A。

以此類推,就會形成一個中斷鏈。而當(dāng)有中斷發(fā)生時,系統(tǒng)跳轉(zhuǎn)到中斷7對應(yīng)的內(nèi)存,也就是ISR_B。ISR_B就要檢查是不是B卡的中斷,如果是,要處理,并將板卡上的拉低電路放開;如果不是,則呼叫ISR_A。這樣就完成了中斷的共享。咱們繼續(xù)

值得注意的是,只有Windows 2000以后的操作系統(tǒng)才支持APIC, Linux可以支持但需要定制,缺省安裝并不支持。

BIOS運行于實模式,不支持APIC, APIC只有在保護(hù)模式下才能使用。 (因此8259A)

整個APIC系統(tǒng)可以分為兩大部分:LAPIC(Local APIC)和IO APIC,如圖23所示。

image.png

單核或者多核情況下,每個處理器中都有自己的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ù)責(zé)接收所有外部的硬件中斷,并翻譯成消息選擇發(fā)給接收中斷的處理器。

APIC功能可以被關(guān)閉。 APIC被關(guān)閉時,由集成在芯片組內(nèi)的8259功能模塊來處理中斷此時LAPIC的引腳LINT0連接到INTR, LINT1連接到NMI 。本節(jié)介紹的APIC以Pentium 4和Xeon為主,Pentium采用的APIC有所不同。

image.png
8259A內(nèi)部結(jié)構(gòu)

2 LAPIC

典型地,8259兼容類的legacy中斷控制器是在uni-processor(單處理器)系統(tǒng)上使用,已不能適應(yī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)芯片,用于處理計算機(jī)中的精確時間延遲。該芯片提供了 3個獨立的16位計數(shù)器通道。每個通道可工作在不同的工作方式下, 并且這些工作方式均可以使用軟件來設(shè)置。對于PC/AT及其兼容微機(jī)系統(tǒng)采用的是8254芯片。Linux 0.11操作系統(tǒng)只對通道0進(jìn)行了重新設(shè)置,使得該計數(shù)器工作在方式3下,并且每間隔10毫秒發(fā)出一個信號以產(chǎn)生中斷請求信號(IRQ0)。這個間隔定時產(chǎn)生的中斷請求就是Linux 0.11內(nèi)核工作的脈搏,它用于定時切換當(dāng)前執(zhí)行的任務(wù)和統(tǒng)計每個任務(wù)使用的系統(tǒng)資源量(時間)。

它能響應(yīng)以下幾種中斷:

  • ① 系統(tǒng)中斷:IO APIC送來的系統(tǒng)中斷請求,由IO APIC交給中斷請求指定的目標(biāo)處理器處理。
  • ③ 本地中斷:本地APIC產(chǎn)生的系統(tǒng)中斷請求(計時器、LINT0/LINT1、性能監(jiān)控、溫度傳感器、錯誤)。本地中斷只能由該CPU處理。

從P6系列處理器開始,可以用特殊命令CPUID探測LAPIC的存在。如執(zhí)行以下命令:

MOV   EAX, 1CPUID

返回值在EDX寄存器中,當(dāng)返回值第9位為1時,表示本地APIC存在,否則表示不存在。

下面簡要介紹LAPIC的相關(guān)機(jī)制。

  • (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)先級的進(jìn)程,則必須采用仲裁(Arbitration)技術(shù)。

  • (2)IA32_APIC_BASE寄存器 在模式專用寄存器(Model Specific Register)中,有一個IA32_APIC_BASE寄存器,其索引為1BH。CPU通過它來配置和控制本地APIC,例如允許、禁止本地APIC及設(shè)置本地APIC寄存器的基地址。IA32_APIC_BASE寄存器的格式如圖24所示。

image.png
IA32_APIC_BASE寄存器

  • E=1時,啟用本地APIC。
  • BSP=1時,此CPU為引導(dǎo)處理器;
  • BSP=0時,為應(yīng)用處理器。

在多CPU系統(tǒng)中,只能有一個引導(dǎo)處理器。

本地APIC寄存器是多個寄32_APIC_BASE指定,使用4KB存儲器空間。

默認(rèn)情況下,Intel將LAPIC的寄存器都映射到了物理地址0xFEE00000H。

本地APIC寄存器長度為32位、64位或者256位,所有地址邊界按照16字節(jié)即128位為邊界來訪問。APIC地址映射見表如下

image.png

  • (3)局部向量表

偏移為320H~370H的6個本地APIC寄存器構(gòu)成局部向量表LVT(Local Vector Table) ,分別代表6種中斷:

  • 計時器中斷、
  • 溫度傳感器中斷、
  • 性能監(jiān)控中斷、
  • LINT0中斷、
  • LINT1中斷
  • 錯誤中斷。

LVT中各個寄存器的格式如圖25所示。
image.png

局部向量表LVT

  • ① D16屏蔽位等于1時,對應(yīng)的中斷類型被屏蔽。
  • ② D15觸發(fā)位等于0時,邊沿觸發(fā);等于1時,電平觸發(fā)。
  • ③ D14遠(yuǎn)程位等于1時,本地APIC收到中斷請求。收到中斷結(jié)束命令時,置為0。
  • ④ D13極性位等于0時,LINT0/LINT1高電平有效;等于1時,低電平有效。
  • ⑤ D12狀態(tài)位等于1時,已經(jīng)向CPU提交了中斷請求,但CPU還沒有應(yīng)答。

一共有5種提交模式,見表如下。

image.png
局部中斷提交模式

當(dāng)提交模式等于000B時,CPU讀取LVT中的低8位作為中斷向量。

  • (4)計時器中斷

本地APIC中的計時器相關(guān)寄存器包括當(dāng)前計數(shù)寄存器CCR、計數(shù)初值寄存器CR和除數(shù)寄存器DCR。

給CR寄存器賦值時,初始值裝入CCR, CCR的值按一定頻率遞減,遞減的頻率等于系統(tǒng)總線頻率除以刻度系數(shù)??潭认禂?shù)由DCR確定。CCR的值遞減到0時,向處理器提交計時器中斷。

當(dāng)計時器采用單次模式(循環(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ā)它收到的一個中斷,但不對另一個處理器的請求提供服務(wù) ;把處理器定向到中斷本身,即執(zhí)行一次自我中斷;傳送特定的IPI,比如啟動IPI(SIPI)消息,到其他處理器。

ICR寄存器格式如圖26所示。

image.png

ICR寄存器中,D13、D16、D17、D20~D55均保留。其他位含義如下:

  • ① D7~D0表示中斷向量號。
  • ② D10~D8表示提交模式:
    • a. 000(固定):傳送向量域中指定的中斷到目標(biāo)處理器或者處理器組。
    • b. 001(最低優(yōu)先權(quán)):除了把中斷傳送給目的域中指定的目標(biāo)處理器組中的優(yōu)先級最低的處理器之外,其他同于固定模式。處理器傳送最低優(yōu)先權(quán)IPI的能力是與模型相關(guān)的,BIOS和操作系統(tǒng)軟件應(yīng)該避免它。
    • c. 010(SMI):傳送一個SMI中斷給目標(biāo)處理器或者處理器組。為了與未來兼容,該向量域應(yīng)該設(shè)成00H。
    • d. 011(保留)。e. 100(NMI):傳送一個NMI中斷給目標(biāo)處理器或者處理器組。忽略向量信息。
    • f. 101(INIT):傳送一個INIT請求給目標(biāo)處理器或者處理器組,使之執(zhí)行一次初始化。作為這個IPI消息的結(jié)果之一,所有處理器都執(zhí)行一次初始化。
    • g. 110(未激活I(lǐng)NIT的電平):發(fā)送一個同步消息給系統(tǒng)中的所有本地APIC,把它們的仲裁ID設(shè)置成它們的APIC ID。對于這個傳送模式,電平標(biāo)志必須設(shè)為0,觸發(fā)模式標(biāo)志設(shè)為1,目標(biāo)指示應(yīng)為10(Pentium 4和Intel Xeon處理器中不支持)。
  • ③ D11用來指定接收目標(biāo)的模式。D11=0時,使用物理目標(biāo)模式;D11=1時,使用邏輯目標(biāo)模式。
  • ④ D12提交狀態(tài)是只讀位。等于1時,表示上一次發(fā)送的IPI消息還沒有被目標(biāo)CPU接收。
  • ⑤ D14有效電平位。0表示無效電平;1表示有效電平。注意,無效電平可能是高電平或者低電平,有效電平也可能是高電平或者低電平。
  • ⑥ D15觸發(fā)模式位。0表示邊沿觸發(fā);1表示電平觸發(fā)。
  • ⑦ D19~D18目標(biāo)指示位。等于00時,表示根據(jù)目標(biāo)ID確定發(fā)送目標(biāo);等于01時,發(fā)送給自己;等于10時,發(fā)送給所有CPU;等于11時,發(fā)送給所有CPU(自己除外)。
  • ⑧ D64~D56表示消息的目標(biāo)地址(Message Destination Address, MDA)。目標(biāo)地址的表示方式包括兩種:物理目標(biāo)模式和邏輯目標(biāo)模式。 下面介紹這兩種模式。
    • 平面模式:本地APIC中的邏輯目標(biāo)寄存器(Logic Destination Register, LDR)的高8位保存的是邏輯APIC標(biāo)識,如圖28所示。將邏輯APIC標(biāo)識與MDA相與,如果得到的結(jié)果有任何一位等于1,那么這個APIC就接收IPI消息。在平面模式下,由于邏輯APIC標(biāo)識有8個二進(jìn)制位,支持最多8個CPU。

image.png
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位進(jìn)行位與操作,CPU1與結(jié)果不為0,故最終CPU1接收該中斷消息,CPU2、CPU3丟棄。
* 當(dāng)?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總線中訪問多達(dá)15個本地APIC。對所有本地APIC的廣播,是由0FH指定的。
* a.物理目標(biāo)模式。每一個本地APIC都有唯一的APIC ID。在ICR寄存器的第63~56位中指定一個APIC ID,消息將發(fā)送給與它相同的另一個APIC。
* b.邏輯目標(biāo)模式。使用邏輯目標(biāo)模式發(fā)送IPI時,目標(biāo)APIC可以采用平面模式和集群模式。本地APIC中有一個目標(biāo)格式寄存器(Destination Format Register, DFR),如圖27所示,它的高4位(第31~28位)等于1111B時,表示平面模式;等于0000B時,表示集群模式。

image.png

  • (6)處理中斷 本地APIC接收到系統(tǒng)中斷、處理器間中斷、本地中斷后,按照以下流程進(jìn)行處理:
  • ① 檢查系統(tǒng)中斷、處理器間中斷消息中的目標(biāo)地址與本地APIC是否匹配,如果不匹配,則忽略此消息。
  • ② 檢查中斷消息中的提交模式,如果是NMI、SMI、INIT、ExtINT或者SIPI,那么由這個CPU直接處理;否則設(shè)置IRR寄存器(共256位)中的相應(yīng)位。
  • ③ 當(dāng)有IRR和ISR寄存器中記錄了中斷請求時,按照中斷請求的中斷向量、任務(wù)優(yōu)先權(quán)寄存器TPR、處理器優(yōu)先權(quán)寄存器PPR進(jìn)行優(yōu)先級判斷,交給某一個CPU處理。
  • ④ 中斷結(jié)束。提交模式為固定時,中斷服務(wù)程序?qū)慙APIC的EOI寄存器,將中斷從ISR寄存器中清除,如果是電平觸發(fā),LAPIC向系統(tǒng)總線發(fā)送一條消息,表示中斷處理結(jié)束。提交模式為NMI、SMI、INIT、ExtINT或者SIPI時,中斷服務(wù)程序不需要寫入EOI寄存器。
  • (7)中斷請求寄存器IRR和中斷服務(wù)寄存器ISR

中斷請求寄存器IRR共256位,地址為FEE00200H~FEE00270H;中斷服務(wù)寄存器ISR也是256位,地址為FEE00100H~FEE00170H。

如果中斷的提交模式為固定方式,中斷請求寄存器IRR記錄了本地APIC已經(jīng)接收到的,但還沒有指派給某一個CPU的中斷。當(dāng)CPU可以處理中斷時,IRR中具有最高優(yōu)先級的中斷(即中斷向量最大)對應(yīng)的位被置為0,再將ISR中的對應(yīng)位置為1。ISR中具有最高優(yōu)先級的中斷被發(fā)送給CPU進(jìn)行處理。

在處理高優(yōu)先級的中斷時,如果發(fā)生了低優(yōu)先級的中斷,該中斷的IRR位置為1。在高優(yōu)先級的中斷處理完成后,中斷服務(wù)程序?qū)懭隕OI寄存器,清除高優(yōu)先級中斷的ISR位。這時低優(yōu)先級中斷就會被處理。在處理某個優(yōu)先級的中斷時,如果發(fā)生了相同優(yōu)先級的中斷,該中斷的IRR位置為1。前一個中斷處理完成后,后面的中斷才會被處理。在處理某個優(yōu)先級的中斷時,如果發(fā)生了更高優(yōu)先級的中斷,本地APIC可以向CPU發(fā)送中斷,前一個中斷被暫停,進(jìn)入新的中斷服務(wù)程序。這就是中斷嵌套。

觸發(fā)模式寄存器TMR也是256位。當(dāng)中斷的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保留。

任務(wù)優(yōu)先權(quán)寄存器TPR的地址為FEE00080H,格式如圖29所示。

image.png
任務(wù)優(yōu)先權(quán)寄存器TPR

處理器優(yōu)先權(quán)寄存器PPR的地址為FEE000A0H,格式如圖30所示。

image.png
處理器優(yōu)先權(quán)寄存器PPR

中斷優(yōu)先權(quán)大于任務(wù)優(yōu)先權(quán)時,中斷才會被處理。

CPU通過設(shè)置任務(wù)優(yōu)先權(quán)寄存器TPR,禁止低級別的中斷。例如,把TPR中的第7~4位(任務(wù)優(yōu)先權(quán))設(shè)為15時,那么所有的外部中斷(除NMI、SMI、INIT、ExtINT等)都會被屏蔽。而任務(wù)優(yōu)先權(quán)設(shè)為0時,這些外部中斷不被屏蔽。

處理器優(yōu)先權(quán)寄存器不能被程序所修改,是一個只讀寄存器。 它反映了當(dāng)前CPU正在執(zhí)行的程序的優(yōu)先級。PPR的值是當(dāng)前正在服務(wù)的中斷向量和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所示。

image.png
MSI地址格式

image.png
MSI數(shù)據(jù)格式

在地址中,目標(biāo)ID指定了MSI消息發(fā)送給哪一個(組)CPU, RH說明是否要把消息發(fā)送給一組中具有最低優(yōu)先權(quán)的CPU, DM則指示采用物理目標(biāo)模式或者邏輯目標(biāo)模式。

在數(shù)據(jù)部分,觸發(fā)模式有邊沿觸發(fā)和電平觸發(fā)兩種,后者又分高電平有效和低電平有效。提交模式分為固定、最低優(yōu)先級、SMI、NMI、INIT、ExtINT等幾種。

3 IO APIC

IO APIC用來替代傳統(tǒng)的8259中斷控制器,一般集成在ICH芯片組中。

ICHI/O controller hub意思是“輸入/輸出控制器中心”,負(fù)責(zé)連接PCI總線,IDE設(shè)備,I/O設(shè)備等,是英特爾的南橋芯片系列名稱。

表7中列出了IO APIC管理下每個中斷源對應(yīng)的中斷向量。

image.png
表七:每個中斷源對應(yīng)的中斷向量

和8259相比,IO APIC能支持24個中斷源,不需要中斷應(yīng)答周期,可以將中斷請求發(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默認(rèn)映射到物理地址FEC00000H。IO APIC一共有4個寄存器地址,見表8。

image.png
表八:IO APIC的寄存器

一共有64個32位內(nèi)部寄存器,其索引為0~63。內(nèi)部寄存器索引見表9。

image.png
表九:IO APIC內(nèi)部寄存器

  • (2)重定向表

中斷重定向表中的每一項都有可以被單獨編程,用來指明中斷向量和優(yōu)先級、目標(biāo)處理器及選擇處理器的方式。

重定向表中的信息用于把每個外部IRQ信號轉(zhuǎn)換為一條消息,然后通過APIC總線把消息發(fā)送給一個或者多個本地APIC單元。

重定向表的格式如圖33所示。

image.png
表十:重定向表

目標(biāo)ID確定哪一個(組)CPU處理這個中斷。目標(biāo)模式等于0時,即物理目標(biāo)模式,目標(biāo)ID的第59~56位表示某一個CPU的APIC ID;等于1時,即邏輯目標(biāo)模式,目標(biāo)ID的第53~56位與CPU中的邏輯APIC標(biāo)識匹配,確定目標(biāo)。

向CPU發(fā)送中斷時,擴(kuò)展目標(biāo)ID(8位)被放置在地址的第11~4位。地址格式如上圖所示。

屏蔽位等于1時,這個中斷不會向CPU發(fā)送。觸發(fā)模式分為邊沿觸發(fā)(D15=0)和電平觸發(fā)(D15=1)兩種,后者又分高電平有效(D13=0)和低電平有效(D13=1)。

在電平觸發(fā)時,遠(yuǎn)程IRR位有效。等于1時,表示CPU的本地APIC已接受此中斷,收到本地APIC發(fā)送的EOI后,將此位清0。相對于本地APIC和CPU核心而言,IO APIC和本地APIC之間的傳遞是遠(yuǎn)程的。

提交狀態(tài)等于1時,表示中斷消息已產(chǎn)生,但還沒有發(fā)送給本地APIC。提交模式分為固定(000B)、最低優(yōu)先級(001B)、SMI(010B)、NMI(100B)、INIT (101B)、ExtINT(111B)等幾種。

最低優(yōu)先級表示把這個中斷按照目標(biāo)ID提交給PPR最低的CPU。重定向表的第7~0位表示該中斷對應(yīng)的中斷向量號,在表7中列出了某系統(tǒng)中各個IRQ對應(yīng)的中斷向量號。

以上就是對x86的中斷有了一個簡單的了解,后續(xù)我們接著來看看ARM的GIC。

這個名稱的由來,是由于繪制架構(gòu)圖時所派生出來的稱呼,第一次被提到這名詞時是在1991年采用PCl Local Bus架構(gòu)時。在IntelPCl規(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部分,被散熱片覆蓋的大的那塊芯片,主要功能是負(fù)責(zé)控制、連接和處理CPU與內(nèi)存、與南橋通信。北橋芯片是主板的關(guān)鍵芯片,負(fù)責(zé)管理二級高速緩存,內(nèi)存的類型和最大容量都由它決定,所以一般主板命名都是用北橋芯片的型號。有一些北橋會集成內(nèi)置顯示核心(如Intel GMA),也支持AGPPCl Express接口。集成顯示核心的北橋若偵測到已安裝的PCle/AGP顯卡,會停止其GPU功能,但有些北橋可以允許同時使用集成式顯卡和安裝外加顯卡,作為多顯示輸出。英特爾在第一代Core i7中把存儲器控制器集成到了CPU,北橋的功能只剩下連接高速設(shè)備(如顯卡),此時Intel的南橋稱為IOH (Io Controller Hub)。從LGA 1156LGA 2011開始,Intel處理器集成了北橋(存儲器控制器、高速PCl Express控制器和Intel HDGraphics),主板上只剩下南橋,Intel將其稱為平臺路徑控制器(PCH)。

image.png

4、APIC與8259A

APIC全稱是Advanced Programmable Interrupt Controller,高級可編程中斷控制器。

它是在奔騰P54C之后被引入進(jìn)來的。在現(xiàn)在的計算機(jī)它通常由兩個部分組成,分別為LAPIC(Local APIC,本地高級可編程中斷控制器)和IOAPIC(I/O高級可編程中斷控制器)。

LAPIC在CPU中,IOAPIC通常位于南橋 。

APIC是在PIC (Programmable Interrupt Controller) 的基礎(chǔ)上發(fā)展而來的。

在傳統(tǒng)的單處理器的PC-AT 兼容的機(jī)器,通常使用8259A雙片級聯(lián)組成Legacy中斷控制器(如下圖所示)。一共可以連接15個設(shè)備(有一個管腳被用于串聯(lián)另一片8259)。PIC的優(yōu)先級規(guī)則比較簡單,0號管腳的優(yōu)先級最高。

PIC可以通過ICW(Initialization CommandWord)編程設(shè)置起始的Vector號。

image.png

PIC在單個CPU的環(huán)境下工作的挺好,可是當(dāng)系統(tǒng)越來越復(fù)雜出現(xiàn)了多個CPU的情況,它就沒法很好的工作了。這種情況下所有的中斷都會丟給主8259連接的那個CPU,那么這個CPU就要處理所有的中斷,性能上就會有影響。在一個多處理器的系統(tǒng),任何一個CPU都應(yīng)該能夠響應(yīng)來自任何設(shè)備的中斷,這種就是所謂的對稱式多重處理(Symmetric Multiprocessing)

image.png

IOAPIC: IOAPIC的主要作用是中斷的分發(fā)。最初有一條專門的APIC總線用于IOAPIC和LAPIC通信,在Pentium4 和Xeon 系列CPU出現(xiàn)后,他們的通信被合并到系統(tǒng)總線中。

image.png

Virtual Wire Mode:虛擬接線模式,該模式主要是為了向前兼容,可以理解為就是PIC。在這種模式下,IOAPIC會把8259A的模擬硬件產(chǎn)生的中斷信號直接送給BSP。

image.png

如上圖所示,每個CPU/Core中都有一個LAPIC。相比較于IOAPIC, LAPIC會更復(fù)雜一些,它不僅能夠處理來自IOAPIC的中斷消息,它還可以處理IPI(Inter-Processor Interrupt Messages),NMI,SMI和Init消息。

LAPIC 默認(rèn)使用基地址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軟件寫入表示中斷處理完成。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19048

    瀏覽量

    228540
  • 溫度傳感器
    +關(guān)注

    關(guān)注

    48

    文章

    2885

    瀏覽量

    155666
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5275

    瀏覽量

    119678
  • 中斷控制器
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    9426
  • DCR
    DCR
    +關(guān)注

    關(guān)注

    1

    文章

    54

    瀏覽量

    18783
收藏 人收藏

    評論

    相關(guān)推薦

    8259A芯片是一種什么類型的芯片?硬件看中斷8259A

    中斷控制過程中,中斷源的識別和優(yōu)先權(quán)的確定可以用硬件排隊電路等實現(xiàn), **Intel 8259A可編程中斷控制器就是為完成這些任務(wù)而設(shè)計的一種器件** 。
    的頭像 發(fā)表于 08-04 17:17 ?5381次閱讀
    8259A芯片是一種什么類型的芯片?<b class='flag-5'>從</b><b class='flag-5'>硬件</b><b class='flag-5'>看中斷</b><b class='flag-5'>之</b>8259A

    硬件看什么是中斷?硬件看中斷8088

    所謂中斷,是指CPU在正常運行程序時,由程序預(yù)先安排好的事件,或者由內(nèi)、外部事件引起CPU中斷正在運行的程序,而轉(zhuǎn)到為預(yù)先安排的事件或內(nèi)、外部事件服務(wù)的程序中去。
    的頭像 發(fā)表于 08-04 17:37 ?4352次閱讀
    <b class='flag-5'>從</b><b class='flag-5'>硬件</b>看什么是<b class='flag-5'>中斷</b>?<b class='flag-5'>從</b><b class='flag-5'>硬件</b><b class='flag-5'>看中斷</b><b class='flag-5'>之</b>8088

    干貨!Android藍(lán)牙驅(qū)動開發(fā)經(jīng)驗

    干貨!Android藍(lán)牙驅(qū)動開發(fā)經(jīng)驗?zāi)夸浺?Bluetooth基本概念1二 Android Bluetooth架構(gòu)12.1 Bluetooth架構(gòu)圖12.2 Bluetooth代碼層次結(jié)構(gòu)3三
    發(fā)表于 02-29 15:53

    如何在linux下查看中斷請求記錄

    linux下查看中斷請求記錄。通過cpu的中斷請求的響應(yīng),可以看出cpu都在為哪些設(shè)備干活,干的活有多少量等信息。
    發(fā)表于 07-23 06:06

    干貨!Linux中斷響應(yīng)流程

    Linux系統(tǒng)中的中斷響應(yīng)是怎樣的流程嗎? Linux的中斷響應(yīng)流程如下 1.硬件觸發(fā)中斷外部硬件設(shè)備(例如網(wǎng)卡、鍵盤等)向處理器發(fā)送
    發(fā)表于 08-29 14:57

    Windows環(huán)境下硬件中斷的性能分析

    分析了32 位 Windows 系統(tǒng)實現(xiàn)硬件中斷服務(wù)的內(nèi)部機(jī)理和系統(tǒng)對中斷信號的響應(yīng)性能,通過比較多種測試環(huán)境下得到的中斷延時,討論了中斷
    發(fā)表于 06-27 10:57 ?26次下載

    基于APIC時鐘的嵌入式Linux內(nèi)核實時化研究

    本文采用APIC時鐘修改的方法對Linux內(nèi)核進(jìn)行實時化改造,修改APIC中斷函數(shù),將APIC中斷和8254
    發(fā)表于 04-25 09:43 ?915次閱讀
    基于<b class='flag-5'>APIC</b>時鐘的嵌入式Linux內(nèi)核實時化研究

    一個關(guān)于Linux中斷的問題:硬件處理,初始化和中斷處理

    I/O APIC 每個I/O APIC提供24個管腳,能夠和外部設(shè)備的中斷線連接,每個管腳都可以通過配RTE(Redirection table entry)配置對應(yīng)的vector。其功能是:把
    的頭像 發(fā)表于 08-09 17:16 ?8188次閱讀
    一個關(guān)于Linux<b class='flag-5'>中斷</b>的問題:<b class='flag-5'>硬件</b>處理,初始化和<b class='flag-5'>中斷</b>處理

    linux中斷處理IRQ中斷

    在前一個專題里曾分析過所有IRQ中斷處理流程,經(jīng)過SAVE_ALL保存硬件環(huán)境后,都會進(jìn)入do_IRQ()進(jìn)行處理,今天接著分析do_IRQ()處理的相關(guān)東西.分為兩部中斷處理程序與軟中斷
    發(fā)表于 05-10 10:57 ?2556次閱讀

    實際中斷處理

    中斷處理處理外界發(fā)出的信號。中斷信號可能是關(guān)于數(shù)據(jù)讀寫操作的,也可能與外部設(shè)備控制有關(guān)。Intel處理器只有一個外部中斷引腳INTR,為了使處理器能夠同時接收多個硬件設(shè)備發(fā)送來的
    發(fā)表于 12-17 18:44 ?7次下載
    實際<b class='flag-5'>中斷</b>處理

    STM32FreeRTOS:(一) 中斷配置和臨界段的使用

    STM32FreeRTOS:(一) 中斷配置和臨界段的使用文章目錄STM32FreeRTOS:(一) 中斷配置和臨界段的使用前言 一、stm32的NVIC 分組配置二、FreeRT
    發(fā)表于 01-14 15:43 ?3次下載
    STM32<b class='flag-5'>之</b>FreeRTOS:(一) <b class='flag-5'>中斷</b>配置和臨界段的使用

    硬件中斷OB的功能

    硬件中斷 OB 在發(fā)生相關(guān)硬件事件時執(zhí)行,可以快速的響應(yīng)并執(zhí)行硬件中斷 OB 中的程序(例如立即停止某些關(guān)鍵設(shè)備)。
    的頭像 發(fā)表于 02-12 11:44 ?2387次閱讀

    硬件中斷事件的示例

    根據(jù)硬件中斷模塊觸發(fā)的示例來說明 S7-1500 CPU 中面向事件的程序執(zhí)行的功能原理。
    的頭像 發(fā)表于 08-29 09:45 ?988次閱讀
    <b class='flag-5'>硬件</b><b class='flag-5'>中斷</b>事件的示例

    軟件中斷硬件中斷的區(qū)別

    的理論知識。 硬件中斷硬件中斷是由某些硬件設(shè)備引起的,例如啟動 I/O 的請求、硬件故障或類
    的頭像 發(fā)表于 11-07 16:52 ?952次閱讀
    軟件<b class='flag-5'>中斷</b>與<b class='flag-5'>硬件</b><b class='flag-5'>中斷</b>的區(qū)別

    CPU中斷程序:硬件看什么是中斷?

    CPU響應(yīng)中斷轉(zhuǎn)去執(zhí)行中斷服務(wù)程序前,需要把被中斷程序的現(xiàn)場信息保存起來,以便執(zhí)行完中斷服務(wù)程序后,接著
    發(fā)表于 03-26 11:36 ?2491次閱讀
    CPU<b class='flag-5'>中斷</b>程序:<b class='flag-5'>從</b><b class='flag-5'>硬件</b>看什么是<b class='flag-5'>中斷</b>?