Linux核心分析(二)----核心模組簡介|簡單核心模組實現,linux----
Linux核心分析(二)
昨天我們開始了核心的分析,網上有很多人是用用源碼直接分析,這樣造成的問題是,大家覺得很枯燥很難理解,從某種意義上來說linux系統本身就是由一個個模組構成的,所以我會結合核心模組的設計,去分析核心,從而達到對linux核心的理解。
今天我們會分析到以下內容:
1. Linux核心模組簡介
2. 簡單核心模組實現
l Linux核心模組簡介
1. 何為核心模組
在上一篇博文中我們先通過核心配置,在配置的過程中我們對核心的組件進行了選擇(當然這個選擇決定了我們核心的大小),然後才產生了我們最終的核心,那麼我們如果想添加組件,怎麼辦?
最笨的方法是對核心進行重新設定,然後在重新編譯。這樣的話豈不是說我加一個組件就得重新編譯核心,這顯然不是很科學的方法,其實我們的linux核心提供在運行時可進行擴充的特性,這意味著當系統啟動並運行時,我們可以向核心添加或移除部分功能。
我們在運行時添加到核心中的代碼就被成為動態可載入核心模組,我們簡稱為核心模組。
2. 核心模組的相關操作
a) 載入核心模組:insmod
b) 卸載核心模組:rmmod
c) 查看核心模組:lsmod
3. 模組聲明
a) MODULE_LICENSE(“GPL”):核心可以識別的許可證有GPL(任意版本GNU通用公用許可證)、GPL v2等
b) MODULE_AUTHOR(“作者”):聲明作者資訊可以不用
c) MODULE_VERSION(“版本”):聲明版本資訊也可以不用
d) MODULE_DESCRIPTION(“功能描述”):聲明模組功能,可不用
4. 模組參數
我們可以在載入核心模組的時候向其傳遞參數,以讓同一代碼達到不同的效果。當然我們的參數必須用module_param宏來聲明具體如下:
1 module_param(name,type,perm)
a) name:變數名
b) type:資料類型核心支援模組參數類型有:bool、invbool(bool的發轉,true變為false,false變為true)、charp(char類型指標值)、int、long、short、uint、ulong、ushort、
c) perm:常見的訪問許可值通常為S_IRUGO和S_IWUSR。通常情況下將他們按位或
同時我們也可以用下面的宏聲明數組:
- 1 Module_param_array(name,type,num,perm)
5. 模組符號匯出
當一個模組要使用另一個模組的函數(變數)的時候,要使用EXPORT_SYMBOL(符號名)或者EXPORT_SYMBOL_GPL(符號名)來申明。
註:EXPORT_SYMBOL_GPL()只適用於遵循GPL協議的模組
l 簡單核心模組實現
想必大家都記得我們在學習某種語言的時候,寫的第一個程式大部分都是輸出hello world,所以我接下來用我們剛才介紹的核心模組去完成hello world。
1. 核心模組編寫
通過上面部分內容的介紹,要完成第一核心模組不是很難,下面是自己的代碼。
-
1 #include<linux/init.h> 2 #include<linux/module.h> 3 MODULE_LICENSE("GPL"); 4 staticint hello_init(void) 5 { 6 printk("<0> hello world\n"); 7 return0; 8 } 9 staticvoid hello_exit(void)10 {11 printk("<0> goodbye\n");12 }13 module_init(hello_init);//該宏在模組的目標代碼中增加一個特殊的段,用於說明核心初始化函數所在的位置14 module_exit(hello_exit);//跟上面的宏對立
2. Makefile編寫
Makefile的編寫也比較簡單,要注意的地方代碼中已經說明。
1 obj-m := hello.o2 DIRS :=/smbshare/linux-2.6.39///此處路徑為核心源碼路徑,該核心源碼必須要經過編譯,不然會報錯3 all:4 make -C $(DIRS) M=$(PWD) modules5 clean:6 rm -Rf*.o *.ko *.mod.c *.order *.symvers
經過了上面兩個步驟,我們然後編譯載入然後卸載我們的模組進行實驗。
編譯:
載入:
查看:
卸載:
3. Printk函數簡介
printk函數為核心列印函數,其和printf函數功能類似,不過比printf多了列印許可權一共有8個層級,printk的記錄層級定義如下(在include/linux/kernel.h中):
1 #define KERN_EMERG 0 //緊急事件訊息,系統崩潰之前提示,表示系統不可用2 #define KERN_ALERT 1 //報告訊息,表示必須立即採取措施3 #define KERN_CRIT 2 //臨界條件,通常涉及嚴重的硬體或軟體操作失敗4 #define KERN_ERR 3 //錯誤條件,驅動程式常用KERN_ERR來報告硬體的錯誤5 #define KERN_WARNING 4 //警告條件,對可能出現問題的情況進行警告6 #define KERN_NOTICE 5 //正常但又重要的條件,用於提醒7 #define KERN_INFO 6 //提示資訊,如驅動程式啟動時,列印硬體資訊8 #define KERN_DEBUG 7 //調試層級的訊息
今天的內容比較簡單,只是對核心模組有了一個初步的瞭解,所以我今天在給大家推薦一個比較好用的工具,叫做exvim其將好多vim的工具進行了整合,個人感覺十分方便,就是換電腦什麼的也不怕自己的配置丟失了。貼一張自己使用的圖,大家有興趣的可以去http://exvim.github.io/ 瞭解。