Linux中斷下半部實現(xiàn)的三種方法_第1頁
Linux中斷下半部實現(xiàn)的三種方法_第2頁
Linux中斷下半部實現(xiàn)的三種方法_第3頁
Linux中斷下半部實現(xiàn)的三種方法_第4頁
Linux中斷下半部實現(xiàn)的三種方法_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第第頁Linux中斷下半部實現(xiàn)的三種方法

什么是中斷下半部

當產(chǎn)生一個中斷時,會進入中斷處理程序。

但中斷處理程序必須快速、異步、簡單的對(硬件)做出迅速響應(yīng)并完成那些時間要求很嚴格的操作。

因此,對于那些其他的、對時間要求相對寬松的任務(wù),就應(yīng)該推后到中斷被激活以后再去運行。

這樣,整個中斷處理流程就被分為了兩個部分:

第一個部分是中斷處理程序(上半部),內(nèi)核通過對它的異步執(zhí)行完成對硬件中斷的即時響應(yīng)。中斷處理流程中的另外那一部分,下半部(bottomhalf)下半部的任務(wù)主要是執(zhí)行與中斷相關(guān)的工作,這些工作沒有被中斷服務(wù)程序本身完成。

下半部并不需要指明一個確切時間,只要把這些任務(wù)推遲一點,讓它們在系統(tǒng)不太繁忙并且中斷恢復(fù)后執(zhí)行就可以了。

上半部和下半部的主要區(qū)別:

上半部指的是中斷處理程序,下半部則指的是一些雖然與中斷有相關(guān)性但是可以延后執(zhí)行的任務(wù)。上半部中斷不能被相同類型的中斷打斷,而下半部依然可以被中斷打斷。通常下半部在中斷處理程序一返回就會馬上運行。上半部分簡單快速,執(zhí)行的時候禁止一些或者全部中斷。下半部分稍后執(zhí)行,而且執(zhí)行期間可以響應(yīng)所有的中斷。(Linux)中,對中斷下半部的實現(xiàn)主要有三種:

軟中斷tasklet工作隊列sof(ti)rq

softirq即軟中斷,代碼位于kernel/softirq.c文件中;

每個軟中斷由softirq_(ac)tion結(jié)構(gòu)表示:

在softirq.c中定義了一個軟中斷向量數(shù)組softirq_vec:

stat(ic)structsoftirq_actionsoftirq_vec[NR_SOFTIRQS]__cacheline_aligned_in_smp;enum{HI_SOFTIRQ=0,/*用于高優(yōu)先級的tasklet*/TIMER_SOFTIRQ,/*用于(定時器)的下半部*/NET_TX_SOFTIRQ,/*用于(網(wǎng)絡(luò))層發(fā)包*/NET_RX_SOFTIRQ,/*用于網(wǎng)絡(luò)層收報*/BLOCK_SOFTIRQ,BLOCK_IOPOLL_SOFTIRQ,TASKLET_SOFTIRQ,/*用于低優(yōu)先級的tasklet*/SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ,/*PreferableRCUshouldalwaysbethelastsoftirq*/NR_SOFTIRQS};數(shù)組的成員數(shù)由NR_SOFTIRQS決定,是一個枚舉常量。

新增一個軟中斷時,需要在文件include/linux/interrupt.h中添加一個枚舉常量。

軟中斷使用的幾個要點:

一個軟中斷不會搶占另外一個軟中斷。惟一可以搶占軟中斷的是中斷處理程序。其他的軟中斷可以在其他(處理器)上同時執(zhí)行。相關(guān)(接口)

注冊軟中斷voidopen_softirq(intnr,void(*action)(structsoftirq_action*))即注冊對應(yīng)類型的處理函數(shù)到全局數(shù)組softirq_vec中。

觸發(fā)軟中斷voidraise_softirq(unsignedintnr)實際上即以軟中斷類型nr作為偏移量會置位irq_stat[(cpu)_id]的成員變量__softirq_pending.

__softirq_pending字段中的每一個bit,對應(yīng)著某一個軟中斷,某個bit被置位,說明有相應(yīng)的軟中斷等待處理。

這也是同一類型軟中斷可以在多個cpu上并行運行的根本原因。

軟中斷實例

以一個按鍵驅(qū)動的中斷處理為例,將按鍵驅(qū)動的中斷處理分成上下兩部分:

上半部:讀取鍵值,觸發(fā)軟中斷下半部:喚醒進程

軟中斷的注冊,在驅(qū)動的入口函數(shù),注冊軟中斷:

添加的枚舉常量:

可以看到,使用軟中斷是需要修改內(nèi)核,添加一個枚舉的,有些繁瑣。

所以,通常我們不建議擅自增加軟中斷的數(shù)量,如果需要新的軟中斷,盡可能把它們實現(xiàn)為基于軟中斷的tasklet形式。

tasklet

tasklet是利用軟中斷實現(xiàn)的一種下半部機制。

那是用軟中斷還是tasklet好呢?

選擇到底是用軟中斷還是tasklet其實很簡單:

通常你應(yīng)該用tasklet。就像我們在前面看到的,軟中斷資源有限,也麻煩,而且軟中斷的使用者屈指可數(shù)。它只在那些執(zhí)行頻率很高和連續(xù)性要求很高的情況下才需要。而tasklet卻有更廣泛的用途。大多數(shù)情況下用tasklet效果都不錯,而且它們還非常容易使用。因為tasklet是通過軟中斷實現(xiàn)的,所以它們本身也是軟中斷。tasklet使用

tasklet的使用步驟如下:

1、編寫tasklet處理函數(shù)(下半部)

voidmy_tasklet_fun(unsignedlongdata)2、聲明tasklet

//靜態(tài)DECLARE_TASKLET(my_tasklet,my_tasklet_fun,data);//動態(tài)Structtasklet_structxxx;tasklet_init("class="hljslessvditor-linenumber">tasklet_schedule(登記my_tasklet,然后允許系統(tǒng)在合適的時間調(diào)度它。

tasklet實例

以按鍵中斷驅(qū)動為例:

先使用DECLARE_TASKLET靜態(tài)聲明一個tasklet,指定其下半部函數(shù)為btn_tasklet_func,在中斷服務(wù)函數(shù)(上半部)獲取按鍵值后,調(diào)用tasklet_schedule調(diào)度。

w(or)kqueue

workqueue即工作隊列,也是中斷下半部的一種。

Workqueue將下半部工作推遲給一個內(nèi)核線程去執(zhí)行——work總是運行于進程上下文.

兩個要點:

如果推遲的工作需要睡眠,則使用workqueues。否則使用softirq或tasklets.Workqueue

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論