接下來(lái)該看redistributor了。
圖1 GIC-600 redistributor
跟distributor連接的部分就不說(shuō)了。Cpu\_active是指示cluster或core的狀態(tài),可以用于idle管理。ppi\_id用于多核設(shè)計(jì)時(shí),區(qū)分每個(gè)redistributor。PPIs就是PPI中斷線,在GIC-600是這么描述PPI的:
圖2 PPI描述
從上面可以看出來(lái),所謂的“私有”是說(shuō)這些中斷信號(hào)是core專(zhuān)有的。對(duì)于PPI,ARMv8定義了三種規(guī)格,8,12和16。所以對(duì)于不同的core來(lái)說(shuō),可能PPI數(shù)量不一樣。
圖3Generic timer
上面是ARMv8-A的架構(gòu)spec里,關(guān)于timer的圖。我們可以看到,core的timer會(huì)發(fā)PPI,而中斷控制器返回FIQ或者IRQ給core。細(xì)心的同學(xué)可能會(huì)問(wèn)了,在redistributor上面沒(méi)有FIQ和IRQ的信號(hào)啊?其實(shí)在第一篇文章里就說(shuō)了,在現(xiàn)有的GICv3架構(gòu)下,關(guān)于中斷FIQ和IRQ,以及系統(tǒng)寄存器等放在了cluster/core端,對(duì)外留出了一組接口,叫cpu interface(在GICv2中實(shí)現(xiàn)在中斷控制器這一側(cè)),也就是圖1中最下面的接口。其實(shí)這是一組簡(jiǎn)化的AXI4-Stream。
圖4 GIC stream協(xié)議接口
由于是雙向,所以是兩組信號(hào)
圖5redistributor到CPU的信號(hào)
圖6 CPU到redistributor的信號(hào)
既然是簡(jiǎn)化的總線協(xié)議,為了更便于CPU和redistributor通信,ARM又規(guī)定了具體的數(shù)據(jù)包格式。下圖是CPU端發(fā)出的命令格式,具體的解釋請(qǐng)查閱GICv3的文檔,此處就不過(guò)多的貼圖了。
圖7 CPU interface命令
至此,就剩下最復(fù)雜的ITS了,這一部分是為了實(shí)現(xiàn)基于消息的中斷。前面介紹過(guò),LPI是一種基于消息的中斷。也就是中斷信息不在通過(guò)中斷線進(jìn)行傳遞。ITS就是要將接收到的LPI中斷進(jìn)行解析。
圖8 GIC-600的ITS組件
既然是信息中斷,就一定要有區(qū)分這些中斷的方法,這樣才能找到合適的中斷處理對(duì)策。所以這里有兩個(gè)概念。
EventID,用來(lái)表示外設(shè)發(fā)送中斷的事件類(lèi)型
DeviceID,用來(lái)表示哪一個(gè)外設(shè)發(fā)起LPI
而ITS需要將外設(shè)發(fā)送的DeviceID,eventID,通過(guò)一系列查表,得到LPI的中斷號(hào),再使用LPI中斷號(hào)查表得到該中斷的目標(biāo)CPU。為此,ITS需要維護(hù)幾張表,分別是device table,interrupt translation tableh和collection。
圖9 ITS表
當(dāng)外設(shè)寫(xiě)GITS\_TRANSLATER寄存器,產(chǎn)生了LPI。這時(shí)ITS首先要拿著DeviceID,從device table中選擇索引為DeviceID的表項(xiàng)。從該表項(xiàng)中,得到interrupt translation table的位置;然后再根據(jù)EventID,從interrupt translation table中選擇索引為EventID的表項(xiàng)。得到中斷號(hào),以及中斷所屬的collection號(hào);最后,使用collection號(hào),從collection table中,選擇索引為collection號(hào)的表項(xiàng)。得到redistributor的映射信息,最后根據(jù)collection表項(xiàng)的映射信息,將中斷信息路由發(fā)送給對(duì)應(yīng)的redistributor。
最后,提一句,GICv3中開(kāi)始支持親和性路由(affinity routing)。請(qǐng)?jiān)徫彝迭c(diǎn)懶,直接把文檔中的部分貼出來(lái):
這里要解釋一下什么是親和性,我最初接觸這個(gè)概念的時(shí)候簡(jiǎn)直是一頭霧水,直到有一天看操作系統(tǒng)相關(guān)的書(shū)才明白是咋回事(忽略我的無(wú)知吧~~)。CPU親和性是一種調(diào)度屬性(scheduler property),Linux調(diào)度器會(huì)根據(jù)affinity的設(shè)置讓指定的進(jìn)程運(yùn)行在"綁定"的CPU上,而不會(huì)在別的CPU上運(yùn)行。其中有一個(gè)好處是,可以提高cache的命中率。當(dāng)一個(gè)進(jìn)程在某個(gè)CPU上運(yùn)行時(shí),會(huì)在該CPU的緩存中維護(hù)許多狀態(tài)。下次該進(jìn)程在相同的CPU上運(yùn)行時(shí),由于緩存中的數(shù)據(jù)而執(zhí)行的更快。
因此,多處理器的調(diào)度器應(yīng)該考慮這種親和性,盡可能的進(jìn)程保持在同一個(gè)CPU上。同理,對(duì)于并發(fā)程序也是有好處的。感慨一下,做CPU設(shè)計(jì),到了最后肯定要與操作系統(tǒng)相愛(ài)相殺,哈哈哈~~~
審核編輯:劉清
-
ARM
+關(guān)注
關(guān)注
134文章
9107瀏覽量
367985 -
寄存器
+關(guān)注
關(guān)注
31文章
5357瀏覽量
120657 -
中斷
+關(guān)注
關(guān)注
5文章
899瀏覽量
41550 -
gic
+關(guān)注
關(guān)注
0文章
14瀏覽量
6277 -
FIQ
+關(guān)注
關(guān)注
0文章
9瀏覽量
2311
原文標(biāo)題:技術(shù)分享 | ARM系列 -- 中斷(三)
文章出處:【微信號(hào):Ithingedu,微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論