歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux 內核模塊的程序結構

Linux 內核模塊的程序結構

日期:2017/3/3 13:00:38   编辑:Linux技術

一個 Linux 內核模塊程序結構主要由以下幾個部分組成:

模塊加載函數(必須) 。 當通過 insmod 或 modprobe 命令加載內核模塊時,模塊的加載函數會自動被內核執行,完成本模塊的相關初始化工作。

模塊卸載函數(必須) 。

當通過 rmmod 命令卸載某模塊時,模塊的卸載函數會自動被內核執行,完成與模塊加載函數相反的功能。

模塊許可證聲明(必須) 。

模塊許可證(LICENSE)聲明描述內核模塊的許可權限,如果不聲明 LICENSE,模塊被加載時,將收到內核被污染 (kernel tainted)的警告。大多數情況下,內核模塊應遵循 GPL 兼容許可權。Linux 2.6 內核模塊最常見的

是以 MODULE_LICENSE( “Dual BSD/GPL” ) 語句聲明模塊采用 BSD/GPL 雙LICENSE。

模塊參數(可選) 。

模塊參數是模塊被加載的時候可以被傳遞給它的值,它本身對應模塊內部的全局變量。

模塊導出符號(可選) 。

內核模塊可以導出符號(symbol,對應於函數或變量) ,這樣其他模塊可以使用本模塊中的變量或函數。

模塊作者等信息聲明(可選) 。

模塊加載函數

Linux 內核模塊加載函數一般以_ _init 標識聲明:
[code]1 static int _ _init initialization_function(void)
2 {
3 /* 初始化代碼 */
4 }
5 module_init(initialization_function);

在 Linux 2.6 內核中,可以使用 request_module(const char *fmt, …)函數加載內核

模塊:

[code]request_module(module_name);

[code]request_module("char-major-%d-%d", MAJOR(dev), MINOR(dev));

模塊卸載函數

Linux 內核模塊卸載函數一般以_ _exit 標識聲明:

[code]1 static void _ _exit cleanup_function(void)
2 {
3 /* 釋放代碼 */
4 }
5 module_exit(cleanup_function);
通常來說,模塊卸載函數要完成與模塊加載函數相反的功能 :

若模塊加載函數注冊了 XXX,則模塊卸載函數應該注銷 XXX。

若模塊加載函數動態申請了內存,則模塊卸載函數應釋放該內存。

若模塊加載函數申請了硬件資源(中斷、DMA 通道、I/O 端口和 I/O 內存等)

的占用,則模塊卸載函數應釋放這些硬件資源。

若模塊加載函數開啟了硬件,則卸載函數中一般要關閉硬件。

模塊參數

[code] `module_param(參數名,參數類型,參數讀/寫權限)`,
  參數即模塊中用到的全局變量,加載模塊時可以通過
 `insmod(或 modprobe)模塊名 參數名=參數值”` ,
向模塊傳遞參數。如果不傳遞,參數將使用模塊內定義的默認值。

導出符號

Linux 2.6 的“/proc/kallsyms”文件對應著內核符號表,它記錄了符號以及符號所在的內存地址。 模塊可以使用如下宏導出符號到內核符號表:

[code]EXPORT_SYMBOL(符號名);
EXPORT_SYMBOL_GPL(符號名);
導 出 的 符 號(或者說函數) 將 可 以 被 其 他 模 塊 使 用 , 使 用 前 聲 明 一 下 即 可 。EXPORT_SYMBOL_GPL()只適用於包含 GPL 許可權的模塊。

模塊聲明與描述

[code]MODULE_AUTHOR(author);
MODULE_DESCRIPTION(description);
MODULE_VERSION(version_string);
MODULE_DEVICE_TABLE(table_info);
MODULE_ALIAS(alternate_name);

模塊使用計數

[code]int try_module_get(struct module *module);

該函數用於增加模塊使用計數;若返回為 0,表示調用失敗,希望使用的模塊沒有被加載或正在被卸載中。

[code]void module_put(struct module *module);
該函數用於減少模塊使用計數。

Linux 2.6 內核為不同類型的設備定義了 struct module *owner 域,用來指向管理此設備的模塊。當開始使用某個設備時,內核使用 try_module_get(dev->owner)去增加管理此設備的 owner 模塊的使用計數;當不再使用此設備時,內核使用module_put(dev->owner)減少對管理此設備的 owner 模塊的使用計數。這樣,當設備在使用時,管理此設備的模塊將不能被卸載。只有當設備不再被使用時,模塊才允許被

卸載。

Copyright © Linux教程網 All Rights Reserved