1.1Linux內(nèi)核模塊介紹1.1.1Linux內(nèi)核模塊概述
嵌入式設(shè)備驅(qū)動(dòng)開(kāi)發(fā)中將驅(qū)動(dòng)程序以模塊的形式發(fā)布,更是極大地提高了設(shè)備使用的靈活性——用戶只需要拿到相關(guān)驅(qū)動(dòng)模塊,再插入到用戶的內(nèi)核中,即可靈活地使用你的設(shè)備。
1.1.2使用Linux模塊的優(yōu)點(diǎn)
1. 用戶可以隨時(shí)擴(kuò)展Linux系統(tǒng)的功能。
2. 當(dāng)要修改當(dāng)前Linux系統(tǒng)的驅(qū)動(dòng)時(shí),只需要卸載舊模塊,編譯目標(biāo)驅(qū)動(dòng)模塊,重新安裝插入即可。
3. 系統(tǒng)中如果需要使用新模塊,不必重新編譯內(nèi)核,只要插入相應(yīng)的模塊即可。
4. 減小Linux內(nèi)核的體積,節(jié)省flash。
1.2Linux模塊入門1.2.1模塊相關(guān)命令1.2.1.1 Linux模塊命令詳細(xì)介紹
1. 模塊安裝命令:insmod
insmod xxxx.ko
2. 查看當(dāng)前已經(jīng)安裝模塊:lsmod
lsmod 不需要參數(shù)
3. 模塊卸載命令:rmmod
rmmod xxxxx.ko
4. 查看模塊信息:modinfo
在X86上操作:
[root@zhifachen linux-3.5]# modinfo/root/work/rootfs/home/mod/tiny4412_hello_module.ko
filename: /root/work/rootfs/home/mod/tiny4412_hello_module.ko
license: GPL
depends:
intree: Y
vermagic: 3.5.0-FriendlyARM SMP preempt mod_unload ARMv7 p2v8
[root@zhifachen linux-3.5]#
1.2.1.2 Linux模塊命令測(cè)試示例
注意:模塊的編譯是依賴具體一份源碼,并且這份被編譯過(guò),并且沒(méi)有使用mrproper,distclean清除的源碼工程。
1.2.2使用makemodules編譯內(nèi)核源碼樹(shù)中的模塊
1. 添加內(nèi)核菜單
2. make menuconfig 配置為 M
3. 在頂層目錄終端輸入makemodules
直接make 也可生成模塊文件(.ko),也會(huì)生成zImage,當(dāng)你只想編譯模塊而不想編譯zImage時(shí)候使用 make modules 命令會(huì)更加快速。
1.2.3把內(nèi)核源碼樹(shù)中模塊源文件編譯到內(nèi)核映像中
如果不需要配置菜單只想編譯代碼到內(nèi)核zImage,Makefile可以這樣寫(xiě)obj-y += xxxx.o
如果不需要配置菜單只想編譯代碼為外部模塊,Makefile可以這樣寫(xiě) obj-m+= xxxx.o
1.2.4在內(nèi)核源碼中添加自定義的模塊并且編譯1.2.5外部獨(dú)立Makefile編譯模塊
在驅(qū)動(dòng)開(kāi)發(fā)階段,接觸到新驅(qū)動(dòng)機(jī)率非常高,如果都要去修改內(nèi)核源碼Makefile, 太過(guò)于繁雜,也不利于移植,實(shí)際開(kāi)發(fā)中會(huì)使用另外一種方法來(lái)編譯模塊文件。
1.2.5.1 Linux內(nèi)核模塊代碼文件模板
可以直接復(fù)制內(nèi)核源碼中自帶的示例模板來(lái)測(cè)試:drivers/char/tiny4412_hello_module.c
1.2.5.2 Linux內(nèi)核模塊編譯Makefile模板
編譯模塊Makefile文件:
obj-m += xyd_hello_module.o all: @make -C /root/work/linux-3.5/ M=$(PWD) modules @rm -rf *.o *.mod.c modules.order Module.symvers *~ *.bak clean: @rm -rf *.o *.mod.c modules.order Module.symvers *.ko *~ *.bak |
make -C $(KDIR)M=$(PWD) modules
M=選項(xiàng)讓該Makefile在構(gòu)造modules目標(biāo)之前返回到模塊源代碼目錄,然后modules目標(biāo)指向obj-m變量中設(shè)定的模塊;在上面的例子中,我們將該變量設(shè)置成了module.o。
上面的清除規(guī)則是自己寫(xiě)的,也可利用內(nèi)核Makefile清除規(guī)則來(lái)清編譯生成目標(biāo)文件,改進(jìn)后代碼:
obj-m += xyd_hello_module.o # x86 編譯時(shí)候使用: uname -r 得到當(dāng)前內(nèi)核的版本號(hào) #KDIR := /lib/modules/`uname -r`/build #arm 編譯時(shí)候使用 KDIR :=/root/work/linux-3.5 all: @make -C $(KDIR) M=$(PWD) modules clean: @make -C $(KDIR) M=$(PWD) modules clean @rm -f *.ko.unsigned *~ |
1.1.1Linux內(nèi)核printk函數(shù)
內(nèi)核中不能使用printf函數(shù)輸出信息,要使用printk函數(shù),這個(gè)函數(shù)有輸出等級(jí)控制的。
內(nèi)核通過(guò) printk() 輸出的信息具有日志級(jí)別,日志級(jí)別是通過(guò)在 printk() 輸出的字符串前加一個(gè)帶尖括號(hào)的整數(shù)來(lái)控制的,如 printk("<6>Hello, world!/n");。內(nèi)核中共提供了八種不同的日志級(jí)別,在 linux/kernel.h 中有相應(yīng)的宏對(duì)應(yīng)。
#defineKERN_EMERG "<0>" /* system is unusable 系統(tǒng)不可用*/
#defineKERN_ALERT "<1>" /* action must be takenimmediately警報(bào),必須立即采取行動(dòng)*/
#define KERN_CRIT "<2>" /*critical conditions臨界狀態(tài) */
#defineKERN_ERR "<3>" /* error conditions 錯(cuò)誤狀態(tài)*/
#defineKERN_WARNING "<4>" /* warningconditions警告狀態(tài)*/
#defineKERN_NOTICE "<5>" /* normal but significant正常的,但引人注目*/
#define KERN_INFO "<6>" /*informational 信息*/
#defineKERN_DEBUG "<7>" /* debug-level messages調(diào)試等級(jí)信息 */
可以通過(guò)查看/proc/sys/kernel/printk文件內(nèi)容知道設(shè)置信息。
[root@ChenZhiFa/]# cat /proc/sys/kernel/printk
7 4 1 7
可以通過(guò)echo命令修改種個(gè)等級(jí):
[root@ChenZhiFa/]# echo 4 4 1 7 > /proc/sys/kernel/printk
說(shuō)明:直接使用printk( “kkkk”);這樣沒(méi)有指明等級(jí),這種未明確指定。
只有等級(jí)比較當(dāng)前終端等級(jí)高才會(huì)在終端上顯示出來(lái)。
以下進(jìn)行X86 系統(tǒng)上的測(cè)試(在純字符界面下測(cè)試有效,在圖形界面中是無(wú)效)
在圖形界面系統(tǒng)中按Ctl + Alt + F2(F2~F6鍵其中一個(gè),不同電腦可能不同),可以進(jìn)入到純字符界面,要返回按Ctl +Alt + F1(不同電腦可能不同)
printk --- 不支持浮點(diǎn)數(shù),實(shí)際上驅(qū)動(dòng)程序也不支持浮點(diǎn)運(yùn)算。所有浮點(diǎn)運(yùn)算應(yīng)該放在用戶空間。
-
模塊
+關(guān)注
關(guān)注
7文章
2783瀏覽量
49592 -
Linux
+關(guān)注
關(guān)注
87文章
11462瀏覽量
212803
原文標(biāo)題:1.1 Linux內(nèi)核模塊介紹1.1.1 Linux內(nèi)核模塊概述
文章出處:【微信號(hào):qrsworld,微信公眾號(hào):嵌入式單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
linux 了解內(nèi)核模塊的原理 《Rice linux 學(xué)習(xí)開(kāi)發(fā)》

Linux 內(nèi)核模塊工作原理及內(nèi)核模塊編譯案例

詳解Linux內(nèi)核模塊的編寫(xiě)方法
Linux內(nèi)核模塊間通訊方法

Linux內(nèi)核模塊程序結(jié)構(gòu)
Linux內(nèi)核模塊簡(jiǎn)介
高效學(xué)習(xí)Linux內(nèi)核——內(nèi)核模塊編譯
《Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第4章、Linux內(nèi)核模塊

什么是內(nèi)核模塊?如何編寫(xiě)一個(gè)簡(jiǎn)單的模塊?
什么是 Linux 內(nèi)核模塊?
嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試教程

如何在Petalinux創(chuàng)建Linux內(nèi)核模塊?
嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試

評(píng)論