這周主要以學習模塊的結構和模塊的編譯,其中第一章講了一個簡單的模塊源程序,通過這個程序我們可以看出模塊的大概結構。結構分析如下:首先是編譯模塊所需的內核內部的頭文件,其中包括初始化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,最後離開內核目錄。