Linux 核心模組簡介

2021-06-21 05:41:52 字數 4105 閱讀 5776

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...