Linux 學習筆記 - 中斷.doc_第1頁
Linux 學習筆記 - 中斷.doc_第2頁
Linux 學習筆記 - 中斷.doc_第3頁
Linux 學習筆記 - 中斷.doc_第4頁
Linux 學習筆記 - 中斷.doc_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

此文檔收集于網(wǎng)絡,如有侵權(quán),請聯(lián)系網(wǎng)站刪除Linux 中斷1 介紹我們知道,處理器的處理速度比硬件來說要快上N個數(shù)量級,那么由處理器向硬件發(fā)出請求并等待回應的辦法顯然是不可取的,在這期間處理器浪費了大量的時間。這些時間應該被用來處理其他的事務。輪詢可能是解決辦法之一,但顯然這樣的辦法也會讓處理器做大量的無用功。最好的辦法,就是讓硬件在需要的時候才向內(nèi)核發(fā)出信號,然后處理器去響應硬件的請求。這就是中斷機制。1.1 什么是中斷當硬件需要和處理器通信時,會產(chǎn)生一個電信號(即中斷信號),并發(fā)往處理器,處理器收到后,會告訴OS,然后由OS進行后續(xù)處理。每一種硬件設備都有其專門的中斷值,OS得以通過這個來進行區(qū)分,到底是哪個設備發(fā)生了中斷。這些中斷值又被稱為中斷請求(IRQ)當然有的IRQ是動態(tài)分配的。其實OS關(guān)注的并不是某個設備一定要產(chǎn)生某個特定的IRQ,而是一個特定的IRQ要和一個特定的設備有映射的關(guān)系,而且OS需要知道這種關(guān)系。這就表明,即便是IRQ在多個設備之間進行共享也是可以的,只要OS能夠知道這些映射關(guān)系,并且能夠有辦法區(qū)分某一個時刻產(chǎn)生中斷的設備是哪一個即可。1.2 中斷處理程序中斷處理程序,顧名思義,自然就是發(fā)生中斷時,需要調(diào)用的處理函數(shù)。特點:、不是每設備一個處理程序,而是每中斷一個處理程序一個設備可以有多個中斷處理程序。、運行于特殊的上下文中:中斷上下文、一般的中斷處理程序,都會關(guān)中斷,考慮到中斷隨時都有可能發(fā)生,處理程序應當盡可能的高效、一般中斷處理程序都是要和硬件打交道的1.3 中斷上下文1.3.1 回憶進程上下文、 對內(nèi)核而言,處于進程上下文表明內(nèi)核處于這樣一種模式:進程在執(zhí)行(系統(tǒng)調(diào)用或者運行內(nèi)核線程)、 可以通過current宏關(guān)聯(lián)當前進程、 進程以進程上下文的形式關(guān)聯(lián)內(nèi)核,使得在進程上下文中可以睡眠,也可以調(diào)用調(diào)度程序。1.3.2 中斷上下文中斷上下文,則和進程上下文幾乎完全相反:和進程無關(guān)、和current宏無關(guān)不能睡眠、不能調(diào)用會導致睡眠的函數(shù)。另外,處于中斷上下文的代碼,應當迅速、簡潔,盡量把工作放到下半部中去完成。關(guān)于中斷使用的堆棧:2.6的內(nèi)核之前,中斷沒有自己的堆棧,而是與被中斷的內(nèi)核線程共享該線程的堆棧(2頁)。2.6之后,內(nèi)核增加了一個選項:每個內(nèi)核線程只提供一頁內(nèi)存,這減輕了內(nèi)存的壓力,也同時促使中斷被分離了出來:每處理器一頁,稱為中斷棧1.4 中斷的實現(xiàn)機制Linux中,中斷的處理機制是依賴于體系結(jié)構(gòu)的(處理器、中斷控制器、體系結(jié)構(gòu)的設計、機器本身)。下圖是中斷的路由1.5 關(guān)于中斷的下半部我們?yōu)槭裁葱枰掳氩??因為我們要把中斷處理中需要做的工作區(qū)分開來:中斷處理程序中,只處理那些有嚴格時間限制的工作,比如復位硬件,對中斷進行應答等。而那些可以拖到后面做的,或者說有可能睡眠的處理,都應當放到下半部去處理這樣做的目的很顯然,就是讓中斷處理程序盡可能的簡潔明快在適當?shù)臅r機,下半部會開中斷執(zhí)行2 中斷控制為什么要控制中斷?控制中斷的原因,說到底還是為了要進行同步。通過禁止中斷,可以確保該中斷不會搶占當前運行的代碼。禁止中斷還可以禁止內(nèi)核搶占。需要注意的是,中斷都是對每處理器而言(中斷堆棧),也就是說,禁止中斷并不能夠保證自己使用的數(shù)據(jù)不會被其他處理器的并發(fā)進程所訪問到。因此如果在使用某些全局的數(shù)據(jù)時,需要考慮對其進行加鎖保護。即:鎖提供機制,防止來自其他處理器(當然也可以是本處理器)的并發(fā)訪問,中斷提供機制,防止來自其他中斷處理程序的并發(fā)訪問。2.1 禁止和激活中斷這里需要注意的是,內(nèi)核提供兩類接口:禁止/激活中斷,保存/恢復中斷狀態(tài)。前者比較傻瓜,會無條件的禁止/激活中斷,這需要使用者對當前的中斷狀態(tài)十分確定。而后者則相對更容易使用,免去了判斷另外關(guān)于cli()與sti(): 在2.5版本之前的內(nèi)核,提供“禁止所有處理器上的中斷”這樣的功能,現(xiàn)在已經(jīng)去掉了,需要開發(fā)人員用鎖來避免并發(fā)。這么做的好處是,是的代碼更加流線化,不會簇擁成團。而且使用粒度更細的鎖,會比全局鎖要效率高。2.2 禁止指定中斷線我們當然不用禁止全局的中斷,有時候禁止某一條中斷線就可以了,這是指:凡是在該中斷線上產(chǎn)生的中斷,都將不會報告給處理器。一般對于有多個中斷處理程序共享的中斷線,并不建議使用這個功能,因為這會導致這條線上的其他的設備無法傳遞中斷。2.3 中斷系統(tǒng)的狀態(tài)有時候我們需要判斷代碼所處的狀態(tài):是否在中斷上下文中。因為有些操作是只有在進程上下文中才能夠進行的,比如睡眠。系統(tǒng)提供接口,來判斷中斷是否被禁止、是否處于中斷上下文、是否正在執(zhí)行中斷處理程序。3 下半部一般的中斷處理都會分為兩個部分,前面講到的中斷處理程序只是所謂的上半部,這是系統(tǒng)處理中斷不可或缺的一部分。但是由于中斷處理程序本身的局限,僅靠上半部是無法高效的處理系統(tǒng)的所有中斷的,這就需要下半部來提供支持。3.1 為什么需要下半部3.1.1 上半部的局限、 中斷處理程序異步執(zhí)行,且有可能打斷其他代碼,包括其他的中斷處理程序、 中斷處理程序執(zhí)行時,會禁止該中斷同級的其他中斷,甚至禁止全局所有中斷、 往往需要對硬件進行操作、 中斷處理程序在中斷上下文中運行,有很多限制以上幾點,就要求中斷處理程序不僅要簡潔、高效,而且對于阻塞這種行為也是不能支持的,這就導致上半部的限制很多。3.1.2 使用下半部、 處理中斷時,工作推后到下半部的原因,就是為了突破上面提到的局限性,要盡可能的將那些可以推后執(zhí)行的工作都放到下半部,提高系統(tǒng)的響應速度、 下半部何時被調(diào)用?這個跟中斷處理選擇用何種下半部機制有關(guān),可以是推后一段時間,也可以是通過定時器、 下半部的特點:在進行處理的時候,隨時都有可能響應中斷、 除了Linux,很多其他的操作系統(tǒng)也采用了同樣的機制3.2 下半部介紹、 下半部的實現(xiàn)方式,在2.6的內(nèi)核中,有3種:軟中斷、tasklet、工作隊列。軟中斷用的比較少,只有有限的幾種使用場景,更多的是使用tasklet、 內(nèi)核定時器,同樣也能夠?qū)⒐ぷ魍坪笠欢螘r間(精確的)進行3.3 軟中斷3.3.1 軟中斷的實現(xiàn)、 軟中斷是在內(nèi)核編譯期間靜態(tài)分配的,不能夠動態(tài)裁剪。系統(tǒng)定義了一個32個元素的數(shù)組,但是目前只用到了寥寥幾個。多數(shù)還是通過tasklet來實現(xiàn)、 軟中斷不會搶占相同處理器上的其他軟中斷,軟中斷會被中斷給打斷、 軟中斷的執(zhí)行:中斷處理程序在返回之前,將對應的軟中斷進行標記(觸發(fā)軟中斷),然后系統(tǒng)會在合適的時機檢查該標記,并執(zhí)行軟中斷(從中斷處理程序返回時、在ksoftirqd內(nèi)核線程中、顯示檢查與處理軟中斷的代碼)。3.3.2 軟中斷的使用、 軟中斷是給系統(tǒng)中對時間要求最嚴格,以及最重要的下半部來使用。目前只有兩個子系統(tǒng)在使用:網(wǎng)絡子系統(tǒng)以及SCSI子系統(tǒng)、 執(zhí)行軟中斷處理程序的時候,能夠相應中斷,但自己不能睡眠、 軟中斷雖然可以禁止本處理器上的同類軟中斷,但是對不同處理器的同類軟中斷是沒有限制的(這就意味著潛在的數(shù)據(jù)并發(fā)訪問)。因此我們需要考慮同步(加鎖、或者使用每處理器數(shù)據(jù))、 對于軟中斷,只有執(zhí)行頻率很高,連續(xù)性要求很高的情況下,才考慮使用3.4 Tasklet3.4.1 tasklet的實現(xiàn)、 tasklet的實現(xiàn)是基于軟中斷的,所以其本身也是軟中斷、 tasklet可以靜態(tài)定義,也可以動態(tài)創(chuàng)建3.4.2 tasklet的調(diào)度、 已觸發(fā)的tasklet,分為兩類:普通優(yōu)先級 / 高優(yōu)先級的軟中斷(前面提到過)、 Tasklet調(diào)度函數(shù)首先檢查狀態(tài),若已經(jīng)被調(diào)度過一次,則立刻返回、 保存中斷狀態(tài),禁止本地中斷、 設置tasklet需要處理的標記并開中斷、 在合適的時候,執(zhí)行do_softirq(),通過內(nèi)部調(diào)用,獲取對應狀態(tài)的tasklet鏈表,對每一個tasklet進行處理:如果是RUN狀態(tài),則跳過同一時間內(nèi),同樣的tasklet只有一個能夠執(zhí)行,否則標記為RUN并執(zhí)行之,執(zhí)行后取消RUN的狀態(tài)標記總的來說:每一個tasklet都重復設置HI_SOFTIRQ / TASKLET_SOFTIRQ這2個軟中斷進行,當一個tasklet被調(diào)度時,某一類軟中斷被喚醒并被特殊的處理函數(shù)進行處理,該函數(shù)處理執(zhí)行所有被觸發(fā)的tasklet(不同類型的tasklet可以同時執(zhí)行,同類的則只能有一個)3.4.3 tasklet的使用、 tasklet的使用比較簡單,步驟就是創(chuàng)建(靜/動)、注冊自己的處理函數(shù)、調(diào)度、或者從待運行鏈表中刪除、 注意你的處理函數(shù)中,不應該使用信號量,不應該進行睡眠、 注意對和其他類型tasklet、軟中斷等進行了共享的數(shù)據(jù)進行加鎖保護3.4.4 關(guān)于ksoftirqd內(nèi)核線程問題描述:軟中斷與tasklet(實際上也是軟中斷),被觸發(fā)的頻率實際上是相當高的,而且軟中斷自己還會重新觸發(fā)軟中斷(比如網(wǎng)絡子系統(tǒng)),這么一來就很有可能導致用戶空間甚至得不到處理器時間,長時間處于饑餓狀態(tài)兩個簡單的方案:一是只要還有被觸發(fā)的待處理的軟中斷,本次執(zhí)行就要負責處理,中途觸發(fā)的軟中斷也要處理。二是不處理重新觸發(fā)的軟中斷,等到下一次執(zhí)行。上述兩個方案的不足:前者在系統(tǒng)負載很高的時候,軟中斷會被不停的觸發(fā),以至于用戶空間幾乎都得不到響應;后者雖然保證了用戶進程不會挨餓,但是卻犧牲了軟中斷的性能,在系統(tǒng)空閑時沒有充分利用系統(tǒng)資源ksoftirqd/n 線程:這組內(nèi)核線程是上述兩種方案的最后折中產(chǎn)物,該線程每處理器一個,并以最低nice值運行。內(nèi)核在每次執(zhí)行軟中斷時,都不會處理重新觸發(fā)的軟中斷,該工作由ksoftirqd線程進行。當負載較高時,其他線程由于優(yōu)先級較高,自然能夠獲取處理器資源;相反當系統(tǒng)較空閑時,ksoftirqd線程能被立刻調(diào)度,那么軟中斷也就可以被立刻執(zhí)行。下面是ksoftirqd:3.5 工作隊列3.5.1 原理與實現(xiàn)、 工作隊列是內(nèi)核提供的第三種下半部機制,與前兩種有所不同,最主要的區(qū)別就是工作隊列將工作推后給一個內(nèi)核線程events/n去執(zhí)行。意味著可以進行睡眠,意味著當需要信號量、阻塞、大量內(nèi)存時,工作隊列應該是你的首選、 每個處理器都會有一個工作者線程,也同時對應一個workque_struct,用戶將需要進行處理的工作掛到工作隊列中,當線程被調(diào)用,則會判斷工作隊列是否為空,為空則睡眠,否則執(zhí)行隊列中的任務、 工作者隊列一般只有系統(tǒng)默認的event類型,對應到系統(tǒng)中是每個處理器一個events線程。如果要增加工作隊列類型,那么會導致增加處理器個數(shù)個內(nèi)核線程,所以增加類型一定要慎重3.5.2 使用工作隊列、 可以通過靜態(tài)方式(DECLARE_WORK)或者動態(tài)方式(INIT_WORK)定義自己的工作隊列、 處理函數(shù)雖然運行在進程上下文,但不應該訪問用戶空間的數(shù)據(jù)、 默認情況下,處理函數(shù)允許響應中斷,不持有任何鎖,可以在需要的時候進行睡眠、 調(diào)度工作隊列時,可以簡單指明需要調(diào)度,也可以具體指明經(jīng)過多少時鐘節(jié)拍后再進行調(diào)度。同時,內(nèi)核也提供了刷新工作隊列的接口(睡眠等待所有工作完成),有時候會需要這樣的刷新操作來確保不再有待處理的工作、 如果有需要,可以定義新的工作隊列類型3.6 下半部之間加鎖、 不同類tasklet之間需要考慮數(shù)據(jù)的同步、 軟中斷之間需要考慮數(shù)據(jù)同步、 進程上下文與下半部共享數(shù)據(jù),在訪問數(shù)據(jù)前,要禁止下半部處理,并獲取鎖、 中斷上下文與下半部共享數(shù)據(jù),在訪問數(shù)據(jù)前,要禁止中斷,并獲取鎖、 工作隊列由于可能睡眠,也需要考慮數(shù)據(jù)同步4 實現(xiàn)自己的中斷我們可以在系統(tǒng)中添加屬于自己的中斷處理,包括中斷處理程序以及可能需要的下半部。4.1 注冊中斷處理程序在編寫中斷處理程序之前,需要申請中斷線,并且注冊自己的處理函數(shù)。這里需要注意的有:中斷線是可以多個設備共享的,當共享中斷線時,通過設備id來進行區(qū)分;初始化硬件和注冊中斷處理函數(shù)的順序要對,避免在硬件初始化之前就開始執(zhí)行中斷處理程序。4.2 編寫中斷處理程序、 通常標記為static、 至少也要通知硬件,中斷已經(jīng)收到、 對于較復雜的設備,可能需要發(fā)送、接受數(shù)據(jù),甚至做一些擴展工作、 擴展工作應當盡量放到下半部、 一般會在處理程序中先關(guān)中斷,所以可以不用考慮重入(中斷的嵌套,只會是不同類型的中斷)、 如果訪問其他共享數(shù)據(jù),比如和其他高優(yōu)先級中斷處理程序共享的數(shù)據(jù)時,要考慮同步問題、 多個設備可以共享

溫馨提示

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

評論

0/150

提交評論