linux軟中斷與tasklet

2021-07-01 18:44:29 字數 3187 閱讀 4560

軟中斷軟中斷由

struct softirq_action{

void(*action)(struct softirq_action *)

}表示。並且當前核心中的軟中斷總數固定為32個,由陣列static struct softirq_actionsoftirq_vec[nr_softirqs]來表示。

目前只用到了其中的9個。包括定時器、網路、tasklet等。

軟中斷的執行是通過do_softirq來查詢陣列softirq_vec[nr_softirqs]對應的點陣圖,檢視是否有軟中斷掛起,

有則將已掛起的軟中斷通過:

h=softirq_vec

h->action(h)

來執行對應的軟中斷的action函式。所以,只要呼叫do_softirq都會查詢軟中斷,並處理掛起的軟中斷。

一般do_softirq會在下列地方會執行:

1.      硬體中斷返回函式,在硬體中斷的返回函式irq_exit()會呼叫do_softirq(通過函式do_softirq的包裝函式

invoke_softirq()間接訪問)

2.      ksoftirqd核心執行緒

3.      顯式呼叫do_softirq處,例如網路驅動中等

軟中斷的使用

首先,需使用新的軟中斷,則需使用者在核心中分配新的索引

然後,通過open_softirq()函式註冊乙個軟中斷的處理函式,

例如open_softirq(tasklet_softirq,tasklet_action),其中tasklet_action函式即為軟中斷處理函式。

最後,需要在別的地方通過raise_softirq(tasklet_softirq)來觸發軟中斷。

以使處理器擇機盡早通過do_softirq來執行tasklet_action函式。假如在中斷中使用了tasklet,則在硬體中斷

退出前會有機會執行。

此處說明下ksoftirqd執行緒,該執行緒通過是early_initcall(spawn_ksoftirqd)

spawn_ksoftirqd-> cpu_callback –>kthread_create建立。

假如raise_softirq的步驟不是在中斷處理函式中完成的(通過tasklet_schedule會執行raise_softirq操作),

或者raise_softirq之後一直未產生硬體中斷,則軟中斷最後的執行是由呼叫了do_softirq函式的此執行緒來完成的,

或者如網絡卡驅動中直接顯示呼叫do_softirq函式。值得說明的是,正是由於在硬體中斷退出前會執行do_softirq,

使得採用tasklet的中斷下半部效能很好。因為加入系統負荷不重,則tasklet會被立即執行。但其執行絕對不會晚於

下個核心時間片。因為中斷退出後就會執行do_softirq,核心時間片採用的是定時器中斷,在其中斷處理函式退出前

會呼叫do_softirq,所以tasklet的執行時間比較有保障,其效能比同樣用於中斷下半部的工作佇列高很多。

但是,假如是由ksoftirqd來處理的其他型別軟中斷效能可能就會差一點。

tasklet軟中斷

tasklet是在軟中斷tasklet_softirq的基礎上實現的重要步驟如下:

首先,tasklet可通過declare_tasklet(my_tasklet,my_tasklet_handler,dev)

巨集來初始化乙個tasklet_struct。此處的task_handler為tasklet的處理函式。

其次,通過tasklet_schedule()將tasklet排程,以便有機會盡早的執行。

其中應該將第二步放在中斷處理函式中,這樣執行完中斷處理函式後就有立即有

機會執行tasklet了。

tasklet和軟中斷的關係

首先系統在初始化的時候在start_kernel函式中通過呼叫softirq_init()函式,

在softirq_init()函式中通過呼叫open_softirq(tasklet_softirq,tasklet_action);

來註冊乙個軟中斷,其處理函式為tasklet_action。註冊之後還需呼叫raise_softirq函式

來告訴核心tasklet_softirq軟中斷已掛起,以使處理器可以盡早處理該型軟中斷。

掛起的操作通過tasklet_schedule()函式間接呼叫raise_softirq()函式來實現

void __tasklet_schedule(structtasklet_struct *t)

此後則等待中斷處理函式退出後呼叫do_softirq來執行tasklet_softirq軟中斷的處理函式asklet_action。

static void tasklet_action(structsoftirq_action *a)

可以發現在tasklet_action函式中,會獲取tasklet鍊錶,然後依次

輪訓已註冊的tasklet處理函式。例如之前通過declar_tasklet巨集註冊的

my_tasklet_handler函式。

所以最終在驅動中使用tasklet需要的工作是:

1.初始化乙個tasklet_struct結構,並註冊對應的tasklet處理函式。

2.tasklet處理函式的實現

核心定時器

核心的定時器是通過定時器軟中斷實現的。

核心部分:

1.註冊軟中斷:在核心啟動時,在start_kernel函式中通過呼叫init_timers->open_softirq(timer_softirq, run_timer_softirq)

實現註冊timer_softirq軟中斷,其中run_timer_softirq函式為軟中斷處理函式。

2.中斷掛起:timer_interrupt->update_process_times->run_local_timers->raise_softirq(timer_softirq);

其中timer_interrupt函式為定時器中斷處理函式

驅動部分:

1.初始化乙個timer_list,特別是初始化其中的func函式指標

2.func函式的實現,此為核心定時器中斷處理函式。即定時時間到後,會呼叫此函式。

具體執行

在核心時間片到,定時器硬體中斷退出時,會呼叫do_softirq函式。在此函式中先呼叫軟中斷處理函式run_timer_softirq,在此處理

函式中檢視和修改核心定時器鍊錶上的定時器。若定時時間到,則通過timer->func呼叫定時器處理函式。

軟中斷與硬中斷

軟中斷 1.程式設計異常通常叫做軟中斷 2.軟中斷是通訊程序之間用來模擬硬中斷的 一種訊號通訊方式。3.中斷源發中斷請求或軟中斷訊號後,cpu或接收程序在適當的時機自動進行中斷處理或完成軟中斷訊號對應的功能 4.軟中斷是軟體實現的中斷,也就是程式執行時其他程式對它的中斷 而硬中斷是硬體實現的中斷,是...

軟中斷與硬中斷

軟中斷 1.程式設計異常通常叫做軟中斷 2.軟中斷是通訊程序之間用來模擬硬中斷的 一種訊號通訊方式。3.中斷源發中斷請求或軟中斷訊號後,cpu或接收程序在適當的時機自動進行中斷處理或完成軟中斷訊號對應的功能 4.軟中斷是軟體實現的中斷,也就是程式執行時其他程式對它的中斷 而硬中斷是硬體實現的中斷,是...

Linux軟中斷通訊

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