中斷管理之下半部軟中斷

2021-08-10 19:19:24 字數 1504 閱讀 1927

linux中斷管理中有個非常重要的設計理念就是上下半部機制

上半部就是硬體中斷管理

中斷設計為上下半部的原因如下

1.硬體中斷處理程式以非同步方式進行 它會打斷其他重要的**執行 因此為了避免被打斷的程式停止時間太長 硬體中斷處理程式必須盡快完成

2.硬體中斷處理程式通常在關閉中斷的情況下執行 關閉中斷就是關閉本cpu的所有中斷響應 關閉中斷後 本地cpu就不能響應所有的中斷響應 因此硬體中斷處理程式必須盡快的完成

比如 在arm處理器下 中斷發生時 arm處理器會自動的關閉irq/fiq中斷 知道從中斷處理程式退出時才開啟本地中斷

上半部通常是完成整個中斷處理任務中的一小部分 例如響應中斷表明中斷已經被軟體接收 簡單的資料處理 如dma 以及硬體中斷處理完成時傳送eoi訊號 給中斷控制器等 下半部就是操作一些比較耗時的操作 比如資料複製 資料報的封裝之類的 下半部執行的關鍵點是允許響應所有的中斷 是乙個開中斷的環境

對於中斷下半部分

目前只有塊裝置和網路子系統使用了軟中斷型別 tasklet機制也是軟中斷型別中的一種

linux中定義的軟中斷型別如下

include/linux/interrupt.h

enum

;中斷描述符陣列 軟中斷的索引號就是該陣列的索引

static struct softirq_action softirq_vec[nr_softirqs] __cacheline_aligned_in_smp;

中斷狀態資訊

typedef struct ____cacheline_aligned irq_cpustat_t;

註冊軟中斷api

void open_softirq(int nr, void (action)(struct softirq_action ))

這個nr就是tasklet_softirq或者其他 linux定義了十種

觸發軟中斷api

void raise_softirq(unsigned int nr)

if (!in_interrupt())只是判斷是否在程序上下文中 如果在程序上下文中就呼叫wakeup_softirqd();來喚醒ksoftirqd核心執行緒來處理 如果在中斷上下文中 只需要設定本地cpu __

void __raise_softirq_irqoff(unsigned int nr)

void __raise_softirq_irqoff(unsigned int nr)

#define or_softirq_pending(x) (local_softirq_pending() |= (x))

#define local_softirq_pending() \

__irq_stat(smp_processor_id(), __softirq_pending)

#define __irq_stat(cpu, member) (irq_stat[cpu].member)

替換也即是irq_stat[cpu].__softirq_pending|= (1<

下半部機制之軟中斷

軟中斷 softirq 是用軟體方式模擬硬體中斷的概念,實現巨集觀上的非同步執行效果。softirq是基本的下半部機制,需要互斥使用。一般很少直接使用。通常只用在少數效能比較關鍵的子系統中。它是可重入的,允許乙個softirq的不同例項可同時執行在不同的處理器上。軟中斷的 位於kernel soft...

例項 中斷的下半部分之 軟中斷

在linux中斷加入自已的軟中斷 軟硬體環境 linux 2.6.36 s3c2440 步驟如下 在軟中斷定義的列舉型別列表中加入自已的軟中斷號my softirq 具體到linux 2.6.36 include linux interrupt.h的第376行的列舉列表。其中已經有10項,在nr s...

中斷學習之下半部深入理解

對於軟中斷,實現還是很完美的。每乙個中斷上半部都對應乙個軟中斷,可以在多核上併發進行。以塊裝置軟中斷為例,初始化如下 blk dev init for each possible cpu i 每個cpu都部署 init list head per cpu blk cpu done,i open so...