Linux提供了一種動態加載內核的機制,這種機制稱爲模塊(Module),模塊具備一下特色:
一、模塊自己不被編譯入內核映像,從而控制了內核的大小。
二、模塊一旦被加載,它就和內核中的其它部分徹底同樣。
爲了方便理解,下面從一個最簡單的內核模塊「Hello World」 開始。
(個人環境是:Ubuntu9.10 , linux-source-2.6.31)
一、在/home/china/test中編寫hello.c文件
以下:
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL"); //聲明GPL版權
static int hello_init(void) //加載
{
printk(KERN_ALERT "Hello World enter\n");
return 0;
}
static void hello_exit(void) //卸載
{
printk(KERN_ALERT "Hello World exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
寫好後保存退出;
二、同一目錄下編寫Makefile
obj-m :=hello.o
保存退出;
三、使用以下命令編譯hello模塊
make -C /usr/src/linux-headers-2.6.31-21-generic M=$(pwd) modules
(注:-C後爲系統內核存放路徑,M後爲hello.c源文件路徑,由於在test目錄下,因此用$(pwd)代替,若是不作該目錄下,則要寫全源文件的路徑)
四、編譯結果以下:
make:進入目錄'/usr/src/linux-headers-2.6.31-21-generic'
CC [M] /home/china/test/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/china/test/hello.mod.o
LD [M] /home/china/test/hello.ko
make:離開目錄「/usr/src/linux-headers-2.6.31-21-generic」
五、在test目錄下你會看到生成了以下文件
hello.c hello.mod.c hello.o modules.order
hello.ko hello.mod.o Makefile Module.markers Module.symvers
其中hello.ko就是模塊目標文件,
六、將hello.ko加載進內核
在終端下輸入以下命令: sudo insmod ./hello.ko
查看加載的內容: sudo dmesg | tail -n 1
此時輸出信息: Hello World enter
七、將hello.ko模塊卸載
在終端下輸入以下命令: sudo rmmod hello
查看卸載的內容: sudo dmesg | tail -n 1
此時輸出信息: Hello World exit
八、模塊卸載之後,使用 lsmod | grep hello 命令查看模塊列表,若是沒有任何輸出,表示hello模塊已被成功卸載。linux