概述
從本質(zhì)上來(lái)講苍糠,中斷是一種電信號(hào),當(dāng)設(shè)備有某種事件發(fā)生時(shí)啤誊,它就會(huì)產(chǎn)生中斷岳瞭,通過(guò)總線(xiàn)把電信號(hào)發(fā)送給中斷控制器。如果中斷的線(xiàn)是激活的蚊锹,中斷控制器就把電信號(hào)發(fā)送給處理器的某個(gè)特定引腳瞳筏。處理器于是立即停止自己正在做的事,跳到中斷處理程序的入口點(diǎn)枫耳,進(jìn)行中斷處理乏矾。
(1) 硬中斷
由與系統(tǒng)相連的外設(shè)(比如網(wǎng)卡、硬盤(pán))自動(dòng)產(chǎn)生的迁杨。主要是用來(lái)通知操作系統(tǒng)系統(tǒng)外設(shè)狀態(tài)的變化钻心。比如當(dāng)網(wǎng)卡收到數(shù)據(jù)包的時(shí)候,就會(huì)發(fā)出一個(gè)中斷铅协。我們通常所說(shuō)的中斷指的是硬中斷(hardirq)捷沸。
(2) 軟中斷
為了滿(mǎn)足實(shí)時(shí)系統(tǒng)的要求,中斷處理應(yīng)該是越快越好狐史。linux為了實(shí)現(xiàn)這個(gè)特點(diǎn)痒给,當(dāng)中斷發(fā)生的時(shí)候,硬中斷處理那些短時(shí)間就可以完成的工作骏全,而將那些處理事件比較長(zhǎng)的工作苍柏,放到中斷之后來(lái)完成,也就是軟中斷(softirq)來(lái)完成姜贡。
(3) 中斷嵌套
Linux下硬中斷是可以嵌套的试吁,但是沒(méi)有優(yōu)先級(jí)的概念,也就是說(shuō)任何一個(gè)新的中斷都可以打斷正在執(zhí)行的中斷楼咳,但同種中斷除外熄捍。軟中斷不能嵌套,但相同類(lèi)型的軟中斷可以在不同CPU上并行執(zhí)行母怜。
(4) 軟中斷指令
int是軟中斷指令余耽。
中斷向量表是中斷號(hào)和中斷處理函數(shù)地址的對(duì)應(yīng)表。
int n - 觸發(fā)軟中斷n苹熏。相應(yīng)的中斷處理函數(shù)的地址為:中斷向量表地址 + 4 * n碟贾。
(5)硬中斷和軟中斷的區(qū)別
軟中斷是執(zhí)行中斷指令產(chǎn)生的币喧,而硬中斷是由外設(shè)引發(fā)的。
硬中斷的中斷號(hào)是由中斷控制器提供的袱耽,軟中斷的中斷號(hào)由指令直接指出粱锐,無(wú)需使用中斷控制器。
硬中斷是可屏蔽的扛邑,軟中斷不可屏蔽怜浅。
硬中斷處理程序要確保它能快速地完成任務(wù),這樣程序執(zhí)行時(shí)才不會(huì)等待較長(zhǎng)時(shí)間蔬崩,稱(chēng)為上半部恶座。
軟中斷處理硬中斷未完成的工作,是一種推后執(zhí)行的機(jī)制沥阳,屬于下半部跨琳。
當(dāng)比如單片機(jī)這種沒(méi)有操作系統(tǒng)的,中斷處理函數(shù)不能有輸入?yún)?shù)也不能有函數(shù)返回桐罕。因?yàn)橹袛喽际切┯布詣?dòng)調(diào)用脉让,沒(méi)有程序去給他傳遞參數(shù),也沒(méi)有硬件去接收參數(shù)功炮。?那其它函數(shù)怎么傳參數(shù)給它呢溅潜?一般都是通過(guò)全局變量方式。不過(guò)為了避免中斷函數(shù)重入薪伏,我們可以在進(jìn)入中斷服務(wù)函數(shù)之后將中斷關(guān)閉滚澜,處理完后再開(kāi)中斷。
不過(guò)x86計(jì)算機(jī)的軟中斷和硬件中斷時(shí)可以有參數(shù)傳遞嫁怀,有專(zhuān)門(mén)程序去給它傳遞參數(shù)设捐。
(1) 注冊(cè)中斷處理函數(shù)
注冊(cè)中斷處理函數(shù):
/** ?* irq: 要分配的中斷號(hào) ?* handler: 要注冊(cè)的中斷處理函數(shù) ?* flags: 標(biāo)志(一般為0) ?* name: 設(shè)備名(dev->name) ?* dev: 設(shè)備(struct net_device *dev),作為中斷處理函數(shù)的參數(shù) ?* 成功返回0 ?*/ int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,? ? ? const char *name, void *dev);
中斷處理函數(shù)本身:
typedefirqreturn_t?(*irq_handler_t)?(int,void*);
/**
*?enum?irqreturn
*?@IRQ_NONE:?interrupt?was?not?from?this?device
*?@IRQ_HANDLED:?interrupt?was?handled?by?this?device
*?@IRQ_WAKE_THREAD:?handler?requests?to?wake?the?handler?thread
*/
enumirqreturn?{
IRQ_NONE,
IRQ_HANDLED,
IRQ_WAKE_THREAD,
};
typedefenumirqreturn?irqreturn_t;
#define?IRQ_RETVAL(x)?((x)?!=?IRQ_NONE)
所以中斷服務(wù)函數(shù)帶不帶形參和返回值主要是看中斷是發(fā)生在裸機(jī)上還是實(shí)時(shí)系統(tǒng)中塘淑。
http://blog.csdn.net/xy010902100449/article/details/49247527