www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > strongerHuang
[導(dǎo)讀]Linux中斷管理機(jī)制GIC硬件原理GIC,GenericInterruptController。是ARM公司提供的一個(gè)通用的中斷控制器。主要作用為:接受硬件中斷信號,并經(jīng)過一定處理后,分發(fā)給對應(yīng)的CPU進(jìn)行處理。當(dāng)前GIC有四個(gè)版本,GICv1~v4,本文主要介紹GICv3控制...

Linux 中斷管理機(jī)制

GIC 硬件原理

GIC,Generic Interrupt Controller。是ARM公司提供的一個(gè)通用的中斷控制器。主要作用為:接受硬件中斷信號,并經(jīng)過一定處理后,分發(fā)給對應(yīng)的CPU進(jìn)行處理。

當(dāng)前GIC 有四個(gè)版本,GIC v1~v4, 本文主要介紹GIC v3控制器。

GIC v3中斷類別

GICv3定義了以下中斷類型:

  • SGI (Software Generated Interrupt):軟件觸發(fā)的中斷。軟件可以通過寫 GICD_SGIR 寄存器來觸發(fā)一個(gè)中斷事件,一般用于核間通信,內(nèi)核中的 IPI:inter-processor interrupts 就是基于 SGI。
  • PPI (Private Peripheral Interrupt):私有外設(shè)中斷。這是每個(gè)核心私有的中斷。PPI會(huì)送達(dá)到指定的CPU上,應(yīng)用場景有CPU本地時(shí)鐘。
  • SPI (Shared Peripheral Interrupt):公用的外部設(shè)備中斷,也定義為共享中斷。中斷產(chǎn)生后,可以分發(fā)到某一個(gè)CPU上。比如按鍵觸發(fā)一個(gè)中斷,手機(jī)觸摸屏觸發(fā)的中斷。
  • LPI (Locality-specific Peripheral Interrupt):LPI 是 GICv3 中的新特性,它們在很多方面與其他類型的中斷不同。LPI 始終是基于消息的中斷,它們的配置保存在表中而不是寄存器。比如 PCIe 的 MSI/MSI-x 中斷。
中斷類型硬件中斷號
SGI0-15
PPI16-31
SPI32-1019
reserved......
LPI8192-MAX

GIC v3 組成

GICv3 控制器由以下三部分組成:

  • Distributor:SPI 中斷的管理,將中斷發(fā)送給 Redistributor
  1. 打開或關(guān)閉每個(gè)中斷。Distributor對中斷的控制分成兩個(gè)級別。一個(gè)是全局中斷的控制(GIC_DIST_CTRL)。一旦關(guān)閉了全局的中斷,那么任何的中斷源產(chǎn)生的中斷事件都不會(huì)被傳遞到 CPU interface。另外一個(gè)級別是對針對各個(gè)中斷源進(jìn)行控制(GIC_DIST_ENABLE_CLEAR),關(guān)閉某一個(gè)中斷源會(huì)導(dǎo)致該中斷事件不會(huì)分發(fā)到 CPU interface,但不影響其他中斷源產(chǎn)生中斷事件的分發(fā)。
  2. 控制將當(dāng)前優(yōu)先級最高的中斷事件分發(fā)到一個(gè)或者一組 CPU interface。當(dāng)一個(gè)中斷事件分發(fā)到多個(gè) CPU interface 的時(shí)候,GIC 的內(nèi)部邏輯應(yīng)該保證只 assert 一個(gè)CPU。
  3. 優(yōu)先級控制。
  4. interrupt屬性設(shè)定。設(shè)置每個(gè)外設(shè)中斷的觸發(fā)方式:電平觸發(fā)、邊緣觸發(fā);
  5. interrupt group的設(shè)定。設(shè)置每個(gè)中斷的 Group,其中 Group0 用于安全中斷,支持 FIQ 和 IRQ,Group1 用于非安全中斷,只支持 IRQ;
  • Redistributor:SGI,PPI,LPI 中斷的管理,將中斷發(fā)送給 CPU interface
  1. 啟用和禁用 SGI 和 PPI。
  2. 設(shè)置 SGI 和 PPI 的優(yōu)先級。
  3. 將每個(gè) PPI 設(shè)置為電平觸發(fā)或邊緣觸發(fā)。
  4. 將每個(gè) SGI 和 PPI 分配給中斷組。
  5. 控制 SGI 和 PPI 的狀態(tài)。
  6. 內(nèi)存中數(shù)據(jù)結(jié)構(gòu)的基址控制,支持 LPI 的相關(guān)中斷屬性和掛起狀態(tài)。
  7. 電源管理支持。
  • CPU interface:傳輸中斷給 Core
  1. 打開或關(guān)閉 CPU interface 向連接的 CPU assert 中斷事件。對于 ARM,CPU interface 和 CPU 之間的中斷信號線是 nIRQCPU 和 nFIQCPU。如果關(guān)閉了中斷,即便是 Distributor 分發(fā)了一個(gè)中斷事件到 CPU interface,也不會(huì) assert 指定的 nIRQ 或者 nFIQ 通知 Core。
  2. 中斷的確認(rèn)。Core 會(huì)向 CPU interface 應(yīng)答中斷(應(yīng)答當(dāng)前優(yōu)先級最高的那個(gè)中斷),中斷一旦被應(yīng)答,Distributor 就會(huì)把該中斷的狀態(tài)從 pending 修改成 active 或者 pending and active(這是和該中斷源的信號有關(guān),例如如果是電平中斷并且保持了該 asserted 電平,那么就是 pending and active)。ack 了中斷之后,CPU interface 就會(huì) deassert nIRQCPU 和 nFIQCPU 信號線。
  3. 中斷處理完畢的通知。當(dāng) interrupt handler 處理完了一個(gè)中斷的時(shí)候,會(huì)向?qū)?CPU interface 的寄存器通知 GIC CPU 已經(jīng)處理完該中斷。做這個(gè)動(dòng)作一方面是通知 Distributor 將中斷狀態(tài)修改為 deactive,另外一方面,CPU interface 會(huì) priority drop,從而允許其他的 pending 的中斷向 CPU 提交。
  4. 為 CPU 設(shè)置中斷優(yōu)先級掩碼。通過 priority mask,可以 mask 掉一些優(yōu)先級比較低的中斷,這些中斷不會(huì)通知到 CPU。
  5. 設(shè)置 CPU 的中斷搶占(preemption)策略。
  6. 在多個(gè)中斷事件同時(shí)到來的時(shí)候,選擇一個(gè)優(yōu)先級最高的通知 CPU。
