訂閱
糾錯(cuò)
加入自媒體

中斷處理函數(shù)如何【發(fā)送信號(hào)】給應(yīng)用層?

目錄

· 驅(qū)動(dòng)程序

示例代碼全貌

Makefile 文件

編譯、測(cè)試

· 應(yīng)用程序

示例代碼全貌

編譯、測(cè)試

別人的經(jīng)驗(yàn),我們的階梯!

大家好,我是道哥,今天我為大伙兒解說的技術(shù)知識(shí)點(diǎn)是:【中斷程序如何發(fā)送信號(hào)給應(yīng)用層】。

最近分享的幾篇文章都比較基礎(chǔ),關(guān)于字符類設(shè)備的驅(qū)動(dòng)程序,以及中斷處理程序。

也許在現(xiàn)代的項(xiàng)目是用不到這樣的技術(shù),但是萬丈高樓平地起。

只有明白了這些最基礎(chǔ)的知識(shí)點(diǎn)之后,再去看那些進(jìn)化出來的高級(jí)玩意,才會(huì)有一步一個(gè)腳印的獲得感。

如果缺少了這些基礎(chǔ)的環(huán)節(jié),很多深層次的東西,學(xué)起來就有點(diǎn)空中樓閣的感覺。

就好比研究Linux內(nèi)核,如果一上來就從Linux 4.x/5.x內(nèi)核版本開始研究,可以看到很多“歷史遺留”代碼。

這些代碼就見證著Linux一步一步的發(fā)展歷史,甚至有些人還會(huì)專門去研究 Linux 0.11 版本的內(nèi)核源碼,因?yàn)楹芏嗷舅枷攵际且粯拥摹?/p>

今天這篇文章,主要還是以代碼實(shí)例為主,把之前的兩個(gè)知識(shí)點(diǎn)結(jié)合起來:

在中斷處理函數(shù)中,發(fā)送信號(hào)給應(yīng)用層,以此來通知應(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)容如下:

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

以上代碼主要做了兩件事情:

1. 注冊(cè)中斷號(hào) 1 的處理函數(shù):myirq_h(yuǎn)andler();

2. 創(chuàng)建設(shè)備節(jié)點(diǎn) /dev/mydev;

這里的中斷號(hào)1,是鍵盤中斷。

因?yàn)樗枪蚕淼闹袛啵虼水?dāng)鍵盤被按下的時(shí)候,操作系統(tǒng)就會(huì)依次調(diào)用所有的中斷處理函數(shù),當(dāng)然就包括我們的驅(qū)動(dòng)程序所注冊(cè)的這個(gè)函數(shù)。

中斷處理部分相關(guān)的幾處關(guān)鍵代碼如下:

image.png

在中斷處理函數(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)模塊才可以。這可以通過 write 或者ioctl函數(shù)來實(shí)現(xiàn),

驅(qū)動(dòng)程序用來接收 PID 的相關(guān)代碼是:

image.png

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

image.png

Makefile 文件

image.png

編譯、測(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)用程序的主要功能就是兩部分:

通過 ioctl 函數(shù)把自己的 PID 告訴驅(qū)動(dòng)程序;

注冊(cè)信號(hào) SIGUSR1 的處理函數(shù);

示例代碼全貌

image.png

image.png

在應(yīng)用程序的最后,是一個(gè) while(1) 死循環(huán)。因?yàn)橹挥性诎聪骆I盤上的ESC按鍵時(shí),驅(qū)動(dòng)程序才會(huì)發(fā)送信號(hào)上來,因此應(yīng)用程序需要一直存活著。

編譯、測(cè)試

新開一個(gè)中斷窗口,編譯、執(zhí)行應(yīng)用程序:

image.png

由于應(yīng)用程序調(diào)用了 open 和 ioctl 這兩個(gè)函數(shù),因此,驅(qū)動(dòng)程序中兩個(gè)對(duì)應(yīng)的函數(shù)就會(huì)被執(zhí)行。

這可以通過 dmesg 命令的輸出信息看出來:

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

說明:驅(qū)動(dòng)程序捕獲到了鍵盤上的 ESC 鍵,并且發(fā)送信號(hào)給應(yīng)用程序了。

在執(zhí)行應(yīng)用程序的終端窗口中,可以看到如下輸出信息:

說明:應(yīng)用程序接收到了驅(qū)動(dòng)程序發(fā)來的信號(hào)!

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)