文章插圖

文章插圖
最近在搞一個linux的項目,其中主要是在編寫一些應用模塊,對內核及其驅動模塊涉及很少,遇到了一些驅動模塊的問題時,臨時查了些資料,大致了解了一下驅動模塊開發的基本步驟和常規步驟,并從網上也收集到了一些相關的資料,于是對其進行了一下簡單的總結,記錄于此,便于日后查閱,并與同道中人共享 。
什么是linux內核驅動模塊
Linux內核的整體結構已經非常龐大,而其包含的組件也非常多 。我們怎樣把需要的部分都包含在內核中呢?
一種方法是把所有需要的功能都編譯到Linux內核 。這會導致兩個問題,一是生成的內核會很大,二是如果我們要在現有的內核中新增或刪除功能,將不得不重新編譯內核 。
有沒有一種機制使得編譯出的內核本身并不需要包含所有功能,而在這些功能需要被使用的時候,其對應的代碼被動態地加載到內核中呢?
答案是肯定的,Linux提供了這樣的一種機制,這種機制被稱為模塊(Module) 。模塊具有這樣的特點:
模塊本身不被編譯入內核映像,這控制了內核的大小 。
模塊一旦被加載,它就和內核中的其它部分完全一樣 。
那么,問題來了 。如何編寫內核驅動模塊呢?別急,我們一步一步來介紹 。
【文章福利】小編自己整理了一些個人覺得比較好的linux內核學習書籍、視頻資料共享在群文件里面,有需要的可以私信【內核】自行添加免費領取哦!!!(含視頻教程、電子書、實戰項目及代碼)
先來看一個最簡單的內核模塊“Hello World” 。
#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){printk(KERN_INFO " Hello World entern");return 0;}static void hello_exit(void){printk(KERN_INFO " Hello World exitn ");}module_init(hello_init);module_exit(hello_exit);MODULE_AUTHOR("Song Baohua");MODULE_DESCRIPTION("A simple Hello World Module");MODULE_ALIAS("a simplest module");這個最簡單的內核模塊只包含內核模塊加載函數、卸載函數和對Dual BSD/GPL許可權限的聲明以及一些描述信息 。編譯它會產生hello.ko目標文件,通過“insmod ./hello.ko”命令可以加載它,通過“rmmod hello”命令可以卸載它,加載時輸出“Hello World enter”,卸載時輸出“Hello World exit” 。內核模塊中用于輸出的函數是內核空間的printk()而非用戶空間的printf(),printk()作為一種最基本的內核調試手段,其用法和printf()基本相似,但可定義輸出級別 。
1、查看系統中已經加載的模塊列表
在Linux中,使用lsmod命令可以獲得系統中加載了的所有模塊以及模塊間的依賴關系,例如:
【linux驅動開發教程 pdf linux驅動開發教程無法解壓】
[email protected]:~$lsmodModuleSizeUsed byhello15680 ohci1394327160 ide_scsi167080 ide_cd393920 cdrom369601 ide_cdlsmod命令實際上讀取并分析“/proc/modules”文件,與上述lsmod命令結果對應的“/proc/modules”文件如下:[email protected]:~$ cat /proc/modules hello15680-Live0xc8859000ohci1394327160-Live0xc88c8000ieee1394944201ohci1394,Live0xc8840000ide_scsi167080-Live0xc883a000ide_cd393920-Live0xc882f000cdrom369601ide_cd,Live0xc8876000內核中已加載模塊的信息也存在于/sys/module目錄下,加載hello.ko后,內核中將包含/sys/module/hello目錄,該目錄下又包含一個refcnt文件和一個sections目錄,在/sys/module/hello目錄下運行tree –a得到如下目錄樹:[email protected]:~$tree -a.|-- refcnt`-- sections|-- .bss|-- .data|-- .gnu.linkonce.this_module|-- .rodata|-- .rodata.str1.1|-- .strtab|-- .symtab|-- .text`-- __versions2、查看某個具體模塊的詳細信息使用“modinfo <模塊名>”命令可以獲得模塊的信息,包括模塊作者、模塊的說明、模塊所支持的參數等 。
[email protected]:~$ modinfo hello.kofilename:hello.kolicense:Dual BSD/GPLauthor:Song Baohuadescription:A simple Hello World Modulealias:a simplest modulevermagic:2.6.15.5 686 gcc-3.2depends:二、模塊程序的基本結構一個Linux內核模塊主要由如下幾個部分組成:
模塊加載函數(
- linux下載文件命令sz linux下載文件命令get
- 游戲開發平臺排行 app開發平臺排行
- 美能達283參數 美能達287驅動
- 優化驅動器傷硬盤嗎
- 高拍儀驅動裝好用不了 高拍儀已經安裝驅動,怎么打開軟件
- 佳能C5235驅動 佳能c5240驅動安裝教程
- 生產制造管理軟件開發 制造業生產管理免費軟件
- 富士相機自定義模式設置 富士驅動器設置
- nvm express控制器驅動下載 nvme express控制器
- flask web開發實戰 入門 pdf Flask Web開發:基于Python的Web應用開發實戰
