Linux內核模塊程序加載方法

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

相關文章
相關標籤/搜索