一個(gè)Linux驅(qū)動(dòng)工程師必知的內(nèi)核模塊知識(shí)
最簡(jiǎn)單的驅(qū)動(dòng)
加載卸載模塊命令
模塊加載
insmod
:加載指定目錄下的一個(gè).ko文件到內(nèi)核。例如:
modprob
:自動(dòng)加載模塊到內(nèi)核,相對(duì)于insmod來(lái)講更智能。在執(zhí)行該命令前最好運(yùn)行一次depmod命令來(lái)更新模塊的依賴信息,使用modprobe不指定路徑和后綴,例如:
模塊卸載
rmmod
:卸載模塊。例如:
模塊信息
modinfo
:查看模塊的信息。例如:
多個(gè)源文件編譯生成一個(gè)內(nèi)核模塊
例如,將hello.c和world.c兩個(gè)c文件編譯生成一個(gè)叫hello_world.o的目標(biāo)文件,則在Makefile
中添加以下兩句:
內(nèi)核污染
insmod
?ko模塊時(shí),可能出現(xiàn)如下提示:
幾個(gè)可能原因:
模塊沒有聲明
GPL
協(xié)議當(dāng)前l(fā)inux內(nèi)核版本和編譯模塊使用的內(nèi)核版本不一致
使用內(nèi)核源代碼未包含的樹外模塊
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)?


printk和printf
在內(nèi)核中的打印函數(shù)是printk
,printk
和printf
的行為非常相似,但是通常printk不支持浮點(diǎn)數(shù),例如要打印一個(gè)浮點(diǎn)變量,在編譯時(shí)通常會(huì)出現(xiàn)如下警告,并且模塊也不會(huì)加載成功:
內(nèi)核模塊參數(shù)
在加載一個(gè).ko模塊時(shí),也可以像應(yīng)用程序那樣,通過命令行傳入一些參數(shù),這個(gè)過程發(fā)生在調(diào)用模塊初始化函數(shù)之前。
內(nèi)核支持的參數(shù)類型有:bool
、invbool
(反轉(zhuǎn)值bool類型)、charp
(字符串指針)、short
、int
、long
、ushort
、uint
、ulong
。這些類型又可以復(fù)合成對(duì)應(yīng)的數(shù)組類型。
具體用法,在驅(qū)動(dòng)中定義三個(gè)變量baudrate
、port
、name
:
使用module_param
和module_param_array
宏聲明這些變量為模塊參數(shù)。說(shuō)明:
name
:變量的名字
type
:變量或數(shù)組元素的類型
nump
:數(shù)組元素個(gè)數(shù)的指針,可選
perm
:在sysfs文件系統(tǒng)中對(duì)應(yīng)文件的權(quán)限屬性。
權(quán)限的取值參考<linux/stat.h>
頭文件。
修改這三個(gè)變量的值,即加載模塊時(shí)傳參:
C庫(kù)
內(nèi)核模塊處于C函數(shù)庫(kù)之下,自然就不能調(diào)用C庫(kù)函數(shù)(內(nèi)核源碼會(huì)實(shí)現(xiàn)類似的函數(shù)).
而應(yīng)用程序則可以隨意調(diào)用C庫(kù)函數(shù)。
