婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > linux中斷的上半部和下半部詳解

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

熱門標(biāo)簽:百度中國(guó)地圖標(biāo)注中心 pageadm實(shí)現(xiàn)地圖標(biāo)注 安陽百應(yīng)電銷機(jī)器人加盟 山東企業(yè)電銷機(jī)器人價(jià)格 琿春市地圖標(biāo)注app 百度地圖標(biāo)注開鎖電話 依蘭縣地圖標(biāo)注app 公司400電話辦理價(jià)格 潮州地圖標(biāo)注

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

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

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

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

然后,在需要調(diào)度tasklet的時(shí)候引用一個(gè)簡(jiǎn)單的API就能使系統(tǒng)在適當(dāng)?shù)臅r(shí)候進(jìn)行調(diào)度運(yùn)行:

tasklet_schedule(my_tasklet);

此外,Linux還提供了另外一些其它的控制tasklet調(diào)度與運(yùn)行的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的可調(diào)度位,即不允許調(diào)度該tasklet

我們先來看一個(gè)tasklet的運(yùn)行實(shí)例,這個(gè)實(shí)例沒有任何實(shí)際意義,僅僅為了演示。它的功能是:在globalvar被寫入一次后,就調(diào)度一個(gè)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;
}

//調(diào)度tasklet執(zhí)行
tasklet_schedule(test_tasklet);
return sizeof(int);
}

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

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

軟中斷:

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

2、最多可以有32個(gè)軟中斷。

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

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

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

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

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

tasklet:

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

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

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

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

5、大部分情況使用tasklet。

工作隊(duì)列:

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

2、可以睡眠,阻塞。

標(biāo)簽:河池 山南 榆林 河北 淘寶邀評(píng) 滄州 保定 樂山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《linux中斷的上半部和下半部詳解》,本文關(guān)鍵詞  linux,中斷,的,上半部,和,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《linux中斷的上半部和下半部詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于linux中斷的上半部和下半部詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 延川县| 大荔县| 宁津县| 德钦县| 苍梧县| 赣榆县| 宣汉县| 成安县| 瑞丽市| 沙雅县| 锦屏县| 定州市| 泗阳县| 赤水市| 城口县| 福安市| 化州市| 平武县| 万荣县| 桂东县| 裕民县| 邯郸市| 从江县| 新沂市| 平安县| 博湖县| 肥东县| 个旧市| 建宁县| 乌兰浩特市| 电白县| 商丘市| 庆阳市| 汤原县| 崇仁县| 仁寿县| 苗栗县| 汤阴县| 靖边县| 灵武市| 新郑市|