中斷處理函數(shù)如何【發(fā)送信號(hào)】給應(yīng)用層?
目錄
· 驅(qū)動(dòng)程序
示例代碼全貌
Makefile 文件
編譯、測(cè)試
· 應(yīng)用程序
示例代碼全貌
編譯、測(cè)試
別人的經(jīng)驗(yàn),我們的階梯!
大家好,我是道哥,今天我為大伙兒解說(shuō)的技術(shù)知識(shí)點(diǎn)是:【中斷程序如何發(fā)送信號(hào)給應(yīng)用層】。
最近分享的幾篇文章都比較基礎(chǔ),關(guān)于字符類設(shè)備的驅(qū)動(dòng)程序,以及中斷處理程序。
也許在現(xiàn)代的項(xiàng)目是用不到這樣的技術(shù),但是萬(wàn)丈高樓平地起。
只有明白了這些最基礎(chǔ)的知識(shí)點(diǎn)之后,再去看那些進(jìn)化出來(lái)的高級(jí)玩意,才會(huì)有一步一個(gè)腳印的獲得感。
如果缺少了這些基礎(chǔ)的環(huán)節(jié),很多深層次的東西,學(xué)起來(lái)就有點(diǎn)空中樓閣的感覺(jué)。
就好比研究Linux內(nèi)核,如果一上來(lái)就從Linux 4.x/5.x內(nèi)核版本開(kāi)始研究,可以看到很多“歷史遺留”代碼。
這些代碼就見(jiàn)證著Linux一步一步的發(fā)展歷史,甚至有些人還會(huì)專門(mén)去研究 Linux 0.11 版本的內(nèi)核源碼,因?yàn)楹芏嗷舅枷攵际且粯拥摹?/p>
今天這篇文章,主要還是以代碼實(shí)例為主,把之前的兩個(gè)知識(shí)點(diǎn)結(jié)合起來(lái):
在中斷處理函數(shù)中,發(fā)送信號(hào)給應(yīng)用層,以此來(lái)通知應(yīng)用層處理響應(yīng)的中斷業(yè)務(wù)。

驅(qū)動(dòng)程序
示例代碼全貌
所有的操作都是在 ~/tmp/linux-4.15/drivers 目錄下完成的。
首先創(chuàng)建驅(qū)動(dòng)模塊目錄:
$ cd ~/tmp/linux-4.15/drivers
$ mkdir my_driver_interrupt_signal
$ touch my_driver_interrupt_signal.c
文件內(nèi)容如下:








以上代碼主要做了兩件事情:
1. 注冊(cè)中斷號(hào) 1 的處理函數(shù):myirq_h(yuǎn)andler();
2. 創(chuàng)建設(shè)備節(jié)點(diǎn) /dev/mydev;
這里的中斷號(hào)1,是鍵盤(pán)中斷。
因?yàn)樗枪蚕淼闹袛啵虼水?dāng)鍵盤(pán)被按下的時(shí)候,操作系統(tǒng)就會(huì)依次調(diào)用所有的中斷處理函數(shù),當(dāng)然就包括我們的驅(qū)動(dòng)程序所注冊(cè)的這個(gè)函數(shù)。
中斷處理部分相關(guān)的幾處關(guān)鍵代碼如下:

在中斷處理函數(shù)中,目標(biāo)是發(fā)送信號(hào) SIGUSR1 到應(yīng)用層,因此驅(qū)動(dòng)程序需要知道應(yīng)用程序的進(jìn)程號(hào)(PID)。
根據(jù)之前的文章Linux驅(qū)動(dòng)實(shí)踐:驅(qū)動(dòng)程序如何發(fā)送【信號(hào)】給應(yīng)用程序?,應(yīng)用程序必須主動(dòng)把自己的 PID 告訴驅(qū)動(dòng)模塊才可以。這可以通過(guò) write 或者ioctl函數(shù)來(lái)實(shí)現(xiàn),
驅(qū)動(dòng)程序用來(lái)接收 PID 的相關(guān)代碼是:

知道了應(yīng)用程序的 PID,驅(qū)動(dòng)程序就可以在中斷發(fā)生的時(shí)候(按下鍵盤(pán)ESC鍵),發(fā)送信號(hào)出去了:

Makefile 文件

編譯、測(cè)試
首先查看一下加載驅(qū)動(dòng)模塊之前,1號(hào)中斷的所有驅(qū)動(dòng)程序:

再看一下設(shè)備號(hào):
$ cat /proc/devices

