Linux核心分析(二)----核心模組簡介|簡單核心模組實現,linux----

來源:互聯網
上載者:User

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.             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.  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/ 瞭解。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.