Linux內核可加載模塊剖析

Linux 就是通常所說的單內核(monolithic kernel),即操作系統的大部分功能都被稱為內核,並在特權模式下運行。它與微型內核 不同,後者只把基本的功能(進程間通信 [IPC]、調度、基本的輸入/輸出 [I/O] 和內存管理)當作內核運行,而把其他功能(驅動程序、網絡堆棧和文件系統)排除在特權空間之外。因此,您可能認為 Linux 是壹個完全靜態的內核,但事實恰恰相反。通過 Linux 內核模塊(LKM)可以在運行時動態地更改 Linux。

    可動態更改 是指可以將新的功能加載到內核、從內核去除某個功能,甚至添加使用其他 LKM 的新 LKM。LKM 的優點是可以最小化內核的內存占用,只加載需要的元素(這是嵌入式系統的重要特性)。 Linux 不是可以進行動態更改的惟壹(也不是第壹個)單內核。Berkeley Software Distribution(BSD)的變體、Sun Solaris、更老的內核(比如 OpenVMS),以及其他流行的操作系統(比如 Microsoft? Windows? 和 Apple Mac OS X)都支持可加載模塊。 LKM 與直接編譯到內核或典型程序的元素有根本區別。典型的程序有壹個 main 函數,其中 LKM 包含 entry 和 exit 函數(在 2.6 版本,您可以任意命名這些函數)。當向內核插入模塊時,調用 entry 函數,從內核刪除模塊時則調用 exit 函數。因為 entry 和 exit 函數是用戶定義的,所以存在 module_init 和 module_exit 宏,用於定義這些函數屬於哪種函數。LKM 還包含壹組必要的宏和壹組可選的宏,用於定義模塊的許可證、模塊的作者、模塊的描述等等。