linux中斷調用流程(arm)

文章目錄

      • ARM架構下Linux中斷處理全流程解析:從硬件觸發到驅動調用 ?
        • **一、中斷觸發與硬件層響應** 🔌
          • **1. 設備觸發中斷** 📡
        • **二、CPU階段:異常入口與上下文處理** 🖥?
          • **1. 異常模式切換** 🔄
          • **2. 跳轉至中斷向量表** 🗺?
        • **三、內核中斷處理框架** ??
          • **1. 中斷向量表初始化** 📜
          • **2. 中斷控制器驅動注冊** 🔧
          • **3. 中斷分發與設備處理** 🔀
        • **四、設備驅動中的中斷處理流程** 🛠?
          • **1. 驅動注冊中斷處理函數** 📝
          • **2. 實現中斷處理函數** 🛠?
          • **3. 釋放中斷資源** 🗑?
        • **五、示例:網卡中斷處理全流程** 🌐
        • **六、關鍵數據結構與機制** 📊

ARM架構下Linux中斷處理全流程解析:從硬件觸發到驅動調用 ?


在這里插入圖片描述

一、中斷觸發與硬件層響應 🔌
1. 設備觸發中斷 📡

當外設(如網卡、鍵盤)需要CPU處理時,其硬件控制器會通過物理中斷線(IRQ)向中斷控制器發送信號。以ARM的通用中斷控制器(GICv3)為例:

  • 中斷接收:GIC Distributor模塊接收中斷請求,并根據中斷類型(SPI/PPI/SGI)分類。
    🛠? 關鍵點:SPI用于共享外設中斷,PPI為CPU私有中斷。
  • 優先級仲裁:Distributor根據中斷優先級(配置于寄存器GICD_IPRIORITYRn)和屏蔽狀態,選擇最高優先級中斷。
    ?? 優先級規則:數值越小優先級越高,0為最高。
  • 路由到目標CPU:通過Redistributor模塊將中斷傳遞給目標CPU核心(支持多核負載均衡)。
    🌐 多核優化:避免單核過載,提升系統吞吐量。
  • 物理信號觸發:GIC通過CPU的IRQ引腳觸發異常模式切換。
    ? 信號傳遞:硬件自動完成,無需軟件干預。

二、CPU階段:異常入口與上下文處理 🖥?
1. 異常模式切換 🔄

CPU收到中斷信號后,硬件自動完成以下操作:

  • 保存上下文:將當前程序狀態(PSTATEPCSP等)壓入內核棧。
    📦 關鍵寄存器:包括通用寄存器、程序計數器、棧指針。
  • 切換異常級別
    • 用戶態(EL0)→ 內核態(EL1):觸發完整的上下文切換。
      🔒 安全隔離:防止用戶程序直接訪問內核資源。
    • 內核態(EL1)→ EL1:僅保存關鍵寄存器,復用當前內核棧。
      ? 快速路徑:減少模式切換開銷。
2. 跳轉至中斷向量表 🗺?
  • 向量表基址:由寄存器VBAR_EL1指定,指向內核預定義的向量表(arch/arm64/kernel/entry.S)。
    🏷? 配置時機:內核啟動時通過set_vbar()初始化。
  • 入口偏移計算
    • IRQ入口VBAR_EL1 + 0x280(EL1h模式)。
      🔍 偏移規則:每種異常類型有固定偏移量。
    • 同步異常入口VBAR_EL1 + 0x400(用于系統調用)。
      📌 示例:系統調用通過svc指令觸發同步異常。
// arch/arm64/kernel/entry.S
kernel_ventry 1, irq       // EL1h模式IRQ入口

在這里插入圖片描述


三、內核中斷處理框架 ??
1. 中斷向量表初始化 📜

ARM64的中斷向量表通過匯編宏kernel_ventry定義,每個條目對應一種異常類型:

  • IRQ處理入口:最終調用handle_arch_irq(全局函數指針)。
    🔗 跳轉邏輯:從匯編跳轉到C語言函數。
  • 關鍵匯編跳轉
    irq_handler:bl    handle_arch_irq   // 跳轉到C語言處理函數
    
2. 中斷控制器驅動注冊 🔧

以GIC驅動為例,初始化時完成中斷處理函數的綁定:

// drivers/irqchip/irq-gic.c
void __init gic_init(...) {gic_dist_init(gic);       // 初始化Distributorgic_cpu_init(gic);        // 初始化CPU Interfaceset_handle_irq(gic_handle_irq);  // 注冊全局處理函數
}