因?yàn)轵?qū)動(dòng)注冊(cè)在創(chuàng)建設(shè)備節(jié)點(diǎn)的時(shí)候,是動(dòng)態(tài)請(qǐng)求系統(tǒng)分配的。
根據(jù)之前的幾篇文章可以知道,系統(tǒng)一般會(huì)分配244這個(gè)主設(shè)備號(hào)給我們,此刻還不存在這個(gè)設(shè)備號(hào)。
編譯、加載驅(qū)動(dòng)模塊:
$ make
$ sudo insmod my_driver_interrupt_signal.ko
首先看一下 dmesg 的輸出信息:

然后看一下中斷驅(qū)動(dòng)程序:

可以看到我們的驅(qū)動(dòng)程序( mydev )已經(jīng)登記在1號(hào)中斷的最右面。
最后看一下設(shè)備節(jié)點(diǎn)情況:

驅(qū)動(dòng)模塊已經(jīng)準(zhǔn)備妥當(dāng),下面就是應(yīng)用程序了。
應(yīng)用程序
應(yīng)用程序的主要功能就是兩部分:
通過(guò) ioctl 函數(shù)把自己的 PID 告訴驅(qū)動(dòng)程序;
注冊(cè)信號(hào) SIGUSR1 的處理函數(shù);
示例代碼全貌


在應(yīng)用程序的最后,是一個(gè) while(1) 死循環(huán)。因?yàn)橹挥性诎聪骆I盤(pán)上的ESC按鍵時(shí),驅(qū)動(dòng)程序才會(huì)發(fā)送信號(hào)上來(lái),因此應(yīng)用程序需要一直存活著。
編譯、測(cè)試
新開(kāi)一個(gè)中斷窗口,編譯、執(zhí)行應(yīng)用程序:

由于應(yīng)用程序調(diào)用了 open 和 ioctl 這兩個(gè)函數(shù),因此,驅(qū)動(dòng)程序中兩個(gè)對(duì)應(yīng)的函數(shù)就會(huì)被執(zhí)行。
這可以通過(guò) dmesg 命令的輸出信息看出來(lái):

這個(gè)時(shí)候,按下鍵盤(pán)上的 ESC 鍵,此時(shí)驅(qū)動(dòng)程序中打印如下信息:

說(shuō)明:驅(qū)動(dòng)程序捕獲到了鍵盤(pán)上的 ESC 鍵,并且發(fā)送信號(hào)給應(yīng)用程序了。
在執(zhí)行應(yīng)用程序的終端窗口中,可以看到如下輸出信息:

說(shuō)明:應(yīng)用程序接收到了驅(qū)動(dòng)程序發(fā)來(lái)的信號(hào)!
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-

落地?zé)o錫!京東首個(gè)物流機(jī)器人超級(jí)工廠來(lái)了
-

OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹(shù)機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-

長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
最新活動(dòng)更多
-
6月30日立即申請(qǐng)?jiān)囉?> 【免費(fèi)試用】旭之源工業(yè)電源一一機(jī)器人的穩(wěn)定“心臟“
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)】物理場(chǎng)仿真助力生物醫(yī)學(xué)領(lǐng)域技術(shù)創(chuàng)新
-
精彩回顧立即查看>> 【直播】 智測(cè)未來(lái)·2026海克斯康春季產(chǎn)品創(chuàng)新日
-
精彩回顧立即查看>> 【線下論壇】新唐科技×芯唐南京 2026 年度研討會(huì)
-
精彩回顧立即查看>> OFweek 2026(第十五屆)中國(guó)機(jī)器人產(chǎn)業(yè)大會(huì)
-
精彩回顧立即查看>> 維科杯· OFweek 2025中國(guó)機(jī)器人行業(yè)年度評(píng)選
推薦專題
-
2 華為,重大突破!
- 1 人形機(jī)器人“第一股”來(lái)了!宇樹(shù)科技即將上會(huì)
- 2 全球股市陷AI獨(dú)大結(jié)構(gòu)性瘋狂
- 3 AI狂歡遇上油價(jià)破百,全球股市還能漲多久? | 產(chǎn)聯(lián)看全球
- 4 DeepSeek融資500億,梁文鋒難逃資本局
- 5 谷歌2026 I/O大會(huì)完整回顧:模型依然重要,但智能體正在接管一切
- 6 全球資本,重倉(cāng)中國(guó)機(jī)器人
- 7 Figure AI 交付突破350臺(tái),陪跑特斯拉會(huì)迎來(lái)iPhone 時(shí)刻嗎?
- 8 Anthropic發(fā)布2028年全球AI領(lǐng)導(dǎo)力的兩種情景報(bào)告
- 9 “國(guó)產(chǎn)GPU第一股”摩爾線程首季扭虧,但造血能力仍待考驗(yàn)
- 10 特斯拉宣布監(jiān)督版FSD登陸中國(guó)?
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市


分享





