Linux 9th 第1個linux驅動

2021-07-25 13:55:27 字數 2430 閱讀 8805

我們的驅動模組已經可以被自動分配主裝置號了,可以說到目前為止,乙個驅動模組所具備的一些「基礎設施」它都具備了,就像是養兵前日,用兵一時,已經可以讓first_drv這個驅動模組出去打仗了。

那麼說是出去打仗,總得有個發號施令的首長吧,在linux系統中,這位調兵遣將的首長就是應用程式,應用程式才是大boss,我們「一直精雕細琢的驅動模組」說白了只是個跑腿的。

這就是為什麼我們的專題是第1個linux驅動卻要講應用程式的原因,因為應用程式是讓驅動程式能夠被應用的,而驅動程式是讓應用被驅動的,兩者是一種主僕關係、合作關係,在linux系統中缺一不可。

其實說到應用程式,大家應該還會有一種親和感,它也是c語言寫的,不過在寫應用程式之前,你最好對c語言的檔案io操作有所了解。

int main(void)

我們說過是通過register_chrdev這個函式向核心中註冊驅動後,系統中就能夠訪問並使用這個驅動了,而向核心註冊驅動指的是將驅動的資訊存放在乙個陣列中,而存放在這個陣列中的第幾個元素是取決於驅動程式的主裝置號的,比如主裝置號是100,就那就是存放在陣列的第100個格仔中。

其實應用程式是通過裝置檔案來找到驅動的,那麼最好的方法就是通過開啟這個裝置檔案,得知驅動的主裝置號是多少,再通過這個主裝置號來找到驅動。

我們通過執行:"mknod /dev/test 主裝置號 次裝置號"這個命令來建立乙個裝置檔案。

如執行:mknod /dev/test 100 0 就建立了乙個主裝置號為100、次裝置號為0的裝置檔案,這個次裝置號是什麼我們暫時不去關心,我們只要知道主裝置號100對應了唯一的乙個驅動模組。

有了100這個主裝置號,就能找到確定的驅動模組。

#include #include #include #include int main(void)

printf("open /dev/test success...\n");

close(fd);

return 0;

}

open是linux核心為我們提供的訪問系統的api介面,像這樣的系統呼叫還有read、write、close等。

#kern_ver = $(shell uname -r)

#kern_dir = /lib/modules/$(kern_ver)/build

kern_dir = /work/kernel/linux-2.6.22.6

all:

make -c $(kern_dir) m=`pwd` modules 

cp:        

clean:

make -c $(kern_dir) m=`pwd` modules clean

obj-m   += zero_drv.o

修改好makefile後,來執行make:

列印:open /dev/test failure!

為什麼開啟失敗,因為我們還沒有建立這個裝置檔案,

我們先來cat /proc/devices檢視一下當前first_drv驅動模組的主裝置號是多少,我這裡是252,你們去檢視自己的主裝置號是多少。次裝置號暫定0好了。

我這邊執行:mknod /dev/test c 252 0

沒有異常,建立成功。

顯示:it is in first_drv_open.

open /dev/test success...it is in first_drv_release.

(此處是空行)

(游標在這行)

其中「it is in first_drv_open.」是我們驅動程式中first_drv_open函式的列印資訊,而「open /dev/test success...」是應用程式中的列印資訊,我們看到緊接著沒有回車,就列印了「it is in first_drv_release.」,這是我們驅動程式中first_drv_release函式的列印資訊。

奇怪的是我們明明加了/n,為什麼沒有回車呢,這是因為驅動程式的優先順序比應用程式要高,當應用程式正在列印資訊時,如果驅動程式中也要執行列印資訊,那麼就會優先讓驅動程式來列印資訊,當驅動程式列印完成後,再讓應用程式來列印資訊,這就是為什麼第3句話直接接在了第2句話的後面,而第3句話後又輸出了第2句話最後的回車。

這一點不影響我們的功能測試,對於這個現象我們心知肚明就好。

總而言之,我們通過執行應用程式,讓驅動得以工作了。

#include #include #include #include #define file "/dev/test"

int main(void)

printf("open %s success...\n", file);

close(fd);

return 0;

}

無非就是新增了乙個巨集定義,這樣便於修改裝置檔名。

再測試一次,同樣可以讓驅動程式工作。

Linux第1章 Linux簡介

spring mybatis tomcat mysql jdk linux是一款類unix作業系統,它的出現離不開gnu自由軟體運動中誕生的開發環境和編譯器,又反過來極大的推動了gnu自由軟體運動,讓崇尚自由軟體精神的先驅們不必繼續侷限在unix系統上進行開發。linux出現後,sendmail,w...

Linux下openssl的第1個程式

openssl是開源的,可以在上面編寫測試 怎樣編寫呢?在此舉乙個例子。第一步 編寫1個測試程式md5test1.c,如下 include include include int main int argc char argv char tmp 3 int i md5 init ctx md5 up...

Linux基礎 第1節 Linux基本環境

主機名稱和ip位址對映 支援debian,redhat,sles,ubuntu以上四類作業系統,但在國內企業中使用最多的還是redhat centos 其次sles 匯入已經安裝好的虛擬機器 對於linux系統,超級管理員使用者賬號 root,密碼 123456 開啟命令列介面 右鍵 open in...