1. 程式人生 > 其它 >Linux核心筆記--軟中斷

Linux核心筆記--軟中斷

技術標籤:Linux軟中斷

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_SOFTIRQtasklet 軟中斷
SCHED_SOFTIRQ排程軟中斷
HRTIMER_SOFTIRQ高精度定時器軟中斷
RCU_SOFTIRQRCU 軟中斷
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箇中選一個

軟中斷必須

在編譯的時候靜態註冊! Linux 核心使用 softirq_init 函式初始化軟中斷,softirq_init 函式定義在 kernel/softirq.c 檔案裡面,函式內容如下:

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。