向核心載入/卸載模組

來源:互聯網
上載者:User

模組是如何載入到核心的
要支援模組的動態載入,卸載, 在編譯核心時要注意: “Lodable Module Support" 中的相應選項要選上. 比如要支援載入模組, 應該選上Enable loadable module support; 要支援卸載模組, 要選上Module unloading ; 要支援強制卸載模組, 要選上Forced module unloading!
1, When the kernel needs a feature that is not resident in the kernel, the kernel module daemon kmod (In earlier versions of linux, this was known as kerneld) execs modprobe to load the module in. modprobe is passed a string in one of two forms:
*
A module name like softdog or ppp.
*
A more generic identifier like char-major-10-30
傳遞給mdoprobe的參數為模組名時, 不需要加.ko的副檔名. 若傳遞給modprobe的是通用標誌符, 那麼modprobe通過查看etc/modprobe.conf知道通用標誌符對應的模組名.
modprobe.conf檔案是特定於發行版的, 比如我的Ubuntu中, modprobe查看/etc/modprobe.d/aliases來將通用標誌符轉化為模組名.
2, 注意模組也存在依賴性問題: 比如你要載入msdos.ko, 需要先載入fat.ko. modprobe查看/lib/module/version/modules.dep得知模組的依賴關係. (version = uname -r). moules.dep由$ depmod -a 命令建立.
依賴其他模組的模組稱為: "stacking modules"

3, 知道了依賴關係之後, mprobe先載入prerequisites模組, 再載入模組自身. 實際上, modprobe是通過調用insmod來載入這些模組的!
有兩種載入模組的方法, 以剛才的msdos.ko為例子:
$ insmod /lib/modules/version/kernel/fs/fat/fat.ko
$ insmod /lib/modules/version/kernel/fs/msdos/msdos.ko
$ modprobe msdos
modprobe和insmod的區別:
1, modprobe知道核心模組預設的存在目錄(/lib/modules/version/), 而insmod不知道.
2, 調用modprobe時, 只需給出模組名(不代,ko擴充), 而insmod需要給出完整路徑和模組名.
3, modprobe自動解決依賴性. 而insmod需要指定載入核心的先後順序.
4, 由於modprobe假設要載入的模組在預設目錄, 那麼若要載入在預設目錄之外的模組, 就要調用insmod了.
發行版將modprobe, insmod, depmod打包到一起, 稱之為Linux核心模組管理工具, 針對2.4或以前的核心, 該工具名為modutils, 2.6的為module-init-tools.
通過$ lsmod 可以看到載入到核心中的模組資訊 也可以查看/proc/modules檔案的內容. 實際上,lsmod讀命令就是通過查看/proc/modules的內容來顯示模組資訊的.
卸載模組
使用 $ sudo rmmod mod_name 可以卸載模組. 但核心有時候認為卸載該模組是不安全的, 此時可以使用 $ sudo rmmod -f mod_name來強制卸載模組.
這裡都是介紹的載入,卸載模組的命令, 至於模組載入,卸載的原理. 參考" 模組運行環境"
準備工作
模組可以載入到當前啟動並執行核心中, 也可以載入到另一個未啟動並執行核心. 這裡暫時只考慮將模組載入到啟動的核心中.
學習模組編程, 先要重新編譯核心, 為什麼要編譯核心的? 原因有二:
1, 我們使用的Linux發行版中的核心針對kernel.org的官方核心添加了許多補丁, 提供的核心標頭檔並不完整, 核心API也可能被修改了, 要學習模組編程, 最好使用官方核心編譯.
2, 發行版的核心中, 一般預設的CONFIG_MODVERSIONS被設定為y. 這樣你在載入模組時會由於版本問題失敗, 所以應該不設定CONFIG_MODVERSIONS.
參考核心模組編程之_初窺門徑

模組程式組成
模組程式設計有點類似於應用程式設計: 起碼模組程式中有entry point和exit point. 並且模組程式碼位於獨立的檔案中.
下面看看模組程式組成.
模組程式中至少要有兩個函數: 一個初始化函數, 它在模組被載入到核心中的時候被調用, 一個退出函數(clean_up), 它在模組被卸載的時候被調用.
有兩種方法定義上述的兩個函數, 推薦用後面的定義方法!
int init_module(void)
{
...
}
void cleanup_module(void)
{
...
}
在2.3.13版之後的核心, 可以用下面的方法來定義它們:
static int hello_start(void)
{
...
}
static void hello_end(void)
{
...
}
module_init(hello_start);
module_exit(hello_end);
1, 初始化函數和退出函數的定義.
初始化函數和退出函數應該是這樣的形式:
static int funname_init(void); /* 模組被載入時被調用 */
static void funname_exit(void); /* 模組被卸載時被調用 */
由於不向外輸出這些函數, 一般給它們加上static限定符號.
2, module_init和module_exit宏
funname_init ()通過module_init()被註冊為模組的entry point. 同樣地, funname_exit()通過module_exit()宏被註冊為模組的exit point. 注意: 如果檔案被編譯到靜態核心映像中, 退出函數不會被執行. 這些宏擴充必須位於相應函數定義之後!
3, 著作權資訊
從2.4版的核心起, 可以使用一些宏來聲明模組的著作權資訊:
MODULE_LICENSE()宏:
括弧中的內容可以是下面的幾種形式:
"GPL" [GNU Public License v2 or later]
"GPL v2" [GNU Public License v2]
"GPL and additional rights" [GNU Public License v2 rights and more]
"Dual BSD/GPL" [GNU Public License v2 or BSD license choice]
"Dual MPL/GPL" [GNU Public License v2 or Mozilla license choice]
"Proprietary" [Non free products]
如果是MODULE_LICENSE("Proprietary"), 那麼你所編寫的模組不是免費的, 核心社區將其視為"汙染"了核心, 不會理會相關的bug report, 而且, 不遵循GPL的模組無法調用只針對GPL的符號(參考"輸出符號"的內容).
如果聲明雙重著作權, 那麼在Linux上, 它與聲明為GPL的效果是一樣的, 即Linux只在意GPL著作權.
另外, MODULE_DESCRIPTION() 描述模組的功能; MODULE_AUTHOR()描述模組的作者; and MODULE_SUPPORTED_DEVICE() 聲明模組所支援裝置的類型.
在核心源碼樹的/include/linux/module.h中定義著作權宏. 這些宏一般位於檔案結尾.
4, 包含標頭檔.
在模組程式開頭需要包含標頭檔:
#include /* 所有的模組檔案都要包含 */
#include /* 若使用了優先順序標誌,需包含 */

#include /* 若使用了宏, 需包含 */

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.