內核模塊相關知識的學習

    這周主要以學習模塊的結構和模塊的編譯,其中第一章講了一個簡單的模塊源程序,通過這個程序我們可以看出模塊的大概結構。結構分析如下:首先是編譯模塊所需的內核內部的頭文件,其中包括初始化init.h頭文件、模塊所需的頭文件moudle.h、內核中部分被調用函數所包含的內核頭文件kernel.h。接下來是模塊的許可證的申明,一般我們常採用BSB/GPL雙許可證,如果不加的話編譯時會提示kernel tainted(內核被污染),接着是用戶自定義的函數來實現模塊的功能,包括初始化的函數和退出的函數,再下面是調用模塊加載函數module_init(函數名)、模塊卸載模塊module_exit(函數名)來完成自定義函數的指定,這就是模塊註冊的過程,其中還可以包含模塊參數的傳遞,模塊導出符號表,最下面是一信附加信息的說明,包括作者、模塊描述、模塊別名等等。

    對於模塊參數這個部分看了一遍,有一些還不是很理解,我們可以採用module_param()來定義一個參數,通過實例瞭解到了:完成參數的定義和賦值後便可以使用參數了,再完成參數在模塊內的定義也就是傳遞的過程,其中還涉及到參數讀寫權限,使用S_IRUGO的格式來定義。

    在導出符號部分,/proc/kallsyms對應於內核符號表,它記錄了符號以及符號所在的內存地址。

模塊使用如下宏導出符號到內核符號表:EXPORT_SYMBOL(符號名)EXPORT_SYMOL_GPL(符號名),如導出函數符號sub_integar在內核符號表中顯示如下信息:

        c886f00b T sub_integar   [export]

    對於模塊的計數,2.6內核給出了兩個計數管理接口:try_module_get(&module)module_put(&module)

    我們只要提供模塊的地址就可以了,內核一般會爲不同類型的設備定義struct module *owner域,只要完成模塊的指定便可以實現計數的功能。

    這一章我覺得收穫比較大的就是在編譯模塊時,第一次比較正式的見到複雜點的Makefile文件,通過聽解説後又認真的分析了一遍,對於Makefile規則又重新複習了一下,這些內容在上一個報告中已經詳細的總結過了,編譯的過程大致是先進入內核的目錄,查詢了所需的頭文件,接着用CC編譯器將源文件編譯成.o目標文件,再通過MODPOST完成部分宏的替換還有其他信息的替換,用CC編譯器編譯成.mod.o目標文件,這個過程不太清楚,對於.mod.c文件也看不懂,我到網上查過了也沒什麼收穫,再下來就是完成.o.mod.o文件的連接,生成模塊目標文件.ko,最後離開內核目錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章