天天看點

Linux核心子產品簡介

Linux核心子產品簡介

要想使編寫的驅動程式生效,就需要把寫好的代碼編入到核心中。那怎麼把自己寫的代碼放入核心進行編譯呢?總共有兩種方法:
1)把所有需要的功能編入核心即可實作。但是這麼做會産生兩個問題:
第一個問題是如果所編寫的代碼中有錯誤,需要調試,那麼每一次都需要重新編譯整個核心,這會非常消耗時間。這麼說有的小
夥伴就會問了,這又能消耗多長時間呢?以筆者親身經曆的一個嵌入式項目來看,重編依次核心大約2小時左右。假設你調試代
碼需要3次才能調試通過(實際工程中三次調試好一個功能都屬于大神級别的人物了,除非你調的功能非常簡單),那光是編譯
核心就需要6個小時,再加上包括版本更新之類的操作再占去2個小時,那就是相當于一天的工作投入,如果你那功能需要調試7-
8次,那可能兩三天的工作量就投進去然後還未必能把活幹明白。是以說實際工程中要是敢這麼幹,别的不說,你的上司肯定要
找你談話了。。。
第二個問題是,如果随便什麼功能都往核心中編譯,那麼這個核心會越來越大,這也是我們不想看到的。
2)第二種方法,也是實際開發中最長使用的一種方法。它依賴Linux提供的一種叫做“子產品”的機制,子產品有幾個特點,第一個
特點是:子產品本身不被編譯進核心,進而控制了核心的大小。第二個特點是:當需要一個子產品時,可以動态加載,子產品一旦被
加載,他就和核心中的其他部分完全一樣了。

接下來寫一個最基礎樣例看一看:
           

helloko.c

#include <linux/init.h>
	#include <linux/module.h>
	
	static __init int hello_init(void)
	{
		printk(KERN_EMERG  "Hello KO enter!\n");
		return 0;
	}
	
	static void __exit hello_exit(void)
	{
		printk(KERN_EMERG  "Hello KO exit!\n");
	}
	
	module_init(hello_init);
	module_exit(hello_exit);
	MODULE_LICENSE("DUAL BSD/GPL");
在這裡插入代碼片
           

Makefile

KVERS = $(shell uname -r)
	
	#Kernel modules
	obj-m += helloko.o
	
	CURDIR=$(shell pwd)
	
	
	all: 
		make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
	
	clean:
		make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean

           

先解釋下helloko.c檔案,hello_init是核心子產品加載函數,一般用__init聲明,通過module_init調用;

hello_exit是核心子產品解除安裝函數,一般用__exit聲明,通過module_exit調用。

MODULE_LICENSE(“GPL”)是子產品許可聲明,是固定内容且是必寫的。

以上三塊内容構成最基本的核心子產品,這三塊都是必寫的。

printk函數是核心空間的輸出函數,由于核心空間不是使用者空間,不能使用printf,故隻能使用printk。

printk有7個輸出資料等級,我這裡使用的KERN_EMERG是第0級,也是優先級最高的輸出級别,代

表“緊急事件消息,系統崩潰之前提示,表示系統不可用”,小夥伴們可以根據實際需要選用合适的輸

出級别。

再來看看Makefile檔案

事先聲明一下,和.c一樣,我寫的Makefile也是最簡形式,實際工程中Makefile的編寫要複雜的多。

make -C /lib/modules/ ( K V E R S ) / b u i l d 指 明 跳 轉 到 源 碼 目 錄 下 讀 取 那 裡 的 M a k e f i l e 。 M = (KVERS)/build指明跳轉到源碼目錄下讀取那裡的Makefile。 M= (KVERS)/build指明跳轉到源碼目錄下讀取那裡的Makefile。M=(CURDIR)表明執行完源碼的Makefile後傳回到目前目錄繼續讀入。

至于$(shell xxx)代表了在Makefile中執行shell指令。

目前目錄下檔案結構是這樣的:

Linux核心子產品簡介

再介紹幾個指令:

lsmod指令:擷取系統中加載了的所有子產品以及子產品間的依賴關系,例如

Linux核心子產品簡介

insmod指令:加載子產品指令。

rmmod指令:解除安裝子產品指令。

下面開始編譯.ko檔案

1、執行make指令,得到以下檔案,其中helloko.ko檔案就是我們需要加載的.ko檔案。

Linux核心子產品簡介

2、執行insmod指令,注意.ko檔案的出現方式,另外由于我的虛拟機沒有使用root使用者,是以需要輸入sudo

如果使用root使用者的話,就不必sudo了。

Linux核心子產品簡介

3、執行lsmod看看helloko.ko是否已經加載成功,從圖檔來看果真加載成功了。

Linux核心子產品簡介

4、既然子產品加載成功了,那麼有些小夥伴就會你問了,列印呢?怎麼螢幕沒有輸出列印資訊呢?其實核心列印資訊

和使用者空間列印資訊不同,它可以不輸出到螢幕上,要看核心列印資訊,還需要執行dmesg指令。紅框中就是我添加的列印。

Linux核心子產品簡介

5、執行rmmod指令,注意和insmod指令的helloko.ko參數形式做對比

Linux核心子產品簡介

6、執行lsmod看看是否解除安裝幹淨,看圖可知,沒有helloko子產品,可知子產品已經解除安裝幹淨了。

Linux核心子產品簡介

7、再次執行dmesg,看是否有子產品解除安裝的列印資訊。由圖可知,是有列印資訊的。

Linux核心子產品簡介

以上就是加載與解除安裝一個最基礎子產品的步驟,如有錯誤,歡迎批評指正。

繼續閱讀