手把手教你Linux字符設備驅(qū)動實例
globalmem
看?linux 設備驅(qū)動開發(fā)詳解時,字符設備驅(qū)動一章,寫的測試代碼和應用程序,加上自己的操作,對初學者我覺得非常有幫助。
寫這篇文章的原因是因為我看了我之前發(fā)表的文章,還沒有寫過字符設備相關的,至于里面提到的結構體的作用,有很多詳細的文章說明,我就不做更深的敘述。
代碼在github上,點擊下面閱讀原文可以直達
https://github.com/weiqifa0/globalmem/blob/main/README.md
把這部分放在github上也有好處,后續(xù)可以增加刪除一些東西,以后自己需要使用的時候也方便許多。
我們討論字符設備驅(qū)動,就有必要知道他的結構體和頭文件,像一些后來的封裝什么的,大部分還是脫離不了操作這個結構體里面的東西。

加載內(nèi)核模塊insmod globalmem.ko 錯誤需要的修改。
insmod: can't insert 'globalmem.ko': Device or resource busy
出錯的原因:
模塊使用的是靜態(tài)分配設備號的方式,而這個設備號已經(jīng)被系統(tǒng)中的其他設備所占用。查看未被占用的設備號,需要到pro/devices下面去查看。
查看設備號的方法:
# cat /proc/devices
【文章福利】小編推薦自己的Linux內(nèi)核技術交流群:【749907784】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ?


編譯內(nèi)核版本
加載模塊之后使用lsmod查看模塊
創(chuàng)建設備文件節(jié)點
使用mknod創(chuàng)建設備節(jié)點的時候,后面跟上的參數(shù)需要跟我們在/proc/devices下面看到的對應,也就是我們在驅(qū)動里面申請的主設備號。
使用命令讀寫設備文件
Linux 下的 echo 和cat 命令是十分有用,這兩個命令可以讓在不寫代碼的情況下就可以完成調(diào)試讀寫設備。
通過代碼來讀寫設備文件
代碼在下面閱讀原文的鏈接里面。
使用傳入?yún)?shù)設置主設備號
內(nèi)核模塊參數(shù)我覺得是一個比較冷門的知識點,冷門的原因是因為我們在做項目的時候很少使用這個參數(shù),但是實際上這個參數(shù)非常有用。
我們可以把內(nèi)核模塊當做main函數(shù),main函數(shù)是可以接收傳參的,內(nèi)核模塊也可以在加載的時候接收傳入的參數(shù)。
如下是把主設備號傳給內(nèi)核模塊,但是需要注意,這個主設備號不能被占用了。
增加自動創(chuàng)建設備節(jié)點的驅(qū)動文件
每次手動創(chuàng)建設備文件節(jié)點總是很麻煩,而且在實際編寫設備驅(qū)動的時候,不會出現(xiàn)自己手動創(chuàng)建設備節(jié)點這種低端的操作。
當然了,聰明的內(nèi)核提供了接口讓我們在注冊驅(qū)動的時候也把設備文件節(jié)點注冊上去。
具體代碼可以查看globalmem2.c里面的代碼。
使用lseek操作文件位置
具體對應的文件是app-main2.c
原文作者:嵌入式Linux
