亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 1393 | 回復(fù): 0
打印 上一主題 下一主題

Linux中軟中斷機(jī)制分析 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-05-27 10:19 |只看該作者 |倒序?yàn)g覽

什么是軟中斷機(jī)制?
       Linux中的軟中斷機(jī)制用于系統(tǒng)中對(duì)時(shí)間要求最嚴(yán)格以及最重要的中斷下半部進(jìn)行使用。在系統(tǒng)設(shè)計(jì)過(guò)程中,大家都清楚中斷上下文不能處理太多的事情,需要快速的返回,否則很容易導(dǎo)致中斷事件的丟失,所以這就產(chǎn)生了一個(gè)問(wèn)題:中斷發(fā)生之后的事務(wù)處理由誰(shuí)來(lái)完成?在前后臺(tái)程序中,由于只有中斷上下文和一個(gè)任務(wù)上下文,所以中斷上下文觸發(fā)事件,設(shè)置標(biāo)記位,任務(wù)上下文循環(huán)掃描標(biāo)記位,執(zhí)行相應(yīng)的動(dòng)作,也就是中斷發(fā)生之后的事情由任務(wù)來(lái)完成了,只不過(guò)任務(wù)上下文采用掃描的方式,實(shí)時(shí)性不能得到保證。在Linux系統(tǒng)和Windows系統(tǒng)中,這個(gè)不斷循環(huán)的任務(wù)就是本文所要講述的軟中斷daemon。在Windows中處理耗時(shí)的中斷事務(wù)稱之為中斷延遲處理,在Linux中稱之為中斷下半部,顯然中斷上半部處理清中斷之類十分清閑的動(dòng)作,然后在退出中斷服務(wù)程序時(shí)觸發(fā)中斷下半部,完成具體的功能。
       在Linux中,中斷下半部的實(shí)現(xiàn)基于軟中斷機(jī)制。所以理清楚軟中斷機(jī)制的原理,那么中斷下半部的實(shí)現(xiàn)也就非常簡(jiǎn)單了。通過(guò)上述的描述,大家也應(yīng)該清楚為什么要定義軟中斷機(jī)制了,一句話就是為了要處理對(duì)時(shí)間要求苛刻的任務(wù),恰好中斷下半部就有這樣的需求,所以其實(shí)現(xiàn)采用了軟中斷機(jī)制。
軟中斷機(jī)制實(shí)現(xiàn)原理      
    軟中斷機(jī)制的實(shí)現(xiàn)原理如下圖所示:

構(gòu)成軟中斷機(jī)制的核心元素包括:
1、  軟中斷狀態(tài)寄存器soft interrupt state(irq_stat)
2、  軟中斷向量表(softirq_vec)
3、  軟中斷守護(hù)daemon

軟中斷的工作工程模擬了實(shí)際的中斷處理過(guò)程,當(dāng)某一軟中斷時(shí)間發(fā)生后,首先需要設(shè)置對(duì)應(yīng)的中斷標(biāo)記位,觸發(fā)中斷事務(wù),然后喚醒守護(hù)線程去檢測(cè)中斷狀態(tài)寄存器,如果通過(guò)查詢發(fā)現(xiàn)某一軟中斷事務(wù)發(fā)生之后,那么通過(guò)軟中斷向量表調(diào)用軟中斷服務(wù)程序action()。這就是軟中斷的過(guò)程,與硬件中斷唯一不同的地方是從中斷標(biāo)記到中斷服務(wù)程序的映射過(guò)程。在CPU的硬件中斷發(fā)生之后,CPU需要將硬件中斷請(qǐng)求通過(guò)向量表映射成具體的服務(wù)程序,這個(gè)過(guò)程是硬件自動(dòng)完成的,但是軟中斷不是,其需要守護(hù)線程去實(shí)現(xiàn)這一過(guò)程,這也就是軟件模擬的中斷,故稱之為軟中斷。

       一個(gè)軟中斷不會(huì)去搶占另一個(gè)軟中斷,只有硬件中斷才可以搶占軟中斷,所以軟中斷能夠保證對(duì)時(shí)間的嚴(yán)格要求。

