linux 中斷子系統 下半部

2021-10-03 15:57:07 字數 1702 閱讀 4803

引用

搶占

softirq

tasklet

workqueue

timer

中斷分成上下半部處理可以提高中斷的響應能力,在上半部處理完成後便將中斷開啟(通常上半部處理越快越好),這樣就可以響應其他中斷了,等到中斷退出的時候再進行下半部的處理。

softirq是靜態的,不支援動態分配。

/* 支援的軟中斷型別,可以認為是軟中斷號, 其中從上到下優先順序遞減 */

enum

;/* 軟體中斷描述符,只包含乙個handler函式指標 */

struct softirq_action ;

/* 軟中斷描述符表,實際上就是乙個全域性的陣列 */

static struct softirq_action softirq_vec[nr_softirqs] __cacheline_aligned_in_smp;

/* cpu軟中斷狀態描述,當某個軟中斷觸發時,__softirq_pending會置位對應的bit */

typedef struct ____cacheline_aligned irq_cpustat_t;

/* 每個cpu都會維護乙個狀態資訊結構 */

irq_cpustat_t irq_stat[nr_cpus] ____cacheline_aligned;

/* 核心為每個cpu都建立了乙個軟中斷處理核心執行緒 */

define_per_cpu(struct task_struct *, ksoftirqd);

/* 靜態分配tasklet */

declare_tasklet(name, func, data)

/* 動態分配tasklet */

void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);

/* 禁止tasklet被執行,本質上是增加tasklet_struct->count值,以便在排程時不滿足執行條件 */

void tasklet_disable(struct tasklet_struct *t);

/* 使能tasklet,與tasklet_diable對應 */

void tasklet_enable(struct tasklet_struct *t);

/* 排程tasklet,通常在裝置驅動的中斷函式裡呼叫 */

void tasklet_schedule(struct tasklet_struct *t);

/* 殺死tasklet,確保不被排程和執行, 主要是設定state狀態位 */

linux中斷與下半部

中斷 解決cpu和硬體速度差距太大問題,不能讓cpu等,也不能讓cpu輪詢,所以硬體好了給cpu發個訊號 硬體 控制器 中斷控制器 cpu 中斷控制器在中斷線啟用 未被遮蔽 才發向cpu 中斷 不需要與cpu時鐘同步,非同步,隨時可以來 異常 缺頁,0除 與cpu時鐘同步,同步,cpu產生,如系統呼...

筆記 中斷,下半部

先弄清兩個概念,程序上下文和中斷上下文 處理器總處於以下狀態中的一種 核心態,執行於程序上下文,核心代表程序執行於核心空間 核心態,執行於中斷上下文,核心代表硬體執行於核心空間 使用者態,執行於使用者空間。使用者空間的應用程式,通過系統呼叫,進入核心空間。這個時候使用者空間的程序要傳遞很多變數 引數...

linux中斷的上半部和下半部

本文 與linux中斷息息相關的乙個重要概念是linux中斷分為兩個半部 上半部 tophalf 和下半部 bottom half 上半部的功能是 登記中斷 當乙個中斷發生時,它進行相應地硬體讀寫後就把中斷例程的下半部掛到該裝置的下半部執行佇列中去。因此,上半部執行的速度就會很快,可以服務更多的中斷...