91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

openEuler Kernel技術內核中斷子系統介紹

openEuler ? 來源:openEuler ? 作者:openEuler ? 2022-04-20 09:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

很多人在學習中斷子系統的過程中,在對基本概念與整體不太了解的情況下,過早的陷入了各種架構的實現細節,如同盲人摸象。這里主要給大家明確中斷的各個基本概念,希望從這個角度能讓大家更好的理解中斷子系統。

什么是中斷

在計算機科學中,中斷(英語:Interrupt)是指處理器接收到來自硬件或軟件的信號,提示發生了某個事件,應該被注意,這種情況就稱為中斷。中斷子系統中的中斷指的是其中硬件的一方,后續中斷均按此理解。

中斷處理的參與對象和流程

中斷處理中有著多個對象的參與,理解每個對象在其中是如何參與是很重要的。以下列舉了中斷處理的參與對象。

中斷事件:指中斷事件本身的抽象。

中斷號:用于硬件和軟件識別并區分中斷事件,需要注意同一個中斷事件在中斷處理的不同階段未必是同一個中斷號。

中斷源:有中斷事件需要 cpu 處理的硬件。

中斷控制器:非必須,用于解決系統擁有多中斷源場景的硬件;從中斷源接收中斷事件并傳遞到 cpu;可以級聯。

cpu:收到中斷,cpu 跳轉到特定的地址——中斷向量。由中斷向量開始軟件對中斷的處理。

中斷事件在硬件中的流程如下,上一行是中斷事件的體現形式,下一行是所在的硬件:

307ba222-c045-11ec-bce3-dac502259ad0.png

再把軟件處理結合起來,形成一個硬件軟件切換的過程:

30992400-c045-11ec-bce3-dac502259ad0.png

相鄰的中斷事件體現形式的映射方式可以在所在的對象的連接的實現中找到。

中斷子系統

現在把之前的流程具有的部分對比內核中斷子系統,可以發現還多出了一個通用中斷處理層。因為內核需要支持各種不同的架構與外設,需要解耦架構硬件相關部分(cpu 與中斷控制器)與非架構相關(外設),使得開發外設驅動并不需要了解架構相關部分。另一方面,系統硬件拓撲結構的信息一般由設備樹源碼 DTS 體現。

30abe1bc-c045-11ec-bce3-dac502259ad0.png

硬件封裝層

硬件封裝層包括 cpu 和中斷控制器兩部分。區分開 cpu 和中斷控制器相當重要,希望大家能更明確 cpu 和中斷控制器的概念。軟件在 cpu 方面主要需要按架構實現中斷向量的處理,可以看 arch/「/kernel/entry」.S 的匯編實現。另外還需要為通用的開關中斷方法提供架構實現:

通用中斷開關方法 具體架構中斷開關實現
local_irq_enable arch_local_irq_enable
local_irq_disable arch_local_irq_disable

這個 local 指的是 local_cpu,表示的是當前 cpu 是否響應中斷:當前 cpu 關中斷的情況下,中斷控制器不管怎么玩都是徒勞的。事實上 cpu 對中斷開關的實現還包含著很多條件,類似特權態、非屏蔽中斷 NMI 之類的,可以在后文找下具體分析。軟件對中斷控制器的抽象是 struct irq_chip,體現的是中斷控制器所具體的行為。這里列舉部分重要成員講解:

起因 struct irq_chip 成員 說明
怎么控制中斷控制器是否屏蔽某個中斷事件? irq_enable/ irq_disable
中斷控制器如何配置中斷事件的觸發方式 irq_set_type 控制各個中斷的電氣觸發條件,例如邊沿觸發或者是電平觸發。
中斷控制器如何得知中斷事件被 cpu 響應? irq_ack 中斷控制器在實現中會根據中斷事件被 cpu 開始響應或完成響應來決定該中斷事件類型是否會再度通知 cpu 處理。
中斷控制器如何得知 cpu 完成處理中斷事件? irq_eoi 中斷控制器在實現中會根據中斷事件被 cpu 開始響應或完成響應來決定該中斷事件類型是否會再度通知 cpu 處理。
在 smp 系統中,中斷事件應該通知哪個 cpu? irq_set_affinity affinity 表示了中斷事件在中斷控制器中配置的目標 cpu,根據具體實現可以是 1 個或多個。