GICv3 控制器內(nèi)部模塊和各中斷類型的關(guān)系如下圖所示:

中斷路由

GICv3 使用 hierarchy 來標(biāo)識(shí)一個(gè)具體的 core, 如下圖是一個(gè)四層的結(jié)構(gòu)(aarch64):

用 ... 的形式組成一個(gè) PE 的路由。每一個(gè) core 的 affnity 值可以通過 MPDIR_EL1 寄存器獲取, 每一個(gè) affinity 占用8bit。配置對應(yīng) core 的 MPIDR 值,可以將中斷路由到該 core 上。

各個(gè) affinity 的定義是根據(jù) SOC 自己的定義,比如:

.?..
...
中斷親和性的設(shè)置的通用函數(shù)為 irq_set_affinity,后面會(huì)做詳細(xì)介紹。

中斷狀態(tài)機(jī)

中斷處理的狀態(tài)機(jī)如下圖:

  • Inactive:無中斷狀態(tài),即沒有 Pending 也沒有 Active。
  • Pending:硬件或軟件觸發(fā)了中斷,該中斷事件已經(jīng)通過硬件信號通知到 GIC,等待 GIC 分配的那個(gè) CPU 進(jìn)行處理,在電平觸發(fā)模式下,產(chǎn)生中斷的同時(shí)保持 Pending 狀態(tài)。
  • Active:CPU 已經(jīng)應(yīng)答(acknowledge)了該中斷請求,并且正在處理中。
  • Active and pending:當(dāng)一個(gè)中斷源處于 Active 狀態(tài)的時(shí)候,同一中斷源又觸發(fā)了中斷,進(jìn)入 pending 狀態(tài)。

中斷處理流程

  1. 外設(shè)發(fā)起中斷,發(fā)送給 Distributor
  2. Distributor 將該中斷,分發(fā)給合適的 Redistributor
  3. Redistributor 將中斷信息,發(fā)送給 CPU interface
  4. CPU interface 產(chǎn)生合適的中斷異常給處理器
  5. 處理器接收該異常,并且軟件處理該中斷

GIC 驅(qū)動(dòng)

這里主要分析 linux kernel 中 GIC v3 中斷控制器的代碼(drivers/irqchip/irq-gic-v3.c)。

設(shè)備樹

先來看下一個(gè)中斷控制器的設(shè)備樹信息:

gic:?interrupt-controller@51a00000?{
????????compatible?=?"arm,gic-v3";
????????reg?=?<0x0?0x51a00000?0?0x10000>,?/*?GIC?Dist?*/
??????????????<0x0?0x51b00000?0?0xC0000>,?/*?GICR?*/
??????????????<0x0?0x52000000?0?0x2000>,??/*?GICC?*/
??????????????<0x0?0x52010000?0?0x1000>,??/*?GICH?*/
??????????????<0x0?0x52020000?0?0x20000>;?/*?GICV?*/
????????#interrupt-cells?=?<3>;
????????interrupt-controller;
????????interrupts?=?9
????????????????(GIC_CPU_MASK_SIMPLE(6)?|?IRQ_TYPE_LEVEL_HIGH)>;
????????interrupt-parent?=?<
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