Linux核心筆記--軟中斷
阿新 • • 發佈:2020-12-31
Linux軟中斷
1、軟中斷介紹
Linux 核心使用結構體 softirq_action 表示軟中斷, softirq_action結構體定義在檔案include/linux/interrupt.h 中,內容如下:
在 kernel/softirq.c 檔案中一共定義了 10 個軟中斷:
static struct softirq_action softirq_vec[NR_SOFTIRQS];
中斷 | 含義 |
---|---|
HI_SOFTIRQ=0 | 高優先順序軟中斷 |
TIMER_SOFTIRQ | 定時器軟中斷 |
NET_TX_SOFTIRQ | 網路資料傳送軟中斷 |
NET_RX_SOFTIRQ | 網路資料接收軟中斷 |
BLOCK_SOFTIRQ | 塊裝置的軟中斷 |
BLOCK_IOPOLL_SOFTIRQ | 支援IO輪詢的塊裝置軟中斷 |
TASKLET_SOFTIRQ | tasklet 軟中斷 |
SCHED_SOFTIRQ | 排程軟中斷 |
HRTIMER_SOFTIRQ | 高精度定時器軟中斷 |
RCU_SOFTIRQ | RCU 軟中斷 |
NR_SOFTIRQS | 軟中斷數,為10 |
一共有 10 個軟中斷,因此 NR_SOFTIRQS 為 10,因此陣列 softirq_vec 有 10 個元素。 softirq_action 結構體中的 action 成員變數就是軟中斷的服務函式,陣列 softirq_vec 是個全域性陣列,因此所有的 CPU(對於 SMP 系統而言)都可以訪問到,每個 CPU 都有自己的觸發和控制機制,並且只執行自己所觸發的軟中斷。但是各個 CPU 所執行的軟中斷服務函式確是相同的,都是陣列 softirq_vec 中定義的 action 函式。
2、軟中斷的使用
2.1、註冊軟中斷處理函式
使用 open_softirq 函式註冊對應的軟中斷處理函式:
void open_softirq(int nr, void (*action)(struct softirq_action *))
引數及其含義:
引數 | 含義 |
---|---|
nr | 要開啟的軟中斷,在上面10箇中選一個 |
action | 軟中斷對應的處理函式 |
2.2、觸發軟中斷
註冊好軟中斷以後需要通過 raise_softirq 函式觸發, raise_softirq 函式原型如下:
void raise_softirq(unsigned int nr)
引數 | 含義 |
---|---|
nr | 要開啟的軟中斷,在上面10箇中選一個 |
軟中斷必須
void __init softirq_init(void)
{
int cpu;
for_each_possible_cpu(cpu)
{
per_cpu(tasklet_vec, cpu).tail =
&per_cpu(tasklet_vec, cpu).head;
per_cpu(tasklet_hi_vec, cpu).tail =
&per_cpu(tasklet_hi_vec, cpu).head;
}
open_softirq(TASKLET_SOFTIRQ, tasklet_action);
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
}
softirq_init 函式預設會開啟 TASKLET_SOFTIRQ 和HI_SOFTIRQ。