此外,當多個中斷事件同時發生,中斷控制器會根據其優先級的實現來決定中斷事件通知給 cpu 的順序,某些實現是可配置的。另一方面,考慮到系統中可能存在多個中斷控制器,使得單一中斷控制器的中斷號不足以區分中斷事件,所以引入了軟件中斷號的概念。加上硬件中斷號映射中斷號的軟件抽象 struct irq_domain,再看中斷控制器軟件抽象到中斷源軟件抽象的流程:

30d10938-c045-11ec-bce3-dac502259ad0.png

##中斷流控處理層這一層主要是隱藏了中斷控制器在具體中斷事件處理函數調用前后的一些處理邏輯,包括:

何時對中斷控制器發出 ack 回應?

mask_irq 和 unmask_irq 的處理;

中斷控制器是否需要 eoi 回應?

何時打開 cpu 的本地 irq 中斷?以便允許 irq 的嵌套;

類似于在用洗衣機洗衣服的時候,我們不關心衣服可能要經歷過的洗滌多久、脫水多久、漂洗多久諸如此類的步驟細節,只需要按衣服類型選擇流程;內核引入中斷流程的抽象類型 irq_flow_handler_t 屏蔽了中斷事件相關的 cpu、中斷控制器和中斷源的屬性的不同帶來的處理流程差異。這里舉例部分內核實現:

handle_simple_irq:用于簡易流控處理。

handle_level_irq:用于電平觸發中斷的流控處理。

handle_edge_irq:用于邊沿觸發中斷的流控處理。

handle_fasteoi_irq:用于需要響應 eoi 的中斷控制器

handle_percpu_irq:用于只在單一 cpu 響應的中斷。

驅動程序 API 與中斷通用邏輯

對于中斷事件本身,內核使用 struct irq_desc 進行描述,它包含著所有的信息。而對于中斷控制器與中斷源的驅動來說,關注的信息都只是其中的一部分。中斷事件從中斷源到中斷控制器的映射的描述一般事先會靜態定義好并存放在設備樹源碼里,即中斷源的設備樹節點包含著相連的中斷控制器和中斷事件對應在中斷控制器中斷號的信息;而作為驅動程序需要對軟件中斷號 irq 和中斷事件處理函數建立映射。那么要把設備樹節點中的中斷控制器和中斷控制器中斷號轉換成軟件中斷號 irq,內核給驅動程序提供了接口

irq_of_parse_and_map:驅動由設備樹節點獲得 irq。

當中斷控制器和中斷控制器中斷號轉換成軟件中斷號 irq 映射不存在時,這個接口會申請 irq_desc 并建立映射,根據連接著的中斷控制器的驅動提供的硬件中斷號映射中斷號的軟件抽象 irq_domain 完成映射。在映射過程中會包括對 irq_desc 的一些屬性的設置,如:

irq_set_handler:驅動選擇 irq_flow_handler。

irq_set_chip:驅動選擇 irq 連接的中斷控制器。

irq_alloc_desc 系列:驅動直接申請 irq_desc。

中斷源驅動獲取到 irq,還需要將 irq 與中斷處理函數建立映射:

request_irq/request_threaded_irq:驅動將中斷處理函數注冊到 irq。

enable_irq & disable_irq:驅動開關 irq。

接下來將對一些具體的架構實現做介紹。這里介紹兩個處理器 armv8 和 x86,以及兩個中斷控制器 arm-gicv3 和 x86-APIC 的實現。希望幫助大家得出諸如“arm 內核有中斷嵌套嗎”“arm cpu eoi 是做什么”這類問題的答案。

armv8

arm 核心擁有 2 個外部中斷線,IRQ 和 FIQ;這兩根中斷線連接到中斷控制器上,中斷控制器通過拉高和拉低這兩根中斷線觸發中斷。一個中斷應該觸發 IRQ 還是 FIQ 中斷線,由其 GROUP 屬性和當前的特權級和安全域決定。

30e3b93e-c045-11ec-bce3-dac502259ad0.png

GROUP 的定義:

311a2032-c045-11ec-bce3-dac502259ad0.png