在這里插入圖片描述

  • set_handle_irq:將gic_handle_irq賦值給handle_arch_irq,建立匯編到C的橋梁。
    🌉 橋梁作用:屏蔽硬件差異,統一中斷入口。
3. 中斷分發與設備處理 🔀

GIC驅動通過gic_handle_irq讀取中斷號并分發給設備驅動:

static void __exception_irq_entry gic_handle_irq(...) {u32 irqnr = gic_read_iar();      // 讀取GIC中斷應答寄存器handle_domain_irq(gic_data.domain, irqnr, regs);  // 映射并處理
}

在這里插入圖片描述


// kernel/irq/irqdesc.c
int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,bool lookup, struct pt_regs *regs) {...irq_enter();  // 進入中斷上下文irq = irq_find_mapping(domain, hwirq);  // 硬件中斷號映射為虛擬中斷號if (irq合法) {generic_handle_irq(irq);  // 調用中斷處理鏈} else {ack_bad_irq(irq);        // 錯誤處理}irq_exit();  // 退出中斷上下文...
}

在這里插入圖片描述

  • handle_domain_irq的核心作用
    1. 中斷上下文標記irq_enter()進入原子上下文,禁用調度。
      🚫 禁止行為:禁止睡眠、內存分配等非原子操作。
    2. 硬件中斷號映射:通過irq_domain將硬件IRQ轉換為Linux虛擬IRQ。
      🗂? 映射策略:支持線性映射、樹映射等多種方式。
    3. 調用設備ISR:從irq_desc[].action鏈表中執行驅動注冊的中斷處理函數。
      ? 快速響應:上半部處理時間通常小于1ms。

四、設備驅動中的中斷處理流程 🛠?
1. 驅動注冊中斷處理函數 📝

設備驅動通過request_irq注冊中斷服務例程(ISR):

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);
  • 參數說明
    • irq:虛擬中斷號(由irq_of_parse_and_map解析設備樹獲得)。
      🌳 設備樹示例
      interrupts = <0 168 IRQ_TYPE_EDGE_RISING>;  // SPI 168,上升沿觸發
      
    • flags:標志位(如IRQF_SHARED表示共享中斷)。
      ?? 共享中斷:需唯一dev_id標識不同設備。
    • dev:設備標識符(共享中斷時用于區分設備)。
      📌 示例:PCI設備使用pci_dev指針作為標識。
2. 實現中斷處理函數 🛠?
  • 上半部(Top Half):快速響應硬件,禁止阻塞或睡眠。

    static irqreturn_t my_irq_handler(int irq, void *dev_id) {struct net_device *dev = dev_id;// 1. 讀取硬件狀態(如網卡DMA緩沖區)u32 status = readl(dev->reg_base + STATUS_REG);// 2. 清除中斷標志writel(STATUS_CLEAR, dev->reg_base + STATUS_REG);// 3. 觸發下半部(如tasklet)tasklet_schedule(&dev->tasklet);return IRQ_HANDLED;
    }
    

    🚨 注意事項:避免在中斷上下文中調用kmalloc()mutex_lock()

  • 下半部(Bottom Half):處理耗時任務,支持多種機制:

    • SoftIRQ:內核預定義的高優先級任務(如網絡收包)。
      🌟 優勢:支持多CPU并行處理。
    • Tasklet:基于SoftIRQ,單CPU串行執行。
      ? 適用場景:GPIO按鍵去抖動處理。
    • Workqueue:運行于進程上下文,允許休眠。
      🛌 示例:文件I/O或網絡協議棧處理。
3. 釋放中斷資源 🗑?

驅動卸載時需調用free_irq釋放中斷號:

void free_irq(unsigned int irq, void *dev_id);

?? 內存安全:必須在驅動卸載路徑中調用,防止資源泄漏。


五、示例:網卡中斷處理全流程 🌐
  1. 硬件觸發:網卡接收數據包,向GIC發送IRQ信號。
    📡 觸發時機:DMA傳輸完成或FIFO緩沖區非空。
  2. GIC路由:Distributor將中斷路由至CPU0,分配硬件中斷號168。
    🔄 負載均衡:GICv3支持動態調整目標CPU。
  3. CPU跳轉:CPU0執行向量表VBAR_EL1 + 0x280處的irq入口。
    ?? 低延遲:硬件自動跳轉,無需軟件輪詢。
  4. GIC處理gic_handle_irq讀取中斷號168,調用handle_domain_irq
    🔍 中斷號解析:通過GICC_IAR寄存器獲取。
  5. 中斷映射:通過irq_domain將168映射為Linux虛擬IRQ 200。
    🌉 映射關系:存儲在irq_desc[200].irq_data.hwirq
  6. 驅動處理:執行irq_desc[200].action中的網卡ISR(如NAPI收包)。
    🚀 性能優化:NAPI在收包時切換為輪詢模式,減少中斷風暴。
  7. 中斷返回:恢復上下文,觸發軟中斷(如NET_RX_SOFTIRQ)處理數據。
    📦 數據傳遞sk_buff從內核空間傳遞到用戶空間。

