昨天咱們開始了內核的分析,網上有不少人是用用源碼直接分析,這樣形成的問題是,你們以爲很枯燥很難理解,從某種意義上來講linux系統自己就是由一個個模塊構成的,因此我會結合內核模塊的設計,去分析內核,從而達到對linux內核的理解。git
今天咱們會分析到如下內容:github
1. Linux內核模塊簡介vim
2. 簡單內核模塊實現數組
1. 何爲內核模塊工具
在上一篇博文中咱們先經過內核配置,在配置的過程當中咱們對內核的組件進行了選擇(固然這個選擇決定了咱們內核的大小),而後才生成了咱們最終的內核,那麼咱們若是想添加組件,怎麼辦?學習
最笨的方法是對內核進行從新配置,而後在從新編譯。這樣的話豈不是說我加一個組件就得從新編譯內核,這顯然不是很科學的方法,其實咱們的linux內核提供在運行時可進行擴展的特性,這意味着當系統啓動並運行時,咱們能夠向內核添加或移除部分功能。ui
咱們在運行時添加到內核中的代碼就被成爲動態可加載內核模塊,咱們簡稱爲內核模塊。spa
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。一般狀況下將他們按位或
同時咱們也能夠用下面的宏聲明數組:
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.o 2 DIRS :=/smbshare/linux-2.6.39///此處路徑爲內核源碼路徑,該內核源碼必需要通過編譯,否則會報錯 3 all: 4 make -C $(DIRS) M=$(PWD) modules 5 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/ 瞭解。