中斷是指計算機運行過程中,出現(xiàn)某些意外情況需主機干預(yù)時,機器能自動停止正在運行的程序并轉(zhuǎn)入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續(xù)運行。
中斷的幾個主要目的。第一,通過中斷可以提高CPU效率。假設(shè)一種場景,CPU通知其它設(shè)備完成某項工作,當(dāng)設(shè)備完成任務(wù)后,CPU如何知道呢?一種方式是設(shè)備標(biāo)記狀態(tài)寄存器,等待CPU來查詢,這種做法弊端是程序員在編寫程序時不能確切知道設(shè)備完成任務(wù)所需的時間,也就是說需要定時去查詢設(shè)備的狀態(tài)。
我們知道,現(xiàn)代CPU一般頻率很高,如果去頻繁查詢外部設(shè)備,尤其是低速設(shè)備,必將浪費很多的CPU資源;如果查詢的時間間隔長,那么外設(shè)的利用率就不高。有一種解決辦法,那就是外設(shè)處理完任務(wù),主動告訴CPU,從而省去了CPU的查詢開銷。
中斷的第二個用途是,可以維護(hù)系統(tǒng)正常運行?,F(xiàn)代的操作系統(tǒng)都是多任務(wù)系統(tǒng),表面看起來多個程序在并行,實際上真正的CPU是分時復(fù)用的(假設(shè)最簡單的單核單線程),并不是真的并行。如果這時有一個惡意程序,一直霸占CPU資源不釋放,是不是整個系統(tǒng)就會掛死呢?答案是并不會,因為CPU的分配是由操作系統(tǒng)負(fù)責(zé)完成的,原理就是通過中斷把控制權(quán)從程序手中交還給操作系統(tǒng)。另外,CPU訪問內(nèi)存或其它設(shè)備時,也可能發(fā)生一些錯誤。對于不同錯誤有不同的處理方式,也可以通過中斷來完成。
對于一些特定的應(yīng)用場景,設(shè)備系統(tǒng)需要滿足實時性。所謂實時性,就是要求系統(tǒng)在規(guī)定的或者可預(yù)期的時間內(nèi)作出反應(yīng)。此類需求也可以通過中斷來滿足。
還記得前面講ARM異常時的概念嗎?中斷算一種異步異常,《ARM系列 -- 異常和特權(quán)》。A系列處理器提供四個管腳來實現(xiàn)中斷,分別是:
nIRQ:物理普通中斷
nFIQ:物理快速中斷
nVIRQ:虛擬普通中斷
nVFIQ:虛擬快速中斷
如下圖所示:
其中虛擬中斷是為了實現(xiàn)虛擬化而準(zhǔn)備的,這部分留待以后講虛擬化時再說。我們只看物理中斷。
在開始介紹中斷概念時,我們說中斷可能會有很多種,每個設(shè)備都可能要發(fā)中斷,而ARM處理器只有兩個管腳,那怎么辦?這時,就需要有一個模塊來收集所有的中斷,然后轉(zhuǎn)發(fā)給處理器。在ARM的體系中,這個模塊就是通用中斷處理器(generic interrupt controller,以下簡稱GIC)。
類似ARM的處理器,GIC有架構(gòu)和實現(xiàn)之分。GIC的架構(gòu)經(jīng)歷了GICv1,GICv2,GICv3和GICv4。每個架構(gòu)下有有對應(yīng)的設(shè)計實現(xiàn),比如GIC-600就是支持GICv3架構(gòu)的最新IP。
在介紹GIC-600之前,有必要先講一下中斷的一些基本概念。首先,中斷是分優(yōu)先級的。很多個設(shè)備同時發(fā)送中斷,處理器必須遵守一定的規(guī)則來給所有中斷排序,從而決定先響應(yīng)哪個。這個規(guī)則就是中斷優(yōu)先級,操作系統(tǒng)需要維護(hù)中斷處理器中的優(yōu)先級寄存器。
既然有了優(yōu)先級,就有了中斷嵌套。當(dāng)處理器處理某個低優(yōu)先級的中斷時,來了一個高優(yōu)先級的中斷,CPU可以保留低優(yōu)先級的中斷處理現(xiàn)場,轉(zhuǎn)而處理高優(yōu)先級中斷,待高優(yōu)先級處理完再繼續(xù)處理低優(yōu)先級中斷。如果CPU在某段時間內(nèi),選擇不響應(yīng)某設(shè)備,其中斷也可以被屏蔽。
在ARM體系中,對于每個中斷,有四個狀態(tài):
pending:中斷處于有效狀態(tài),但是CPU沒有響應(yīng)該中斷
active:中斷處于有效狀態(tài),CPU在響應(yīng)該中斷
active and pending:CPU在響應(yīng)該中斷,但是該中斷源又發(fā)送中斷過來
在ARM體系中,中斷分為以下幾個類型(不討論虛擬中斷):
PPI:(Private Peripheral Interrupt,私有外設(shè)中斷),該中斷來源于core,但是該中斷只對指定的core有效,所謂的私有即指對core私有;
SPI:(Shared Peripheral Interrupt,共享外設(shè)中斷),該中斷來源于外部設(shè)備,該中斷可以對所有的core有效;
SGI:(Software Generated Interrupt,軟件中斷),用于給其它的core發(fā)送中斷信號;
LPI:(Locality-specific Peripheral Interrupt,特定局部外設(shè)中斷),是一種基于消息的邊沿中斷。
ARM又為每種中斷分配了中斷號,用以區(qū)分,其中1020-1023是特殊的中斷號。
圖1GICv3中斷號分配
對于每個中斷,從產(chǎn)生到處理再到結(jié)束,是有一個完整的生命周期的。
圖2 物理中斷生命周期
generate:外設(shè)或軟件發(fā)起一個中斷
distribute:中斷經(jīng)過分組,優(yōu)先級仲裁等,發(fā)送給對應(yīng)的CPU interface
deliver:CPU interface將中斷發(fā)送給core
activate:當(dāng)CPU core開始響應(yīng)中斷,GIC將最高激活優(yōu)先級的中斷設(shè)置為激活
priority drop: core發(fā)信號給GIC,通知最高優(yōu)先級中斷,GIC可以重置優(yōu)先級
deactivation:清除中斷
這里要解釋一下CPU interface。前面也提到了,core提供給中斷的物理管腳只有兩個,中斷會有成百上千個,GIC怎么把這些中斷發(fā)送給core是一個問題。這時就需要CPU interface了。CPU interface將GIC發(fā)送的中斷信息,通過IRQ,F(xiàn)IQ管腳,發(fā)送給連接到core。CPU interface提供了以下的功能:
將中斷請求發(fā)送給core
中斷進(jìn)行認(rèn)可
中斷完成識別
設(shè)置中斷優(yōu)先級屏蔽
定義中斷搶占策略
決定當(dāng)前處于pending狀態(tài)最高優(yōu)先級中斷
在GICv3架構(gòu)中,CPU interface被抽離出來,實現(xiàn)在core內(nèi)部的。也就是說,在GIC-600中,是不包含CPU interface的。這樣做的好處是,可以減少中斷響應(yīng)的時間,并且減少系統(tǒng)總線的占用。對于眾核SoC設(shè)計來說,其物理設(shè)計非常大,CPU interface實現(xiàn)在core內(nèi)部,也就意味著某些中斷寄存器可以放在其內(nèi)部,這樣core就可以很快的訪問到這些寄存器了。
對于那些常用的寄存器,core不用跋山涉水的通過系統(tǒng)總線或片上網(wǎng)絡(luò)去頻繁訪問GIC了。CPU interface與GIC之間,是通過專用的AXI-stream總線來傳輸信息的。
審核編輯:劉清
-
ARM
+關(guān)注
關(guān)注
134文章
9121瀏覽量
368246 -
寄存器
+關(guān)注
關(guān)注
31文章
5359瀏覽量
120803 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41593 -
FIQ
+關(guān)注
關(guān)注
0文章
9瀏覽量
2312
原文標(biāo)題:技術(shù)分享 | 系列 -- 中斷(一)
文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論