




已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系網(wǎng)站刪除Linux 中斷1 介紹我們知道,處理器的處理速度比硬件來說要快上N個(gè)數(shù)量級(jí),那么由處理器向硬件發(fā)出請(qǐng)求并等待回應(yīng)的辦法顯然是不可取的,在這期間處理器浪費(fèi)了大量的時(shí)間。這些時(shí)間應(yīng)該被用來處理其他的事務(wù)。輪詢可能是解決辦法之一,但顯然這樣的辦法也會(huì)讓處理器做大量的無用功。最好的辦法,就是讓硬件在需要的時(shí)候才向內(nèi)核發(fā)出信號(hào),然后處理器去響應(yīng)硬件的請(qǐng)求。這就是中斷機(jī)制。1.1 什么是中斷當(dāng)硬件需要和處理器通信時(shí),會(huì)產(chǎn)生一個(gè)電信號(hào)(即中斷信號(hào)),并發(fā)往處理器,處理器收到后,會(huì)告訴OS,然后由OS進(jìn)行后續(xù)處理。每一種硬件設(shè)備都有其專門的中斷值,OS得以通過這個(gè)來進(jìn)行區(qū)分,到底是哪個(gè)設(shè)備發(fā)生了中斷。這些中斷值又被稱為中斷請(qǐng)求(IRQ)當(dāng)然有的IRQ是動(dòng)態(tài)分配的。其實(shí)OS關(guān)注的并不是某個(gè)設(shè)備一定要產(chǎn)生某個(gè)特定的IRQ,而是一個(gè)特定的IRQ要和一個(gè)特定的設(shè)備有映射的關(guān)系,而且OS需要知道這種關(guān)系。這就表明,即便是IRQ在多個(gè)設(shè)備之間進(jìn)行共享也是可以的,只要OS能夠知道這些映射關(guān)系,并且能夠有辦法區(qū)分某一個(gè)時(shí)刻產(chǎn)生中斷的設(shè)備是哪一個(gè)即可。1.2 中斷處理程序中斷處理程序,顧名思義,自然就是發(fā)生中斷時(shí),需要調(diào)用的處理函數(shù)。特點(diǎn):、不是每設(shè)備一個(gè)處理程序,而是每中斷一個(gè)處理程序一個(gè)設(shè)備可以有多個(gè)中斷處理程序。、運(yùn)行于特殊的上下文中:中斷上下文、一般的中斷處理程序,都會(huì)關(guān)中斷,考慮到中斷隨時(shí)都有可能發(fā)生,處理程序應(yīng)當(dāng)盡可能的高效、一般中斷處理程序都是要和硬件打交道的1.3 中斷上下文1.3.1 回憶進(jìn)程上下文、 對(duì)內(nèi)核而言,處于進(jìn)程上下文表明內(nèi)核處于這樣一種模式:進(jìn)程在執(zhí)行(系統(tǒng)調(diào)用或者運(yùn)行內(nèi)核線程)、 可以通過current宏關(guān)聯(lián)當(dāng)前進(jìn)程、 進(jìn)程以進(jìn)程上下文的形式關(guān)聯(lián)內(nèi)核,使得在進(jìn)程上下文中可以睡眠,也可以調(diào)用調(diào)度程序。1.3.2 中斷上下文中斷上下文,則和進(jìn)程上下文幾乎完全相反:和進(jìn)程無關(guān)、和current宏無關(guān)不能睡眠、不能調(diào)用會(huì)導(dǎo)致睡眠的函數(shù)。另外,處于中斷上下文的代碼,應(yīng)當(dāng)迅速、簡潔,盡量把工作放到下半部中去完成。關(guān)于中斷使用的堆棧:2.6的內(nèi)核之前,中斷沒有自己的堆棧,而是與被中斷的內(nèi)核線程共享該線程的堆棧(2頁)。2.6之后,內(nèi)核增加了一個(gè)選項(xiàng):每個(gè)內(nèi)核線程只提供一頁內(nèi)存,這減輕了內(nèi)存的壓力,也同時(shí)促使中斷被分離了出來:每處理器一頁,稱為中斷棧1.4 中斷的實(shí)現(xiàn)機(jī)制Linux中,中斷的處理機(jī)制是依賴于體系結(jié)構(gòu)的(處理器、中斷控制器、體系結(jié)構(gòu)的設(shè)計(jì)、機(jī)器本身)。下圖是中斷的路由1.5 關(guān)于中斷的下半部我們?yōu)槭裁葱枰掳氩浚恳驗(yàn)槲覀円阎袛嗵幚碇行枰龅墓ぷ鲄^(qū)分開來:中斷處理程序中,只處理那些有嚴(yán)格時(shí)間限制的工作,比如復(fù)位硬件,對(duì)中斷進(jìn)行應(yīng)答等。而那些可以拖到后面做的,或者說有可能睡眠的處理,都應(yīng)當(dāng)放到下半部去處理這樣做的目的很顯然,就是讓中斷處理程序盡可能的簡潔明快在適當(dāng)?shù)臅r(shí)機(jī),下半部會(huì)開中斷執(zhí)行2 中斷控制為什么要控制中斷?控制中斷的原因,說到底還是為了要進(jìn)行同步。通過禁止中斷,可以確保該中斷不會(huì)搶占當(dāng)前運(yùn)行的代碼。禁止中斷還可以禁止內(nèi)核搶占。需要注意的是,中斷都是對(duì)每處理器而言(中斷堆棧),也就是說,禁止中斷并不能夠保證自己使用的數(shù)據(jù)不會(huì)被其他處理器的并發(fā)進(jìn)程所訪問到。因此如果在使用某些全局的數(shù)據(jù)時(shí),需要考慮對(duì)其進(jìn)行加鎖保護(hù)。即:鎖提供機(jī)制,防止來自其他處理器(當(dāng)然也可以是本處理器)的并發(fā)訪問,中斷提供機(jī)制,防止來自其他中斷處理程序的并發(fā)訪問。2.1 禁止和激活中斷這里需要注意的是,內(nèi)核提供兩類接口:禁止/激活中斷,保存/恢復(fù)中斷狀態(tài)。前者比較傻瓜,會(huì)無條件的禁止/激活中斷,這需要使用者對(duì)當(dāng)前的中斷狀態(tài)十分確定。而后者則相對(duì)更容易使用,免去了判斷另外關(guān)于cli()與sti(): 在2.5版本之前的內(nèi)核,提供“禁止所有處理器上的中斷”這樣的功能,現(xiàn)在已經(jīng)去掉了,需要開發(fā)人員用鎖來避免并發(fā)。這么做的好處是,是的代碼更加流線化,不會(huì)簇?fù)沓蓤F(tuán)。而且使用粒度更細(xì)的鎖,會(huì)比全局鎖要效率高。2.2 禁止指定中斷線我們當(dāng)然不用禁止全局的中斷,有時(shí)候禁止某一條中斷線就可以了,這是指:凡是在該中斷線上產(chǎn)生的中斷,都將不會(huì)報(bào)告給處理器。一般對(duì)于有多個(gè)中斷處理程序共享的中斷線,并不建議使用這個(gè)功能,因?yàn)檫@會(huì)導(dǎo)致這條線上的其他的設(shè)備無法傳遞中斷。2.3 中斷系統(tǒng)的狀態(tài)有時(shí)候我們需要判斷代碼所處的狀態(tài):是否在中斷上下文中。因?yàn)橛行┎僮魇侵挥性谶M(jìn)程上下文中才能夠進(jìn)行的,比如睡眠。系統(tǒng)提供接口,來判斷中斷是否被禁止、是否處于中斷上下文、是否正在執(zhí)行中斷處理程序。3 下半部一般的中斷處理都會(huì)分為兩個(gè)部分,前面講到的中斷處理程序只是所謂的上半部,這是系統(tǒng)處理中斷不可或缺的一部分。但是由于中斷處理程序本身的局限,僅靠上半部是無法高效的處理系統(tǒng)的所有中斷的,這就需要下半部來提供支持。3.1 為什么需要下半部3.1.1 上半部的局限、 中斷處理程序異步執(zhí)行,且有可能打斷其他代碼,包括其他的中斷處理程序、 中斷處理程序執(zhí)行時(shí),會(huì)禁止該中斷同級(jí)的其他中斷,甚至禁止全局所有中斷、 往往需要對(duì)硬件進(jìn)行操作、 中斷處理程序在中斷上下文中運(yùn)行,有很多限制以上幾點(diǎn),就要求中斷處理程序不僅要簡潔、高效,而且對(duì)于阻塞這種行為也是不能支持的,這就導(dǎo)致上半部的限制很多。3.1.2 使用下半部、 處理中斷時(shí),工作推后到下半部的原因,就是為了突破上面提到的局限性,要盡可能的將那些可以推后執(zhí)行的工作都放到下半部,提高系統(tǒng)的響應(yīng)速度、 下半部何時(shí)被調(diào)用?這個(gè)跟中斷處理選擇用何種下半部機(jī)制有關(guān),可以是推后一段時(shí)間,也可以是通過定時(shí)器、 下半部的特點(diǎn):在進(jìn)行處理的時(shí)候,隨時(shí)都有可能響應(yīng)中斷、 除了Linux,很多其他的操作系統(tǒng)也采用了同樣的機(jī)制3.2 下半部介紹、 下半部的實(shí)現(xiàn)方式,在2.6的內(nèi)核中,有3種:軟中斷、tasklet、工作隊(duì)列。軟中斷用的比較少,只有有限的幾種使用場(chǎng)景,更多的是使用tasklet、 內(nèi)核定時(shí)器,同樣也能夠?qū)⒐ぷ魍坪笠欢螘r(shí)間(精確的)進(jìn)行3.3 軟中斷3.3.1 軟中斷的實(shí)現(xiàn)、 軟中斷是在內(nèi)核編譯期間靜態(tài)分配的,不能夠動(dòng)態(tài)裁剪。系統(tǒng)定義了一個(gè)32個(gè)元素的數(shù)組,但是目前只用到了寥寥幾個(gè)。多數(shù)還是通過tasklet來實(shí)現(xiàn)、 軟中斷不會(huì)搶占相同處理器上的其他軟中斷,軟中斷會(huì)被中斷給打斷、 軟中斷的執(zhí)行:中斷處理程序在返回之前,將對(duì)應(yīng)的軟中斷進(jìn)行標(biāo)記(觸發(fā)軟中斷),然后系統(tǒng)會(huì)在合適的時(shí)機(jī)檢查該標(biāo)記,并執(zhí)行軟中斷(從中斷處理程序返回時(shí)、在ksoftirqd內(nèi)核線程中、顯示檢查與處理軟中斷的代碼)。3.3.2 軟中斷的使用、 軟中斷是給系統(tǒng)中對(duì)時(shí)間要求最嚴(yán)格,以及最重要的下半部來使用。目前只有兩個(gè)子系統(tǒng)在使用:網(wǎng)絡(luò)子系統(tǒng)以及SCSI子系統(tǒng)、 執(zhí)行軟中斷處理程序的時(shí)候,能夠相應(yīng)中斷,但自己不能睡眠、 軟中斷雖然可以禁止本處理器上的同類軟中斷,但是對(duì)不同處理器的同類軟中斷是沒有限制的(這就意味著潛在的數(shù)據(jù)并發(fā)訪問)。因此我們需要考慮同步(加鎖、或者使用每處理器數(shù)據(jù))、 對(duì)于軟中斷,只有執(zhí)行頻率很高,連續(xù)性要求很高的情況下,才考慮使用3.4 Tasklet3.4.1 tasklet的實(shí)現(xiàn)、 tasklet的實(shí)現(xiàn)是基于軟中斷的,所以其本身也是軟中斷、 tasklet可以靜態(tài)定義,也可以動(dòng)態(tài)創(chuàng)建3.4.2 tasklet的調(diào)度、 已觸發(fā)的tasklet,分為兩類:普通優(yōu)先級(jí) / 高優(yōu)先級(jí)的軟中斷(前面提到過)、 Tasklet調(diào)度函數(shù)首先檢查狀態(tài),若已經(jīng)被調(diào)度過一次,則立刻返回、 保存中斷狀態(tài),禁止本地中斷、 設(shè)置tasklet需要處理的標(biāo)記并開中斷、 在合適的時(shí)候,執(zhí)行do_softirq(),通過內(nèi)部調(diào)用,獲取對(duì)應(yīng)狀態(tài)的tasklet鏈表,對(duì)每一個(gè)tasklet進(jìn)行處理:如果是RUN狀態(tài),則跳過同一時(shí)間內(nèi),同樣的tasklet只有一個(gè)能夠執(zhí)行,否則標(biāo)記為RUN并執(zhí)行之,執(zhí)行后取消RUN的狀態(tài)標(biāo)記總的來說:每一個(gè)tasklet都重復(fù)設(shè)置HI_SOFTIRQ / TASKLET_SOFTIRQ這2個(gè)軟中斷進(jìn)行,當(dāng)一個(gè)tasklet被調(diào)度時(shí),某一類軟中斷被喚醒并被特殊的處理函數(shù)進(jìn)行處理,該函數(shù)處理執(zhí)行所有被觸發(fā)的tasklet(不同類型的tasklet可以同時(shí)執(zhí)行,同類的則只能有一個(gè))3.4.3 tasklet的使用、 tasklet的使用比較簡單,步驟就是創(chuàng)建(靜/動(dòng))、注冊(cè)自己的處理函數(shù)、調(diào)度、或者從待運(yùn)行鏈表中刪除、 注意你的處理函數(shù)中,不應(yīng)該使用信號(hào)量,不應(yīng)該進(jìn)行睡眠、 注意對(duì)和其他類型tasklet、軟中斷等進(jìn)行了共享的數(shù)據(jù)進(jìn)行加鎖保護(hù)3.4.4 關(guān)于ksoftirqd內(nèi)核線程問題描述:軟中斷與tasklet(實(shí)際上也是軟中斷),被觸發(fā)的頻率實(shí)際上是相當(dāng)高的,而且軟中斷自己還會(huì)重新觸發(fā)軟中斷(比如網(wǎng)絡(luò)子系統(tǒng)),這么一來就很有可能導(dǎo)致用戶空間甚至得不到處理器時(shí)間,長時(shí)間處于饑餓狀態(tài)兩個(gè)簡單的方案:一是只要還有被觸發(fā)的待處理的軟中斷,本次執(zhí)行就要負(fù)責(zé)處理,中途觸發(fā)的軟中斷也要處理。二是不處理重新觸發(fā)的軟中斷,等到下一次執(zhí)行。上述兩個(gè)方案的不足:前者在系統(tǒng)負(fù)載很高的時(shí)候,軟中斷會(huì)被不停的觸發(fā),以至于用戶空間幾乎都得不到響應(yīng);后者雖然保證了用戶進(jìn)程不會(huì)挨餓,但是卻犧牲了軟中斷的性能,在系統(tǒng)空閑時(shí)沒有充分利用系統(tǒng)資源ksoftirqd/n 線程:這組內(nèi)核線程是上述兩種方案的最后折中產(chǎn)物,該線程每處理器一個(gè),并以最低nice值運(yùn)行。內(nèi)核在每次執(zhí)行軟中斷時(shí),都不會(huì)處理重新觸發(fā)的軟中斷,該工作由ksoftirqd線程進(jìn)行。當(dāng)負(fù)載較高時(shí),其他線程由于優(yōu)先級(jí)較高,自然能夠獲取處理器資源;相反當(dāng)系統(tǒng)較空閑時(shí),ksoftirqd線程能被立刻調(diào)度,那么軟中斷也就可以被立刻執(zhí)行。下面是ksoftirqd:3.5 工作隊(duì)列3.5.1 原理與實(shí)現(xiàn)、 工作隊(duì)列是內(nèi)核提供的第三種下半部機(jī)制,與前兩種有所不同,最主要的區(qū)別就是工作隊(duì)列將工作推后給一個(gè)內(nèi)核線程events/n去執(zhí)行。意味著可以進(jìn)行睡眠,意味著當(dāng)需要信號(hào)量、阻塞、大量內(nèi)存時(shí),工作隊(duì)列應(yīng)該是你的首選、 每個(gè)處理器都會(huì)有一個(gè)工作者線程,也同時(shí)對(duì)應(yīng)一個(gè)workque_struct,用戶將需要進(jìn)行處理的工作掛到工作隊(duì)列中,當(dāng)線程被調(diào)用,則會(huì)判斷工作隊(duì)列是否為空,為空則睡眠,否則執(zhí)行隊(duì)列中的任務(wù)、 工作者隊(duì)列一般只有系統(tǒng)默認(rèn)的event類型,對(duì)應(yīng)到系統(tǒng)中是每個(gè)處理器一個(gè)events線程。如果要增加工作隊(duì)列類型,那么會(huì)導(dǎo)致增加處理器個(gè)數(shù)個(gè)內(nèi)核線程,所以增加類型一定要慎重3.5.2 使用工作隊(duì)列、 可以通過靜態(tài)方式(DECLARE_WORK)或者動(dòng)態(tài)方式(INIT_WORK)定義自己的工作隊(duì)列、 處理函數(shù)雖然運(yùn)行在進(jìn)程上下文,但不應(yīng)該訪問用戶空間的數(shù)據(jù)、 默認(rèn)情況下,處理函數(shù)允許響應(yīng)中斷,不持有任何鎖,可以在需要的時(shí)候進(jìn)行睡眠、 調(diào)度工作隊(duì)列時(shí),可以簡單指明需要調(diào)度,也可以具體指明經(jīng)過多少時(shí)鐘節(jié)拍后再進(jìn)行調(diào)度。同時(shí),內(nèi)核也提供了刷新工作隊(duì)列的接口(睡眠等待所有工作完成),有時(shí)候會(huì)需要這樣的刷新操作來確保不再有待處理的工作、 如果有需要,可以定義新的工作隊(duì)列類型3.6 下半部之間加鎖、 不同類tasklet之間需要考慮數(shù)據(jù)的同步、 軟中斷之間需要考慮數(shù)據(jù)同步、 進(jìn)程上下文與下半部共享數(shù)據(jù),在訪問數(shù)據(jù)前,要禁止下半部處理,并獲取鎖、 中斷上下文與下半部共享數(shù)據(jù),在訪問數(shù)據(jù)前,要禁止中斷,并獲取鎖、 工作隊(duì)列由于可能睡眠,也需要考慮數(shù)據(jù)同步4 實(shí)現(xiàn)自己的中斷我們可以在系統(tǒng)中添加屬于自己的中斷處理,包括中斷處理程序以及可能需要的下半部。4.1 注冊(cè)中斷處理程序在編寫中斷處理程序之前,需要申請(qǐng)中斷線,并且注冊(cè)自己的處理函數(shù)。這里需要注意的有:中斷線是可以多個(gè)設(shè)備共享的,當(dāng)共享中斷線時(shí),通過設(shè)備id來進(jìn)行區(qū)分;初始化硬件和注冊(cè)中斷處理函數(shù)的順序要對(duì),避免在硬件初始化之前就開始執(zhí)行中斷處理程序。4.2 編寫中斷處理程序、 通常標(biāo)記為static、 至少也要通知硬件,中斷已經(jīng)收到、 對(duì)于較復(fù)雜的設(shè)備,可能需要發(fā)送、接受數(shù)據(jù),甚至做一些擴(kuò)展工作、 擴(kuò)展工作應(yīng)當(dāng)盡量放到下半部、 一般會(huì)在處理程序中先關(guān)中斷,所以可以不用考慮重入(中斷的嵌套,只會(huì)是不同類型的中斷)、 如果訪問其他共享數(shù)據(jù),比如和其他高優(yōu)先級(jí)中斷處理程序共享的數(shù)據(jù)時(shí),要考慮同步問題、 多個(gè)設(shè)備可以共享
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 滑板考試題目及答案
- 助理廣告師考試突破難點(diǎn)試題及答案
- 醫(yī)療藥劑考試題及答案
- 天水中考道法試題及答案
- 湖北護(hù)士筆試題目及答案
- 城管執(zhí)法面試試題及答案
- 助理廣告師考試如何運(yùn)用心理學(xué)提升廣告效果試題及答案
- 2024年紡織工程師證書考試調(diào)研動(dòng)態(tài)試題及答案
- 數(shù)字技術(shù)如何重塑廣告行業(yè)的現(xiàn)狀試題及答案
- 2024年新型紡織材料考證試題及答案
- 社會(huì)工作介入老年社區(qū)教育的探索
- 國開電大-工程數(shù)學(xué)(本)-工程數(shù)學(xué)第4次作業(yè)-形考答案
- 高考倒計(jì)時(shí)30天沖刺家長會(huì)課件
- 施工項(xiàng)目現(xiàn)金流預(yù)算管理培訓(xùn)課件
- 時(shí)行疾病(中醫(yī)兒科學(xué)課件)
- 街道計(jì)生辦主任先進(jìn)事跡材料-巾幗弄潮顯風(fēng)流
- GB/T 32616-2016紡織品色牢度試驗(yàn)試樣變色的儀器評(píng)級(jí)方法
- 部編版小學(xué)語文三年級(jí)下冊(cè)第七單元整體解讀《奇妙的世界》課件
- 管道支吊架培訓(xùn)教材課件
- 2、工程工質(zhì)量保證體系框圖
- 地鐵工程車輛段路基填方施工方案
評(píng)論
0/150
提交評(píng)論