六、關鍵數據結構與機制 📊
組件/機制功能說明示例/API
GIC Distributor接收外設中斷,優先級仲裁,路由到目標CPU核心。gic_dist_init()
VBAR_EL1存儲中斷向量表基址,決定異常入口跳轉位置。set_vbar()
irq_domain管理硬件中斷號(HW IRQ)到Linux虛擬中斷號(VIRQ)的映射。irq_domain_add_linear()
irq_desc[]全局中斷描述符數組,存儲中斷處理函數鏈(action鏈表)。struct irq_desc
request_irq()驅動注冊中斷處理函數,關聯到irq_desc[VIRQ].action鏈表。request_irq()

在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

第十四屆藍橋杯大賽軟件賽國賽C/C++大學C組

A 【跑步計劃——日期問題】-CSDN博客 B 【殘缺的數字】-CSDN博客 C 題目 代碼 #include <bits/stdc.h> using namespace std;void change(int &x) {int sum 0, t x;while(t){sum t % 10;t / 10;}x - sum; } int main() {int n;cin >> n;int ans 0;…

汽車低頻發射天線介紹

汽車低頻PKE天線是基于RFID技術的深度研究及產品開發應用的一種天線&#xff0c;在汽車的智能系統中發揮著重要作用&#xff0c;以下是關于它的詳細介紹&#xff1a; 移動管家PKE低頻天線結構與原理 結構&#xff1a;產品一般由一個高Q值磁棒天線和一個高壓電容組成&#xff…

藍橋杯web第三天

展開扇子題目&#xff0c; #box:hover #item1 { transform:rotate(-60deg); } 當懸浮在父盒子&#xff0c;子元素旋轉 webkit display: -webkit-box&#xff1a;將元素設置為彈性伸縮盒子模型。-webkit-box-orient: vertical&#xff1a;設置伸縮盒子的子元素排列方…

達夢數據庫如何查看當前鎖表和如何解決鎖表問題

達夢數據庫查看當前鎖表及解決鎖表問題的方法如下&#xff1a; 一、查看當前鎖表信息 方法1&#xff1a;通過動態視圖 V$LOCK 和 V$SESSIONS 聯合查詢 查詢所有鎖信息&#xff1a; SELECT * FROM V$LOCK; 關鍵列說明&#xff1a;TRX_ID&#xff08;事務ID&#xff09;、LTYP…

ubuntu22.04系統如何自建2級ntp服務器

一&#xff1a;ntp服務器詳情 服務器型號 系統版本 IP地址 主機名 ntp服務版本 虛擬機8c-32g-1T Ubuntu22.04 10.20.30.2 DMZ-NTP-SERVER 4.2.8p15 二&#xff1a;ntp服務端部署配置腳本 #!/bin/bash # 腳本信息 echo "--------------------------…

