GIC驅動程序分析

今天呢,我們就來具體的講一下GIC的驅動源碼啦,這個才是重點來著,我們來看看:

GIC中的重要函數和結構體:

沿著中斷的處理流程,GIC涉及這4個重要部分:

  • CPU從異常向量表中調用handle_arch_irq,這個函數指針是有GIC驅動設置的

    • GIC才知道怎么判斷發生的是哪個GIC中斷

  • 從GIC獲得hwirq后,要轉換為virq:需要有GIC Domain

  • 調用irq_desc[virq].handle_irq函數:這也應該由GIC驅動提供

  • 處理中斷時,要屏蔽中斷、清除中斷等:這些函數保存在irq_chip里,由GIC驅動提供

從硬件上看,GIC的功能是什么?

  • 可以使能、屏蔽中斷

  • 發生中斷時,可以從GIC里判斷是哪個中斷

在內核里,使用gic_chip_data結構體表示GIC,gic_chip_data里有什么?

  • irq_chip:中斷使能、屏蔽、清除,放在irq_chip中的各個函數里實現

  • irq_domain

    • 申請中斷時

      • 在設備樹里指定hwirq、flag,可以使用irq_domain的函數來解析設備樹

      • 根據hwirq可以分配virq,把(hwirq, virq)存入irq_domain中

    • 發生中斷時,從GIC讀出hwirq,可以通過irq_domain找到virq,從而找到處理函數

所以,GIC用gic_chip_data來表示,gic_chip_data中重要的成員是:irq_chip、irq_domain。

GIC初始化過程:

內核支持多種GIC:

按照設備樹的套路:

  • 驅動程序注冊platform_driver

  • 它的of_match_table里有多個of_device_id,表示能支持多個設備

  • 有多種版本的GIC,在內核為每一類GIC定義一個結構體of_device_id,并放在一個段里:

把宏IRQCHIP_DECLARE展開:

在設備樹里指定GIC:

在設備樹中指定GIC,內核驅動程序根據設備樹來選擇、初始化GIC。

drivers\irqchip\irqchip.c中并沒有定義一個platform_driver,但是套路是一樣的。

調用過程:

of_irq_init:

  • 內核有一個__irqchip_of_table數組,里面有多個of_device_id,表示多種GIC

  • 要使用哪類GIC?在設備樹里指定

  • 根據設備樹,找到__irqchip_of_table樹組中對應的項,調用它的初始化函數

    • IRQCHIP_DECLARE(cortex_a7_gic, "arm,cortex-a7-gic", gic_of_init);

?

申請GIC中斷:

在設備樹里指定中斷:

內核對設備樹的處理:

函數調用過程如下,使用圖片形式可以一目了然:

函數調用過程如下,使用文字格式方便復制:

  • 為設備樹節點分配設備

解析設備樹映射中斷: irq_of_parse_and_map

下面我們來看看圖片來進行分析:

首先的話,就是GIC去遍歷自己的寄存器,判斷發生了哪個中斷,這個是在中斷向量表里面的,匯編來著,小編也沒有很明白(唯唯諾諾)

第二個就是那個irq_domain的關系是怎么去建立的,

他會調用里面的translate函數,去解析設備樹

然后為他的hwirq找到一個空閑的virq,然后記錄在domain里面,最后去調用domain里面的alloc函數去處理

allow主要是包括建立mapping關系,然后就是就是注冊那些irq_data,這些在前面已經定義好了

這邊就是提供irq_chip了,那么到這里,我們就徹底講完啦,其實GIC也沒有想象的那么復雜,邏輯性很強,嘿嘿,完結,撒花(doge.)

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901433.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901433.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901433.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java操作redis庫,開箱即用

application.yml spring:application:name: demo#Redis相關配置redis:data:# 地址host: localhost# 端口,默認為6379port: 6379# 數據庫索引database: 0# 密碼password:# 連接超時時間timeout: 10slettuce:pool:# 連接池中的最小空閑連接min-idle: 0# 連接池中的最…

Cribl 通過Splunk search collector 來收集數據

今天利用Spliunk search collector 來收集數據啦:還是要先cribl 的官方文檔: Splunk Search Collector | Cribl Docs Splunk Search Collector Cribl Stream supports collecting search results from Splunk queries. The queries can be both simple and complex, as well a…

What Was the “Game Genie“ Cheat Device, and How Did It Work?

什么是“Game Genie”作弊裝置,它是如何工作的? First released in 1991, the Game Genie let players enter special codes that made video games easier or unlocked other functions. Nintendo didnt like it, but many gamers loved it. Heres wha…

位運算題目:連接連續二進制數字

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 解法思路和算法代碼復雜度分析 題目 標題和出處 標題:連接連續二進制數字 出處:1680. 連接連續二進制數字 難度 5 級 題目描述 要求 給定一個整數 n \texttt{n} n,將 1 \text…

第十六屆藍橋杯Java b組(試題C:電池分組)

問題描述: 輸入格式: 輸出格式: 樣例輸入: 2 3 1 2 3 4 1 2 3 4 樣例輸出: YES NO 說明/提示 評測用例規模與約定 對于 30% 的評測用例,1≤T≤10,2≤N≤100,1≤Ai?≤10^3。對于 100…

63. 評論日記

2025年4月14日18:53:30 雷軍這次是真的累了_嗶哩嗶哩_bilibili

電商中的訂單支付(內網穿透)

