linux 2.6中斷下半部機制分析_第1頁
已閱讀1頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、摘要本文主要從使用者的角度對Linux2.6內核的下半部機制softirq、tasklet和wkqueue進行分析,對于這三種機制在內核中的具體實現(xiàn)并未進行深入分析,倘若讀者有興趣了解,可以直接閱讀Linux內核源代碼的相關部分。1概述概述中斷服務程序往往都需要在CPU關中斷的情況下運行,以避免中斷嵌套而使控制復雜化,但是關中斷的時間又不能太長,否則會造成中斷信號的丟失。為此,在Linux中,將中斷處理程序分為兩部分,即上半部和下半部。

2、上半部通常用于執(zhí)行跟硬件關系密切的關鍵程序,這部分執(zhí)行時間非常短,而且是在關中斷的環(huán)境下運行的。對時間要求不是很嚴格,而且通常比較耗時的一些操作,則交給下半部來執(zhí)行,這部分代碼是在開中斷中執(zhí)行的。上半部處理硬件相關,稱為硬件中斷,這通常需要立即執(zhí)行。下半部則可以延遲一定時間,在內核合適的時間段來執(zhí)行程序,這就是我們這里要討論的軟中斷。本文以目前最新版本的Linux內核2.6.22為例,來討論Linux的中斷下半部機制。在2.6版本的內核

3、中,下半部機制主要由softirq、tasklet和wkqueue來實現(xiàn),下面著重對這3種機制進行分析。2Linux2.6內核中斷下半部機制內核中斷下半部機制老版本的Linux內核中,下半部是以一種叫做BottomHalf(簡稱為BH)的機制來實現(xiàn)的,最初它是借助中斷向量來實現(xiàn)的,在系統(tǒng)中用一組(共32個)函數(shù)指針,分別表示32個中斷向量,這種實現(xiàn)方式目前在2.4版本的內核中還可以看到它的身影。但是目前在2.6版本的內核中已經(jīng)看不到它了

4、?,F(xiàn)在的Linux內核,一般以一種稱為softirq的軟中斷機制來實現(xiàn)下半部。2.1softirq機制機制原來的BH機制有兩個明顯的缺陷:一是系統(tǒng)中一次只能有一個CPU可以執(zhí)行BH代碼,二是BH函數(shù)不允許嵌套。這在單處理器系統(tǒng)中或許沒關系,但在SMP系統(tǒng)中卻是致命的缺陷。但是軟中斷機制就不一樣了。Linux的softirq機制與SMP是緊密相連的,整個softirq機制的設計與實現(xiàn)始終貫穿著一個思想:“誰觸發(fā),誰執(zhí)行”(Whomarks

5、whoruns),也就是說,每個CPU都單獨負責它所觸發(fā)的軟中斷,互不干擾。這就有效地利用了SMP系統(tǒng)的性能和特點,極大地提高了處理效率。Linux在includelinuxinterrupt.h中定義了一個softirq_action結構來描述一個softirq請求,如下所示:structsoftirq_actionvoid(action)(structsoftirq_action)voiddata其中,函數(shù)指針action指向軟中斷

6、請求的服務函數(shù),而data則指向由服務函數(shù)自行解釋的參數(shù)數(shù)據(jù)?;谏鲜鼋Y構,系統(tǒng)在kernelsoftirq.c中定義了一個全局的softirq軟中斷向量表softirq_vec[32],對應32個softirq_action結構表示的軟中斷描述符。但實際上,Linux并沒有使用到32個軟中斷向量,內核預定義了一些軟中斷向量的含義供我們使用:理器體系結構。比如對于PowerPC處理器,這個結構在includeasmpowerpchard

7、irq.h中定義如下:typedefstructunsignedint__softirq_pendingset_bitisusedonthisunsignedint__last_jiffy_stamp____cacheline_alignedirq_cpustat_texternirq_cpustat_tirq_stat[]definedinasmhardirq.h#define__IRQ_STAT(cpumember)(irq_sta

8、t[cpu].member)其中,__softirq_pending成員使用bitmap的方式來指示相應的softirq是否激活(即是否處于pending狀態(tài))。raise_softirq的主要工作就是在__softirq_pending中設置softirq的相應位,它的實現(xiàn)如下:voidfastcallraise_softirq(unsignedintnr)unsignedlongflagslocal_irq_save(flags)r

9、aise_softirq_irqoff(nr)local_irq_reste(flags)inlinefastcallvoidraise_softirq_irqoff(unsignedintnr)__raise_softirq_irqoff(nr)if(!in_interrupt())wakeup_softirqd()喚醒內核線程ksoftirqd#define__raise_softirq_irqoff(nr)do_softirq_p

10、ending(1UL(nr))while(0)#define_softirq_pending(x)(local_softirq_pending()|=(x))#definelocal_softirq_pending()__IRQ_STAT(smp_process_id()__softirq_pending)這里有一個宏函數(shù)local_softirq_pending(),其實就是用于返回當前cpu的相應irq_cpustat_t結構irq

11、_stat[cpu]的__softirq_pending成員值。因此__raise_softirq_irqoff(nr)的作用就是把要觸發(fā)的softirq在__softirq_pending中的相應位置1,在do_softirq()中則通過檢查irq_stat[cpu]中相應的pending位是否設置來執(zhí)行該softirq。2.2tasklet機制機制tasklet實際上是一種較為特殊的軟中斷,軟中斷向量HI_SOFTIRQ和TASKL

12、ET_SOFTIRQ均是用tasklet機制來實現(xiàn)的。tasklet一詞原意為“小片任務”,在這里指一小段可執(zhí)行的代碼。從某種程度上來講,tasklet機制是Linux內核對BH機制的一種擴展,但是它和BH不同,不同的tasklet代碼在同一時刻可以在多個CPU上并行執(zhí)行。同時,它又和一般的softirq軟中斷不一樣,一段tasklet代碼在同一時刻只能在一個CPU上運行,而softirq中注冊的軟中斷服務函數(shù)(即softirq_act

溫馨提示

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

評論

0/150

提交評論