国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

linux中斷的上半部和下半部詳解

2020-07-10 11:04:53
字體:
來源:轉載
供稿:網(wǎng)友

與Linux中斷息息相關的一個重要概念是Linux中斷分為兩個半部:上半部(tophalf)和下半部(bottom half)。上半部的功能是"登記中斷",當一個中斷發(fā)生時,它進行相應地硬件讀寫后就把中斷例程的下半部掛到該設備的下半部執(zhí)行隊列中去。因此,上半部執(zhí)行的速度就會很快,可以服務更多的中斷請求。但是,僅有"登記中斷"是遠遠不夠的,因為中斷的事件可能很復雜。因此,Linux引入了一個下半部,來完成中斷事件的絕大多數(shù)使命。下半部和上半部最大的不同是下半部是可中斷的,而上半部是不可中斷的,下半部幾乎做了中斷處理程序所有的事情,而且可以被新的中斷打斷!下半部則相對來說并不是非常緊急的,通常還是比較耗時的,因此由系統(tǒng)自行安排運行時機,不在中斷服務上下文中執(zhí)行。

Linux實現(xiàn)下半部的機制主要有tasklet和工作隊列。

Tasklet基于Linux softirq,其使用相當簡單,我們只需要定義tasklet及其處理函數(shù)并將二者關聯(lián):

void my_tasklet_func(unsigned long); //定義一個處理函數(shù):DECLARE_TASKLET(my_tasklet,my_tasklet_func,data); //定義一個tasklet結構my_tasklet,與my_tasklet_func(data)函數(shù)相關聯(lián)

然后,在需要調度tasklet的時候引用一個簡單的API就能使系統(tǒng)在適當?shù)臅r候進行調度運行:

tasklet_schedule(&my_tasklet);

此外,Linux還提供了另外一些其它的控制tasklet調度與運行的API:

DECLARE_TASKLET_DISABLED(name,function,data); //與DECLARE_TASKLET類似,但等待tasklet被使能tasklet_enable(struct tasklet_struct *); //使能tasklet tasklet_disble(struct tasklet_struct *); //禁用tasklet tasklet_init(struct tasklet_struct *,void (*func)(unsigned long),unsigned long); //類似DECLARE_TASKLET() tasklet_kill(struct tasklet_struct *); // 清除指定tasklet的可調度位,即不允許調度該tasklet

我們先來看一個tasklet的運行實例,這個實例沒有任何實際意義,僅僅為了演示。它的功能是:在globalvar被寫入一次后,就調度一個tasklet,函數(shù)中輸出"tasklet is executing":

#include … //定義與綁定tasklet函數(shù)void test_tasklet_action(unsigned long t);DECLARE_TASKLET(test_tasklet, test_tasklet_action, 0);void test_tasklet_action(unsigned long t){printk("tasklet is executing/n");}…ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off){…if (copy_from_user(&global_var, buf, sizeof(int))){return - EFAULT;}//調度tasklet執(zhí)行tasklet_schedule(&test_tasklet);return sizeof(int);}

下半部分的任務就是執(zhí)行與中斷處理密切相關但中斷處理程序本身不執(zhí)行的工作。在Linux2.6的內(nèi)核中存在三種不同形式的下半部實現(xiàn)機制:軟中斷,tasklet和工作隊列。

下面將比較三種機制的差別與聯(lián)系。

軟中斷:

1、軟中斷是在編譯期間靜態(tài)分配的。

2、最多可以有32個軟中斷。

3、軟中斷不會搶占另外一個軟中斷,唯一可以搶占軟中斷的是中斷處理程序。

4、可以并發(fā)運行在多個CPU上(即使同一類型的也可以)。所以軟中斷必須設計為可重入的函數(shù)(允許多個CPU同時操作),

因此也需要使用自旋鎖來保護其數(shù)據(jù)結構。

5、目前只有兩個子系直接使用軟中斷:網(wǎng)絡和SCSI。

6、執(zhí)行時間有:從硬件中斷代碼返回時、在ksoftirqd內(nèi)核線程中和某些顯示檢查并執(zhí)行軟中斷的代碼中。

tasklet:

1、tasklet是使用兩類軟中斷實現(xiàn)的:HI_SOFTIRQ和TASKLET_SOFTIRQ。

2、可以動態(tài)增加減少,沒有數(shù)量限制。

3、同一類tasklet不能并發(fā)執(zhí)行。

4、不同類型可以并發(fā)執(zhí)行。

5、大部分情況使用tasklet。

工作隊列:

1、由內(nèi)核線程去執(zhí)行,換句話說總在進程上下文執(zhí)行。

2、可以睡眠,阻塞。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇坪县| 石泉县| 清镇市| 垦利县| 通化市| 揭阳市| 光泽县| 江津市| 丹寨县| 岫岩| 凌源市| 巍山| 通渭县| 红河县| 河南省| 申扎县| 庆阳市| 邹平县| 鸡东县| 资兴市| 潢川县| 饶河县| 垣曲县| 奈曼旗| 济南市| 长丰县| 汝城县| 贵溪市| 德保县| 麦盖提县| 新宾| 竹山县| 汾阳市| 融水| 天长市| 安塞县| 额济纳旗| 新丰县| 神池县| 白城市| 四平市|