支付頁面 接口文檔 Operation(summary"獲取訂單信息") GetMapping("auth/{orderId}") public Reuslt<OrderInfo> getOrderInfo(Parameter(name"orderId",description"訂單id",requiredtrue) PathVaariable Long orderId){OrderI…

MySQL表的使用(4)

首先回顧一下之前所學的增刪查改&#xff0c;這些覆蓋了平時使用的80% 我們上節課中學習到了MySQL的約束 其中Primary key 是主鍵約束&#xff0c;我們今天要學習的是外鍵約束 插入一個表 外鍵約束 父表 子表 這條記錄中classid為5時候&#xff0c;不能插入&#xff1b; 刪除…

Kotlin作用域函數

在 Kotlin 中&#xff0c;.apply 是一個 作用域函數&#xff08;Scope Function&#xff09;&#xff0c;它允許你在一個對象的上下文中執行代碼塊&#xff0c;并返回該對象本身。它的設計目的是為了 對象初始化 或 鏈式調用 時保持代碼的簡潔性和可讀性。 // 不使用 apply va…

C#集合List<T>與HashSet<T>的區別

在C#中&#xff0c;List和HashSet都是用于存儲元素的集合&#xff0c;但它們在內部實現、用途、性能特性以及使用場景上存在一些關鍵區別。 內部實現 List&#xff1a;基于數組實現的&#xff0c;可以包含重復的元素&#xff0c;并且元素是按照添加的順序存儲的。 HashSet&…

Python 實現的運籌優化系統數學建模詳解(最大最小化模型)

一、引言 在數學建模的實際應用里&#xff0c;最大最小化模型是一種極為關鍵的優化模型。它的核心目標是找出一組決策變量&#xff0c;讓多個目標函數值里的最大值盡可能小。該模型在諸多領域&#xff0c;如資源分配、選址規劃等&#xff0c;都有廣泛的應用。本文將深入剖析最大…

數據庫的種類及常見類型

一&#xff0c;數據庫的種類 最常見的數據庫類型分為兩種&#xff0c;關系型數據庫和非關系型數據庫。 二&#xff0c;關系型數據庫介紹 生產環境主流的關系型數據庫有 Oracle、SQL Server、MySQL/MariaDB等。 關系型數據庫在存儲數據時實際就是采用的一張二維表&#xff0…

PE文件(十五)綁定導入表

我們在分析Windows自帶的一些程序時&#xff0c;常常發現有的程序&#xff0c;如notepad&#xff0c;他的IAT表在文件加載內存前已經完成綁定&#xff0c;存儲了函數的地址。這樣做可以使得程序是無需修改IAT表而直接啟動&#xff0c;這時程序啟動速度變快。但這種方式只適用于…

計算機網絡分層模型:架構與原理

前言 計算機網絡通過不同的層次結構來實現通信和數據傳輸&#xff0c;這種分層設計不僅使得網絡更加模塊化和靈活&#xff0c;也使得不同類型的通信能夠順利進行。在網絡協議和通信體系中&#xff0c;最廣為人知的分層模型有 OSI模型 和 TCP/IP模型。這兩種模型分別定義了計算…

Ollama模型顯存管理機制解析與Flask部署方案對比

一、Ollama顯存釋放機制 Ollama部署模型后&#xff0c;顯存占用分為兩種情況&#xff1a; 首次調用后短暫閑置&#xff08;約5分鐘內&#xff09;&#xff1a; ? 釋放KV Cache等中間計算數據&#xff08;約回收30%-50%顯存&#xff09;。 ? 模型權重仍保留在顯存中&#xf…

KWDB創作者計劃—KWDB技術重構:重新定義數據與知識的神經符號革命

引言&#xff1a;數據洪流中的范式危機 在AI算力突破千卡集群、大模型參數量級邁向萬億的時代&#xff0c;傳統數據庫系統正面臨前所未有的范式危機。當GPT-4展現出跨領域推理能力&#xff0c;AlphaFold3突破蛋白質預測精度時&#xff0c;數據存儲系統卻仍在沿用基于關系代數的…

Unified Modeling Language,統一建模語言

UML&#xff08;Unified Modeling Language&#xff0c;統一建模語言&#xff09;是一種標準化的圖形化建模語言&#xff0c;用于可視化、規范和文檔化軟件系統的設計。UML 提供了一套通用的符號和規則&#xff0c;幫助開發者、架構師和團隊成員更好地理解和溝通軟件系統的結構…

IO模式精講總結

一、IO模型概述 Java中的IO模型主要分為BIO&#xff08;同步阻塞IO&#xff09;、NIO&#xff08;同步非阻塞IO&#xff09;和AIO&#xff08;異步非阻塞IO&#xff09;三種。它們分別適用于不同的業務場景&#xff0c;理解其核心機制對高性能網絡編程至關重要。 二、BIO&…

使用pybind11開發c++擴展模塊輸出到控制臺的中文信息顯示亂碼的問題

使用pybind11開發供Python項目使用的C++擴展模塊時,如果在擴展模塊的C++代碼中向控制臺輸出的信息中包含中文,python程序的控制臺很容易出現亂碼。以如下C++擴展框架代碼為例(這是對上一篇文章簡明使用pybind11開發pythonc+擴展模塊教程-CSDN博客中的C++擴展框架代碼進行少量…

通過jstack分析線程死鎖場景

死鎖的四個必要條件&#xff1a;互斥、持有并等待、不可搶占、循環等待。 死鎖場景是兩個線程各自持有某個鎖&#xff0c;并試圖獲取對方持有的鎖&#xff0c;導致互相等待。 創建死鎖示例代碼 package io.renren.controller;import org.springframework.web.bind.annotation…