arm 核,軟件可以寫 SCR、HCR 和 PSTATE.DAIF 寄存器以決定響應中斷的特權級和屏蔽中斷;arm 不支持 NMI。arm 核由于中斷控制器的實現,同時只會有一個需要被響應的中斷,因此不限制 IRQ/FIQ 響應順序的實現。arm 核上處于觸發狀態的中斷線需要結合 SCR、HCR 和 PSTATE.DAIF 寄存器判斷是否觸發中斷,不論當前是否處于中斷。在中斷觸發時,arm 核心根據 VBAR 系列寄存器的基地址,會按具體情況選擇偏移跳轉到對應的地址。

312d13d6-c045-11ec-bce3-dac502259ad0.png

x86

Intel x86 架構提供 INTR 和 NMI 兩個中斷引腳,他們通常與 Local APIC 相連, 用于接收 Local APIC 傳遞的中斷信號。一個中斷應該觸發 INTR 還是 NMI 中斷線由 Local APIC 實現。

315d2ada-c045-11ec-bce3-dac502259ad0.png

x86,中斷都在 ring0 響應。x86 上軟件使用 CLI 指令將本 CPU 的 EFLAGS 寄存器的 IF 位清 0,阻止接收中斷;STI 指令將 IF 位置為 1,允許接收中斷。這兩條指令都只對當前 CPU 起作用,而不影響平臺上的其他 CPU。x86 中斷線的實現原生支持 NMI。x86 核上同時只會有一個需要被響應的中斷,它由 Local APIC 從 IRR 中選擇;當 Local APIC 不使能時,優先響應 NMI 中斷線。不論當前是否處于中斷,x86 核上若 INTR 處于觸發且未屏蔽中斷即會觸發中斷;NMI 處于觸發則直接觸發中斷。中斷觸發時,x86 核根據寄存器 IDTR 記錄的基址和中斷控制器的寄存器 ISR 提供的中斷向量號找到 IDT 表中對應的 Interrupt Gate 表項,跳轉到相應的地址。

arm-gicv3

31782344-c045-11ec-bce3-dac502259ad0.png

從邏輯視圖上看,gicv3 的核外部分統稱 IRI,由 Distributor、ITS、Redistributor 這 3 種組件組成;gicv3 核內部分是 CPU interface,PE 可以理解為 cpu;IRI 與 CPU interface 通過 GIC Stream Protocol interface 交互。

不同的中斷在 gic 上對應著不同的 INTID;gic 把中斷類型分為 LPI、PPI、SPI、SGI,約束 INTID 取值對應的中斷類型。SGI 指由 CPU 直接寫對應的寄存器觸發中斷;PPI 指中斷為特定一個 CPU 私有/專用,同一中斷號的 PPI 在不同 CPU 可以指不同的中斷源;SPI 對應 PPI,是所有 CPU 全局共享的,同一中斷號的 SPI 在不同 CPU 均指相同的中斷源;LPI 的區分是中斷路由上的不同,主要是在 IRI 中由 ITS 路由的中斷,其余 3 種中斷均不經過 ITS;某些實現下還有直接在 Redistributor 觸發的 LPI 中斷。

319b65c0-c045-11ec-bce3-dac502259ad0.png

31b4e522-c045-11ec-bce3-dac502259ad0.png

一個外部中斷從在外設上產生,依次經過 IRI、CPU interface 并最終通過中斷線到達 PE;PE 產生的中斷需要先經過 CPU interface 到 IRI,再到目標的 CPU interface 和 PE。邏輯上,IRI 可以對應多個 PE,因此對于需要被一個特定目標 PE 響應的中斷,gicv3 通過引入 affinity routing 機制解決這種路由問題。同一時間,CPU interface 上只能存在一個待處理的中斷,對于多個中斷被發送到 CPU interface 上,gic 引入優先級的機制來決定如何選擇保留的中斷;這個優先級的機制還被運用在 IRI 上,優先級更高的中斷會被優先發送到 CPU interface。另外,CPU interface 還負責將這個待處理的中斷按照 GROUP 屬性和當前的特權級和安全域決定觸發 IRQ 還是 FIQ 中斷線;并且當 PE 當前處于中斷時,CPU interface 還需要通過中斷優先級分組的機制判斷待處理的中斷是否需要被通知給 PE,即搶占。

x86-APIC

315d2ada-c045-11ec-bce3-dac502259ad0.png

