1. 程式人生 > >在Linux2.6核心(CentOS)中編譯核心模組的一個例子

在Linux2.6核心(CentOS)中編譯核心模組的一個例子

使用的簡單測試記憶體原始檔hello.c:

-------------------------------------------------------------------------
#include <linux/module.h>      /* Needed by all modules */
#include <linux/kernel.h>      /* Needed for KERN_INFO */
#include <linux/init.h>        /* Needed for the macros */
static int __init hello_start(void)
{
printk(KERN_INFO "Loading hello module...\n");
printk(KERN_INFO "Hello world\n");
return 0;
}
static void __exit hello_end(void)
{
printk(KERN_INFO "Goodbye Mr.\n");
}
module_init(hello_start);
module_exit(hello_end);
-------------------------------------------------------------------------


建立目錄demo/,進入demo目錄,把hello.c這個檔案放在裡面。

再建立一個Makefile檔案,內容如下:
obj-m = hello.o
KVERSION = $(shell uname -r)
all:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

【必須注意】Makefile檔案的兩行make開頭的行,make前頭必須是一個Tab空格,不能是Space鍵的其它空格,也不能沒有空格。(由於排版問題網頁上覆制過去的可能必須對照這裡修正為正確的TAB空格)

    升級CentOS到最新版本(我是在Xen的VPS下測試的)
yum -y update
    可以發現,升級為了CentOS 5.8
    然後,編譯:
make
    會有一些提示行,編譯成功後,生成如下檔案:
hello.ko  hello.mod.c  hello.mod.o  hello.o Module.markers  Module.symvers
    我們只需要其中的hello.ko,這個是核心模組檔案。
    複製到核心模組的隨便一個目錄裡去:
    cp hello.ko /lib/modules/2.6.18-308.1.1.el5xen/kernel/net/ipv4/
    (上面這行裡2.6.18-308.1.1.el5xen,是版本相關,不同的版本內容不一樣)
    更新modules.dep檔案執行:
    depmod
    然後,我們就可以使用modprobe或insmod命令載入它了:
    modprobe hello
    載入成功。

    我們可以vi /var/log/messages 看到我們的hello核心獨立載入模組輸出的除錯資訊。