時(shí)間:2019-01-17 10:24:26來源:MCU開發(fā)加油站
從本質(zhì)上來講,中斷是一種電信號(hào),當(dāng)設(shè)備有某種事件發(fā)生時(shí),它就會(huì)產(chǎn)生中斷,通過總線把電信號(hào)發(fā)送給中斷控制器。
如果中斷的線是激活的,中斷控制器就把電信號(hào)發(fā)送給處理器的某個(gè)特定引腳。處理器于是立即停止自己正在做的事,跳到中斷處理程序的入口點(diǎn),進(jìn)行中斷處理。
硬中斷
由與系統(tǒng)相連的外設(shè)(比如網(wǎng)卡、硬盤)自動(dòng)產(chǎn)生的。主要是用來通知操作系統(tǒng)系統(tǒng)外設(shè)狀態(tài)的變化。比如當(dāng)網(wǎng)卡收到數(shù)據(jù)包的時(shí)候,就會(huì)發(fā)出一個(gè)中斷。我們通常所說的中斷指的是硬中斷(hardirq)。
硬中斷是由硬件產(chǎn)生的,比如,像磁盤,網(wǎng)卡,鍵盤,時(shí)鐘等。每個(gè)設(shè)備或設(shè)備集都有它自己的IRQ(中斷請(qǐng)求)?;贗RQ,CPU可以將相應(yīng)的請(qǐng)求分發(fā)到對(duì)應(yīng)的硬件驅(qū)動(dòng)上(注:硬件驅(qū)動(dòng)通常是內(nèi)核中的一個(gè)子程序,而不是一個(gè)獨(dú)立的進(jìn)程)。
處理中斷的驅(qū)動(dòng)是需要運(yùn)行在CPU上的,因此,當(dāng)中斷產(chǎn)生的時(shí)候,CPU會(huì)中斷當(dāng)前正在運(yùn)行的任務(wù),來處理中斷。在有多核心的系統(tǒng)上,一個(gè)中斷通常只能中斷一顆CPU(也有一種特殊的情況,就是在大型主機(jī)上是有硬件通道的,它可以在沒有主CPU的支持下,可以同時(shí)處理多個(gè)中斷。)。
硬中斷可以直接中斷CPU。它會(huì)引起內(nèi)核中相關(guān)的代碼被觸發(fā)。對(duì)于那些需要花費(fèi)一些時(shí)間去處理的進(jìn)程,中斷代碼本身也可以被其他的硬中斷中斷。
對(duì)于時(shí)鐘中斷,內(nèi)核調(diào)度代碼會(huì)將當(dāng)前正在運(yùn)行的進(jìn)程掛起,從而讓其他的進(jìn)程來運(yùn)行。它的存在是為了讓調(diào)度代碼(或稱為調(diào)度器)可以調(diào)度多任務(wù)。
軟中斷
為了滿足實(shí)時(shí)系統(tǒng)的要求,中斷處理應(yīng)該是越快越好。linux為了實(shí)現(xiàn)這個(gè)特點(diǎn),當(dāng)中斷發(fā)生的時(shí)候,硬中斷處理那些短時(shí)間就可以完成的工作,而將那些處理事件比較長(zhǎng)的工作,放到中斷之后來完成,也就是軟中斷(softirq)來完成。
軟中斷的處理非常像硬中斷。然而,它們僅僅是由當(dāng)前正在運(yùn)行的進(jìn)程所產(chǎn)生的。
通常,軟中斷是一些對(duì)I/O的請(qǐng)求。這些請(qǐng)求會(huì)調(diào)用內(nèi)核中可以調(diào)度I/O發(fā)生的程序。對(duì)于某些設(shè)備,I/O請(qǐng)求需要被立即處理,而磁盤I/O請(qǐng)求通??梢耘抨?duì)并且可以稍后處理。根據(jù)I/O模型的不同,進(jìn)程或許會(huì)被掛起直到I/O完成,此時(shí)內(nèi)核調(diào)度器就會(huì)選擇另一個(gè)進(jìn)程去運(yùn)行。I/O可以在進(jìn)程之間產(chǎn)生并且調(diào)度過程通常和磁盤I/O的方式是相同。
軟中斷僅與內(nèi)核相聯(lián)系。而內(nèi)核主要負(fù)責(zé)對(duì)需要運(yùn)行的任何其他的進(jìn)程進(jìn)行調(diào)度。一些內(nèi)核允許設(shè)備驅(qū)動(dòng)的一些部分存在于用戶空間,并且當(dāng)需要的時(shí)候內(nèi)核也會(huì)調(diào)度這個(gè)進(jìn)程去運(yùn)行。
軟中斷并不會(huì)直接中斷CPU。也只有當(dāng)前正在運(yùn)行的代碼(或進(jìn)程)才會(huì)產(chǎn)生軟中斷。這種中斷是一種需要內(nèi)核為正在運(yùn)行的進(jìn)程去做一些事情(通常為I/O)的請(qǐng)求。有一個(gè)特殊的軟中斷是Yield調(diào)用,它的作用是請(qǐng)求內(nèi)核調(diào)度器去查看是否有一些其他的進(jìn)程可以運(yùn)行。
中斷嵌套
Linux下硬中斷是可以嵌套的,但是沒有優(yōu)先級(jí)的概念,也就是說任何一個(gè)新的中斷都可以打斷正在執(zhí)行的中斷,但同種中斷除外。軟中斷不能嵌套,但相同類型的軟中斷可以在不同CPU上并行執(zhí)行。
軟中斷指令
int是軟中斷指令。
中斷向量表是中斷號(hào)和中斷處理函數(shù)地址的對(duì)應(yīng)表。
intn-觸發(fā)軟中斷n。相應(yīng)的中斷處理函數(shù)的地址為:中斷向量表地址+4*n。
硬中斷和軟中斷的區(qū)別
軟中斷是執(zhí)行中斷指令產(chǎn)生的,而硬中斷是由外設(shè)引發(fā)的。
硬中斷的中斷號(hào)是由中斷控制器提供的,軟中斷的中斷號(hào)由指令直接指出,無需使用中斷控制器。
硬中斷是可屏蔽的,軟中斷不可屏蔽。
硬中斷處理程序要確保它能快速地完成任務(wù),這樣程序執(zhí)行時(shí)才不會(huì)等待較長(zhǎng)時(shí)間,稱為上半部。
軟中斷處理硬中斷未完成的工作,是一種推后執(zhí)行的機(jī)制,屬于下半部。
開關(guān)
(1)硬中斷的開關(guān)
簡(jiǎn)單禁止和激活當(dāng)前處理器上的本地中斷:local_irq_disable();local_irq_enable();
保存本地中斷系統(tǒng)狀態(tài)下的禁止和激活:unsignedlongflags;local_irq_save(flags);local_irq_restore(flags);
(2)軟中斷的開關(guān)
禁止下半部,如softirq、tasklet和workqueue等:local_bh_disable();local_bh_enable();
需要注意的是,禁止下半部時(shí)仍然可以被硬中斷搶占。
(3)判斷中斷狀態(tài)
#definein_interrupt()(irq_count())//是否處于中斷狀態(tài)(硬中斷或軟中斷)#definein_irq()(hardirq_count())//是否處于硬中斷#definein_softirq()(softirq_count())//是否處于軟中斷
聲明:本文為轉(zhuǎn)載類文章,如涉及版權(quán)問題,請(qǐng)及時(shí)聯(lián)系我們刪除(QQ:2737591964),不便之處,敬請(qǐng)諒解!
標(biāo)簽:
中國(guó)傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國(guó)傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國(guó)傳動(dòng)網(wǎng)(m.u63ivq3.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國(guó)傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>新品發(fā)布:CD300系列總線型伺服驅(qū)動(dòng)器
2024-10-31
2024-10-31
2024-10-31
新勢(shì)能 新期待|維智B1L直線伺服驅(qū)動(dòng)器
2024-10-31
纖薄之間,化繁為簡(jiǎn)|合信全新simple系...
2024-10-29
2024-10-18
推薦專題
更多>