從邏輯視圖上看,APIC 的核外部分是 I/O APIC,核內部分是 Local APIC。I/O APIC 根據內部 PRT table 中的 RTE 發送中斷消息給 Local APIC。I/O APIC 中 PRT table 由 24 個 RTE 項組成,每一項對應一個 IRQ 引腳。I/O APIC 可以有多個,當多個 I/O APIC 存在時,使用 GSI 代表每個 I/O APIC 管腳的編號:例如 I/O APIC1 有 24 個 IRQ,I/O APIC2 也有 24 個 IRQ,則 I/O APIC2 的 GSI 是從 24 開始,GSI = 24 + IRQ(I/O APIC2)。I/O APIC 的 24 個管腳沒有優先級之分。一個外部中斷經過 I/O APIC 再到 Local APIC,最后由 Local APIC 控制中斷線在 CPU 上觸發中斷;CPU 內部的中斷源由 Local APIC 管理,不需要經過 I/O APIC;IPI 也由 Local APIC 管理,同樣不需要經過 I/O APIC。

31dc24ca-c045-11ec-bce3-dac502259ad0.png

Local APIC 支持 0-255 的中斷向量號,它們可以同時存在于寄存器 IRR 上,引入中斷優先級進行選擇:優先級 = 中斷向量號 / 16因為 32 以下的中斷向量號是保留的,所以可用中斷優先級范圍為 2-15,數字越大優先級越高;當優先級高于寄存器 PPR 的情況下會操作 INTR 中斷線,若當前已經處于中斷則可能出現搶占。中斷向量號的低 4 位會在當 PPR 改變的情況下,ISR 從 IRR 上選擇中斷向量號的比較中使用,同樣也是數字越大優先級越高。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19896

    瀏覽量

    235314
  • 控制器
    +關注

    關注

    114

    文章

    17113

    瀏覽量

    184372

原文標題:openEuler Kernel 技術解讀 | 內核中斷子系統介紹