Linux中軟中斷實(shí)現(xiàn)分析
       在Linux中最多可以注冊(cè)32個(gè)軟中斷,目前系統(tǒng)用了6個(gè)軟中斷,他們?yōu)椋憾〞r(shí)器處理、SCSI處理、網(wǎng)絡(luò)收發(fā)處理以及Tasklet機(jī)制,這里的tasklet機(jī)制就是用來(lái)實(shí)現(xiàn)下半部的,

       描述軟中斷的核心數(shù)據(jù)結(jié)構(gòu)為中斷向量表,其定義如下:
       struct softirq_action
{
              void (*action)(struct softirq_action *); /* 軟中斷服務(wù)程序 */
              void *data;                                         /* 服務(wù)程序輸入?yún)?shù) */
};

       軟中斷守護(hù)daemon是軟中斷機(jī)制的實(shí)現(xiàn)核心,其實(shí)現(xiàn)過(guò)程也比較簡(jiǎn)單,通過(guò)查詢軟中斷狀態(tài)irq_stat來(lái)判斷事件是否發(fā)生,如果發(fā)生,那么映射到軟中斷向量表,調(diào)用執(zhí)行注冊(cè)的action函數(shù)就可以了。從這一點(diǎn)分析可以看出,軟中斷的服務(wù)程序的執(zhí)行上下文為軟中斷daemon。在Linux中軟中斷daemon線程函數(shù)為do_softirq()。

       觸發(fā)軟中斷事務(wù)通過(guò)raise_softirq()來(lái)實(shí)現(xiàn),該函數(shù)就是在中斷關(guān)閉的情況下設(shè)置軟中斷狀態(tài)位,然后判斷如果不在中斷上下文,那么直接喚醒守護(hù)daemon。

       常用的軟中斷函數(shù)列表如下:
1、  Open_softirq,注冊(cè)一個(gè)軟中斷,將軟中斷服務(wù)程序注冊(cè)到軟中斷向量表。
2、  Raise_softirq,設(shè)置軟中斷狀態(tài)bitmap,觸發(fā)軟中斷事務(wù)。

Tasklet機(jī)制實(shí)現(xiàn)分析      
        Tasklet為一個(gè)軟中斷,考慮到優(yōu)先級(jí)問(wèn)題,分別占用了向量表中的0號(hào)和5號(hào)軟中斷。Tasklet機(jī)制的實(shí)現(xiàn)原理如下圖所示:

    當(dāng)tasklet的軟中斷事件發(fā)生之后,執(zhí)行tasklet-action的軟中斷服務(wù)程序,該服務(wù)程序會(huì)掃描一個(gè)tasklet的任務(wù)列表,執(zhí)行該任務(wù)中的具體服務(wù)程序。在這里舉一個(gè)例子加以說(shuō)明:
       當(dāng)用戶讀寫USB設(shè)備之后,發(fā)生了硬件中斷,硬件中斷服務(wù)程序會(huì)構(gòu)建一個(gè)tasklet_struct,在該結(jié)構(gòu)中指明了完成該中斷任務(wù)的具體方法函數(shù)(下半部執(zhí)行函數(shù)),然后將tasklet_struct掛入tasklet的tasklet_struct鏈表中,這一步可以通過(guò)tasklet_schedule函數(shù)完成。最后硬件中斷服務(wù)程序退出并且CPU開始調(diào)度軟中斷daemon,軟中斷daemon會(huì)發(fā)現(xiàn)tasklet發(fā)生了事件,其會(huì)執(zhí)行tasklet-action,然后tasklet-action會(huì)掃描tasklet_struct鏈表,執(zhí)行具體的USB中斷服務(wù)程序下半部。這就是應(yīng)用tasklet完成中斷下半部實(shí)現(xiàn)的整個(gè)過(guò)程。

       Linux中的tasklet實(shí)現(xiàn)比較簡(jiǎn)單,其又封裝了一個(gè)重要數(shù)據(jù)結(jié)構(gòu)tasklet_struct,使用tasklet主要函數(shù)列表如下:
1、  tasklet_init,初始化一個(gè)tasklet_struct,當(dāng)然可以采用靜態(tài)初始化的方法,宏為:DECLARE_TASKLET。
2、  tasklet_schedule,調(diào)度一個(gè)tasklet,將輸入的tasklet_struct添加到tasklet的鏈表中。
Linux中的軟中斷機(jī)制就是模擬了硬件中斷的過(guò)程,其設(shè)計(jì)思想完全可以在其他嵌入式OS中得以應(yīng)用。
再引用另外一篇文章:
軟中斷是利用硬件中斷的概念,用軟件方式進(jìn)行模擬,實(shí)現(xiàn)宏觀上的異步執(zhí)行效果。很多情況下,軟中斷和"信號(hào)"有些類似,同時(shí),軟中斷又是和硬中斷相對(duì)應(yīng)的,"硬中斷是外部設(shè)備對(duì)CPU的中斷","軟中斷通常是硬中斷服務(wù)程序?qū)?nèi)核的中斷","信號(hào)則是由內(nèi)核(或其他進(jìn)程)對(duì)某個(gè)進(jìn)程的中斷"
文章出處:
http://www.diybl.com/course/6_system/linux/linuxjq/2007211/16605.html



本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u2/64540/showart_1945962.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP