linux 軟中斷和tasklet

2021-06-17 23:52:24 字數 2412 閱讀 7144

1. 軟中斷是什麼 ?

軟中斷是一種延時機制,**執行的優先順序比程序要高,比硬中斷要低。相比於硬體中斷,軟中段是在開中斷的環境中執行的(長時間關中斷對系統的開銷太大), **是執行在中斷/執行緒上下文的,是不能睡眠的,雖然每個cpu都有乙個對應的ksoftirqd/n執行緒來執行軟中斷,但是do_softirq這個函式也還會在中斷退出時呼叫到,因此不能睡眠(中斷上下文不能睡眠的原因是由於排程系統是以程序為基本單位的,排程時會把當前程序的上下文儲存在task_struct這個資料結構中,當程序被排程重新執行時會找到執行的斷點,但是中斷上下文是沒有特定task_struct結構體的,當然現在有所謂的執行緒話中斷,可以滿足在中斷處理函式執行阻塞操作,但是實時性可能會有問題。還有就是中斷代表當前程序執行的概念,個人感覺有點扯淡,畢竟整個核心空間是由所有程序共享的,不存在代表的概念)

2. 軟中段是怎麼實現的?

乙個模組或者子系統的實現都是資料結構+演算法來實現的,演算法一般由特定的函式來表徵。資料結構一般會定義一些全域性變數來支撐演算法的實現。軟中斷牽涉到的資料結構主要是乙個全域性的向量陣列,來對映乙個軟中斷向量號和對應的處理函式:

static struct sotfirq_action softirq_vec[nr_softirqs];

struct softirq_action

目前**中有10種型別的軟中斷

enum

這裡只關注和tasklet相關的軟中斷: hi_softirq和tasklet_softirq

核心函式:

open_softirq(int nr, void (*action)(struct softirq_action *))  //乙個軟中斷和對應的處理函式的繫結,

raise_softirq(unsingned int nr)   //表明乙個軟中斷處於pending狀態等待處理, 在do_softirq函式裡會檢查處於pending的軟中斷,然後呼叫對應的處理函式

do_softirq(void)

pending >>=1; //優先順序從0開始

} while (pending);

}

3. tasklet的概念和實現

驅動程式裡最常見的就是在中斷處理函式裡面排程乙個tasklet來執行延時的任務,tasklet是在軟中斷的基礎之上實現的,牽涉到hi_softirq和tasklet_softirq兩種軟中斷,兩種軟中斷對應的處理函式tasklet_action/tasklet_hi_action會去tasklet_vec和tasklet_hi_vec陣列(基於per cpu結構)中取所存在的tasklet,然後執行相應的tasklet處理函式。

static define_per_cpu(struct tasklet_head, tasklet_vec);   //陣列中的元素為乙個煉表頭, 所有的tasklet是鏈結在乙個鍊錶上的

static define_per_cpu(struct tasklet_head, tasklet_hi_vec);

struct tasket_head

struct tasklet_struct

static inline void tasklet_schedule(struct tasklet_struct *t)

void tasklet_action(struct softirq_action *a)

tasklet_unlock(t); //復位tasklet_state_run標誌位}}

}static inline void tasklet_disable(struct tasklet_struct *t)

void tasklet_kill(struct tasklet_struct *t) //感覺這個函式和tasklet_disable類似,只是等待當前正在執行的tasklet完成,下次呼叫tasklet_schedule應該還是會執行的,貌似和kill這個單詞不匹配啊,還沒tasklet_disable徹底

while(test_bit(tasklet_state_sched, &t->sched));

}tasklet_unlock_wait(t);

clear_bit(tasklet_state_sched, &t->state);

}

從上面的分析可以看出,tasklet的處理函式是不可重入的,換句話說,就是不可能在兩個cpu上跑相同的**,因為乙個tasklet只能被排程一次,也就是掛接在乙個鍊錶裡面,而且在哪個cpu上被排程,就會在哪個cpu被執行,因為是基於per cpu結構的, 但是軟中斷對應的處理函式是可重入的, 需要處理同步的問題,不過一般驅動裡面還是用tasklet,簡單方便,而且軟中斷是在編譯時決定的,開銷太大。

硬中斷和軟中斷

中斷是一種電訊號,當裝置有某種事件發生時,它就會產生中斷,通過匯流排把電訊號傳送給中斷控制器。如果中斷的線是啟用的,中斷控制器就把電訊號傳送給處理器的某個特定引腳。處理器於是立即停止自己正在做的事,跳到中斷處理程式的入口點,進行中斷處理。由與系統相連的外設 比如網絡卡 硬碟 自動產生的。主要是用來通...

Linux軟中斷通訊

程序對訊號的響應 1 忽略訊號 不採取任何操作 有兩個訊號不能被忽略 sigkill和sigstop。如果忽略,系統管理無法殺死 暫停程序,無法對系統進行管理。2 捕獲並處理訊號 3 執行預設操作,通常是終止程序 訊號的預設操作 通過 man 7 signal 檢視 系統呼叫或庫函式 1 lockf...

Linux 怎麼理解Linux軟中斷?

為了解決中斷處理程式執行過長和中斷丟失的問題,linux 將中斷處理過程分成了兩個階段,也就是上半部和下半部 舉個最常見的網絡卡接收資料報的例子,讓你更好地理解。網絡卡接收到資料報後,會通過硬體中斷的方式,通知核心有新的資料到了。這時,核心就應該呼叫中斷處理程式來響應它。你可以自己先想一下,這種情況...