CH04 Linux核心模組程式結構 md

2022-03-05 12:12:48 字數 1333 閱讀 4379

乙個linux核心模組主要由以下幾部分組成:

模組解除安裝函式:通過rmmod命令解除安裝模組時,模組的解除安裝函式會自動被核心執行,完成與模組載入函式相反的功能。

模組許可證宣告:許可證(license)宣告描述核心模組的許可許可權,,如果不宣告license,模組被載入時,將收到核心被汙染(kernel tainted)的警告。

模組引數:模組引數是模組被載入的時候可以傳遞給它的值,它本身對應模組內部的全域性變數。

模組匯出符號:核心模組可以匯出的符號(symbol,對應於函式或變數),若匯出,其他模組則可以使用本模組的變數或函式。

模組作者等資訊宣告

一般以__init標識宣告,典型的載入函式的形式**如下:

static int __init initialization_func(void)

module_init(initialization_func);

模組載入函式以module_init(函式名)的形式被指定,返回整型值,若初始化成功,應返回0,初始化失敗則返回錯誤編碼(在linux核心裡,錯誤編碼是乙個接近於0的負值,在中定義,包含-enodev、-enomem之類的符號值)。

在linux中,所以標識為__init的函式如果直接編譯進核心,成為核心映象的一部分,在鏈結的時候都會放在.init.text這個區段內。

#define __init __attribute__ ((__section__(".init.text")))
所有的__init函式在區段.initcall.init中還儲存了乙份函式指標,在初始化時核心會通過這些函式指標呼叫這些__init函式,並在初始化完成後,釋放init區段的記憶體。

除了函式以外,資料也可以被定義為__initdata,對於只是初始化階段需要的資料,核心在初始化完成後,也可以釋放它們占用的記憶體。例如,下面**將hello_data定義為__initdata:

static int hello_data __initdata = 1;

static int __init hello_init(void)

module_init(hello_init);

static void __exit hello_exit(void)

module_exit(hello_exit);

Linux核心模組

核心模組 在整個啟動的過程中,是否能成功的驅動我們主句的硬體裝置,是核心完成的工作,而核心一般都是壓縮文件,在使用之前核心之前必須要將核心減壓到的記憶體中。為了應對日新月異的硬體,目前核心都具有可讀取模組化驅動程式的功能,也就是所謂的 modules模組化 所謂模組化。核心與核心模組放在 核心 bo...

Linux核心模組

1 核心模組註冊登出 塊載入函式有返回值,模組解除安裝函式無返回值。兩者都是無參函式,載入函式用 init修飾,解除安裝函式用 exit修飾。define init attribute section init.text define exit atrribute section exit,text...

Linux 核心模組

linux 核心模組程式結構 1 模組載入函式 2 模組解除安裝函式 3 模組許可證宣告 4 模組引數 5 模組匯出符號 6 模組作者等資訊宣告 模組載入函式 一般以 init 標識 在 linux 中,所有標識為 init 的函式如果直接編譯進核心,成為核心映象的一部分,在連線的時候都會放在 in...