文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    GM0-5602適配openEUler22.03-LST-SP2并安裝網卡驅動

    ) kernel-headers-$(uname -r) 直接編譯報錯 問題是網口源碼和系統內核不匹配,臨時解決方案 可以嘗試在Makefile中
    的頭像 發表于 07-10 17:03 ?186次閱讀
    GM0-5602適配<b class='flag-5'>openEUler</b>22.03-LST-SP2并安裝網卡驅動

    openEuler 22.03為什么無法運行在VisionFive2上?

    (求助)openEuler 22.03無法運行在VisionFive2上
    發表于 06-19 07:13

    RK3568驅動指南|第十二篇 GPIO子系統-第135章 GPIO子系統與pinctrl子系統相結合實驗

    RK3568驅動指南|第十二篇 GPIO子系統-第135章 GPIO子系統與pinctrl子系統相結合實驗
    的頭像 發表于 05-23 13:47 ?374次閱讀
    RK3568驅動指南|第十二篇 GPIO<b class='flag-5'>子系統</b>-第135章 GPIO<b class='flag-5'>子系統</b>與pinctrl<b class='flag-5'>子系統</b>相結合實驗

    軟通動力亮相openEuler Developer Day 2025

    近日,openEuler Developer Day 2025(簡稱ODD 2025)在杭州成功舉辦,大會全新發布openEuler 25.03創新版本,展示內核開發、多樣性計算和全場景協同
    的頭像 發表于 04-15 17:21 ?580次閱讀

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統之Pinctrl子系統

    pinctrl(Pin Control)子系統是Linux內核中的一個模塊化子系統,用于管理和控制硬件引腳(Pin)的配置和功能。它提供了一種統一的接口,使驅動程序可以對硬件引腳進行靈活的配置和控制
    發表于 03-24 15:42

    飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統之Pinctrl子系統

    pinctrl(Pin Control)子系統是Linux內核中的一個模塊化子系統,用于管理和控制硬件引腳(Pin)的配置和功能。它提供了一種統一的接口,使驅動程序可以對硬件引腳進行靈活的配置和控制
    發表于 03-22 09:23

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內核移植之內核啟動流程

    關于內核啟動流程涉及內容較多而且復雜,過度的分析意義不大,因此,這里不做詳細講解,只做一個大概的介紹。初學者只做了解,有一定基礎的可以深入理解。 內核鏡像被uboot加載到內存空間之后,獲得控制權
    發表于 01-06 09:51

    華為亮相操作系統大會openEuler Summit 2024

    “以智能 致世界”為主題的操作系統大會 & openEuler Summit 2024 在北京中關村國際創新中心舉行。本次大會由 openEuler社區、全球計算聯盟主辦。華為公司戰略部部長蓋剛出席該活動并做大會致辭。
    的頭像 發表于 11-18 11:52 ?835次閱讀

    潤和軟件亮相操作系統大會openEuler Summit 2024

    近日,操作系統大會&openEuler Summit 2024在北京隆重舉辦。本次大會由openEuler社區和全球計算聯盟主辦,江蘇潤和軟件股份有限公司(以下簡稱“潤和軟件”)參與協辦。旨在匯聚全球產業發展力量,共同探討操作
    的頭像 發表于 11-17 09:08 ?972次閱讀

    潤和軟件參與openEuler社區操作系統安全主題技術交流

    信息技術飛速發展,操作系統安全已成為保障數字世界穩定運行的基石,OpenAtom openEuler(簡稱"openEuler")致力于構建一個開放、可靠、安全的開源操作
    的頭像 發表于 11-13 16:14 ?813次閱讀

    第二屆openEuler生態大會圓滿結束

    近日,第二屆openEuler生態大會(中國·湖南)成功舉辦。大會以“根植openEuler共建開源生態”為主題,旨在響應國家開源產業發展戰略,推動建設以openEuler為根技術的開
    的頭像 發表于 10-31 16:02 ?682次閱讀

    解決視頻采集子系統故障的工具和技術

    電子發燒友網站提供《解決視頻采集子系統故障的工具和技術.pdf》資料免費下載
    發表于 10-10 09:24 ?0次下載
    解決視頻采集<b class='flag-5'>子系統</b>故障的工具和<b class='flag-5'>技術</b>

    深度解析linux時鐘子系統

    linux內核中實現了一個CLK子系統,用于對上層提供各模塊(例如需要時鐘信號的外設,USB等)的時鐘驅動接口,對下層提供具體SOC的時鐘操作細節。
    的頭像 發表于 09-29 16:46 ?1315次閱讀
    深度解析linux時鐘<b class='flag-5'>子系統</b>

    Linux內核測試技術

    內核測試技術是實現這一目標的關鍵手段。本文將詳細介紹 Linux 內核測試的各種技術,包括單元測試、集成測試、功能測試和性能測試等,并討論
    的頭像 發表于 08-13 13:42 ?1319次閱讀
    Linux<b class='flag-5'>內核</b>測試<b class='flag-5'>技術</b>

    內核程序漏洞介紹

    電子發燒友網站提供《內核程序漏洞介紹.pdf》資料免費下載
    發表于 08-12 09:38 ?0次下載
    主站蜘蛛池模板: 丁香月婷婷 | 不卡一级毛片免费高清 | 大美女久久久久久j久久 | 色久优优 欧美色久优优 | 四虎国产精品永久在线网址 | 李老汉的性生生活1全部 | 亚洲视频一区在线 | 天天草b| 美女写真mm爽爽爽 | 亚洲一区二区三区在线网站 | 日韩天天干 | 成人性视屏 | 性做久久久久久久免费看 | 国产精选经典三级小泽玛利亚 | 天天爽天天干天天操 | 天天射网站 | 天天射天天操天天 | 欧美二级| 色丁香影院 | 97爱爱| 又粗又长又大真舒服好爽漫画 | 毛片网在线 | 亚洲黄色网址在线观看 | 午夜视频入口 | 免费看特级淫片日本 | 特级深夜a级毛片免费观看 特级生活片 | 2021久久精品国产99国产 | 国产手机看片 | 亚洲日本在线观看视频 | 日韩美女拍拍免费视频网站 | 91日本在线观看亚洲精品 | 国产精品视频第一区二区三区 | 午夜女同影院 | 亚洲精品福利视频 | 免费大片黄国产在线观看 | 很黄很黄叫声床戏免费视频 | 国产精品福利午夜h视频 | 波多野结衣在线免费视频 | 国产午夜a理论毛片在线影院 | 97理论三级九七午夜在线观看 | 国产精品超清大白屁股 |