linux提供了這樣一種機制,這種機制被稱為模組。模組具有這樣的特點:
模組本身不被編譯入核心映像,從而控制了核心的大小。
模組一旦被載入,它就和核心中的其它部分完全一樣。
一、模組的組成
乙個linux核心模組主要由如下幾個部分組成:
(1)模組載入函式
linux 核心模組載入函式一般以__init標識宣告。
核心模組載入函式:
static int __init initialization_function(void)
module_init(initialization_function);
模組載入函式必需以「module_init(函式名)」的形式被指定。它返回整型值,若初始化成功應返回0.而在初始化失敗時,應該返回錯誤編碼。在linux核心裡錯誤編碼應該是乙個負值,在中定義,包含-enodev,
-enomem之類的符號值。
(2)模組解除安裝函式
linux核心模組解除安裝函式一般以__exit標識宣告,典型的模組的解除安裝函式的形式如下所示:
static void __exit cleanup_function(void)
module_exit(cleanup_function);
模組解除安裝函式在模組解除安裝的時候執行,不返回任何值,必須以"module_exit(函式名)"的形式來指定。
(3)模組許可證宣告
module_license("gpl");
(4)模組引數
我們可以用「module_param(引數名, 引數型別, 引數讀/寫許可權)」為模組定義乙個引數。例如下列**定義了乙個整型引數和乙個字元指標引數:
static char *book_name = "dissectting linux device driver";
static int num = 4000;
module_param(num, int, s_irugo);
module_param(book_name, charp, s_irugo);
例項:帶引數的核心模組
/*start*/
#include #include module_license("gpl");
static char *book_name = "dissectting linux device driver";
static int num = 4000;
static int __init book_init(void)
static void __exit book_exit(void)
module_init(book_init);
module_exit(book_exit);
module_param(num, int, s_irugo);
module_param(book_name, charp, s_irugo);
/*end*/
編譯和執行:
模組載入:
insmod book.ko book_name='goodbook' num=250
message from syslogd@localhost at mar 26 19:52:24 ...
kernel: book name: goodbook
message from syslogd@localhost at mar 26 19:52:24 ...
kernel: book num: 250
模組解除安裝:
rmmod book
message from syslogd@localhost at mar 26 19:54:14 ...
kernel: book module eixt
(5)模組匯出符號
linux2.6的「/proc/kallsyms」 檔案對應著核心符號表,它記錄了符號及符號所在的記憶體位址。
模組可以使用如下巨集匯出符號到核心符號表:
export_symbol(符號名);
export_symbol_gpl(符號名);
匯出的符號可以被其它模組使用,使用前宣告一下即可。export_symbol_gpl()只適用於包含gpl許可權的模組。
例項:核心模組中的符號匯出
/*start*/
#include #include module_license("gpl");
int add_integar(int a, int b)
int sub_integar(int a, int b)
export_symbol(add_integar);
export_symbol(sub_integar);
/*end*/
insmod symbol.ko
cat /proc/callsyms | grep integar
f7e42038 r __ksymtab_sub_integar[symbol]
f7e42050 r __kstrtab_sub_integar[symbol]
f7e42048 r __kcrctab_sub_integar[symbol]
f7e42040 r __ksymtab_add_integar[symbol]
f7e4205c r __kstrtab_add_integar[symbol]
f7e4204c r __kcrctab_add_integar[symbol]
f7e42000 t add_integar[symbol]
f7e42010 t sub_integar[symbol]
rmmod symbol
(6)模組作者等資訊宣告
在linux核心模組中,我們可以用 module_author、module_description、module_version、module_device_table、module_alias分別宣告模組的作者、描述、版本、裝置表和別名。
對於usb、pci等裝置驅動,通常會建立乙個module_device_table,表明該驅動模組所支援的裝置:
static struct usb_device_id skel_table =
/*結束*/ };
二、模組的編譯
乙個簡單的makefile:
/*$$*/
ifneq ($(kernelrelease),)
obj-m := hello.o
else
kdir := /lib/modules/2.6.32-358.el6.i686/build
all:
make -c $(kdir) m=$(pwd) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.ko.unsigned *.order *.symvers
endif
/*$$*/
Linux核心模組簡介
要想使編寫的驅動程式生效,就需要把寫好的 編入到核心中。那怎麼把自己寫的 放入核心進行編譯呢?總共有兩種方法 1 把所有需要的功能編入核心即可實現。但是這麼做會產生兩個問題 第乙個問題是如果所編寫的 中有錯誤,需要除錯,那麼每一次都需要重新編譯整個核心,這會非常消耗時間。這麼說有的小 夥伴就會問了,...
Linux核心簡介
說明 只供學習交流 一,linux體系結構 如果有人問你,linux系統是如何構成的?只要把下面這幅圖說給他聽,就ok 從圖上我們可以知道,linux系統是由使用者空間和核心空間兩部分組成,之所以將linux系統劃分為使用者空間和核心空間很大一部分原因是為了安全著想。linux簡化了分段機制,使得虛...
Linux 核心 簡介
核心是linux系統的最底層,提供了系統的核心功能並允許程序以一種有序的方式訪問硬體 用於控制程序,輸入,輸出裝置,檔案系統操作,管理記憶體,這些都是系統自動完成的,你大可安然睡覺去,linux核心支援多使用者,多工模式執行 多使用者 同時有多個使用者訪問系統 多工 某個時刻有多個任務執行 linu...