計算機畢業設計SpringBoot+Vue.js汽車資訊網站(源碼+文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

UE5切換關卡函數OpenLevel,輸入模式結構體,UI界面

1.輸入模式結構體 FInputModeGameOnly&#xff1a;玩家只能與游戲世界交互&#xff0c;UI 不可交互。FInputModeGameAndUI&#xff1a;玩家可以與游戲世界和 UI 同時交互。FInputModeUIOnly&#xff1a;玩家只能與 UI 交互&#xff0c;無法與游戲世界進行互動。 FInputModeGam…

JavaScript系列03-異步編程全解析

本文介紹了異步相關的內容&#xff0c;包括&#xff1a; 回調函數與回調地獄Promise詳解async/await語法Generator函數事件循環機制異步編程最佳實踐 1、回調函數與回調地獄 JavaScript最初是為處理網頁交互而設計的語言&#xff0c;異步編程是其核心特性之一。最早的異步編…

kali liux的下載

Kali Linux | Penetration Testing and Ethical Hacking Linux Distributionhttps://www.kali.org/ VMware虛擬機https://pan.quark.cn/s/aa869ffbf184 【補充一個今天學到的知識昂和內容無關:&#xff08;遙感&#xff09;指非接觸的遠距離探測技術&#xff0c;使用傳感器探…

windows下玩轉vllm:在wsl下安裝vllm

文章目錄 前言安裝wsl啟動wsl的默認分發使用python部署vllm創建并激活虛擬環境直接說結論試錯過程安裝vllm簡單測試一下,看看行不行附錄,安裝wsl安裝ubuntu分發步驟 3: 設置用戶和密碼步驟 4: 更新系統步驟 5: 使用 WSL前言 當前,部署通義千問2.5-vl已經是一件箭在弦上,不…

《信息論與編碼》課程筆記——緒論和離散信源(一)

目錄 緒論 一、信息論的基本概念 1.1 信息的定義 1.2 信息的三個層次 二、香農信息論的研究內容 2.1 信源與信源編碼 2.2 信道與信道編碼 2.3 保密通信與密碼學 離散信源&#xff08;一&#xff09; 一、自信息 1.1 定義 二、離散信源 2.1 定義 2.2 符號表示 三、…

大模型中的Token到底是什么?

文章目錄 引言什么是Token&#xff1f;定義舉例說明中文Tokenization Tokenization的復雜性子詞TokenizationBPE算法BPE示例 可視化BPE過程 Token在大模型中的作用輸入表示上下文理解輸出生成 Tokenization的挑戰語言差異未登錄詞計算效率 Token消耗的規則Token消耗的基本規則示…

Acwing 哞叫時間II

6134. 哞叫時間II - AcWing題庫 題目大意&#xff1a;統計數組中子序列abb的數量&#xff1a; 做法&#xff1a;從右往左枚舉倒數第二個b&#xff0c;查前面出現過多少次a&#xff0c;查的方法(開一個數組left[x]來統計當前及前面出現過多少次x&#xff0c;cnt記錄不同x的數量…

Go中slice和map引用傳遞誤區

背景 關于slice和map是指傳遞還是引用傳遞&#xff0c;很多文章都分析得模棱兩可&#xff0c;其實在Go中只有值傳遞&#xff0c;但是很多情況下是因為分不清slice和map的底層實現&#xff0c;所以導致很多人在這一塊產生疑惑&#xff0c;下面通過代碼案例分析slice和map到底是…

20250225-代碼筆記03-class CVRPModel AND other class

文章目錄 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函數功能函數代碼 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函數功能函數代碼 三、class CVRPModel(nn.Module):forward(self, state)函數功能函數代碼 四、def _get_encodi…

使用Hydra進行AI項目的動態配置管理

引言:機器學習中的超參數調優挑戰 在機器學習領域,超參數調優是決定模型性能的關鍵環節。不同的模型架構,如神經網絡中的層數、節點數,決策樹中的最大深度、最小樣本分割數等;以及各種訓練相關的超參數,像學習率、優化器類型、批量大小等,其取值的選擇對最終模型的效果…

preg_replace 與 str_replace 的比較與選擇

preg_replace 與 str_replace 的比較與選擇 ——PHP字符串處理的核心工具深度解析 一、核心功能定位 在PHP的字符串處理中&#xff0c;str_replace和preg_replace是兩種最常用的替換函數&#xff0c;但其設計目標和應用場景存在本質差異&#xff1a; str_replace 簡單字符串替…

嵌入式開發:傅里葉變換(4):在 STM32上面實現FFT(基于STM32L071KZT6 HAL庫+DSP庫)

目錄 步驟 1&#xff1a;準備工作 步驟 2&#xff1a;創建 Keil 項目&#xff0c;并配置工程 步驟 3&#xff1a;在MDK工程上添加 CMSIS-DSP 庫 步驟 5&#xff1a;編寫代碼 步驟 6&#xff1a;配置時鐘和優化 步驟 7&#xff1a;調試與驗證 步驟 8&#xff1a;優化和調…

【MySQL篇】數據類型

目錄 前言&#xff1a; 1&#xff0c;數據類型的分類 ?編輯 2 &#xff0c;數值類型 2.1 tinyint類型 2.2 bit類型 2.3 小數類型 2.3.1 float類型 2.3.2 decimal類型 3&#xff0c;字符串類型 3.1 char 3.2 varchar 3.3 char與varchar的比較 3.4日期和時間類型 3.5 …

nuxt常用組件庫html-validator應用解析

html-validator 主要用于自動驗證nuxt服務器呈現的HTML(SSR和SSG)&#xff0c;以檢測可能導致水合錯誤的HTML常見問題&#xff0c;有助于減少水合錯誤&#xff0c;檢測常見的可訪問性錯誤。 安裝 npx nuxilatest module add html-validator配置 若自動更新nuxt.config.ts配置文…