花了一晚上的時間才搞出這麼點名堂,有點丟人。不過丟人就丟人吧,總歸得把這僅有的成果記錄下來。
[環境]Vmware5.5 + Fedora8(Kernel:2.6.23.1-42.fc8-i586)
===================================================
[原始碼hellomod.c]
這裡我僅使用了最簡單的代碼HelloWorld
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
MODULE_LICENSE("GPL")
static int __init my_init(void)
{
printk("<1>hello world!\n");
return 0;
}
static void __exit my_cleanup(void)
{
printk("<1>GoodBye!\n");
}
module_init(my_init);
module_exit(my_cleanup);
==============================================
[Makefile檔案內容]
obj-m += hellomod.o
all:
make -C /lib/modules/`uname -r`/build M=`pwd` modules
clean:
make -C /lib/modules/`uname -r`/build M=`pwd` clean
****說明:
-C選項指定核心標頭檔的路徑,所以如果這裡不正確的話,就得仔細檢查你的目錄是不是正確。build只是一個符號連結,一般它指定的正是你的源碼所在的目錄,如果有的話。如果它不能正確連結,那麼可能是你的源碼並未安裝或者安裝的版本與當前正在工作的核心不對應。這時你就需要安裝正確的與當前核心匹配的源碼(這步很重要,我就在這兒吃了虧,浪費很多時間)。
==============================================
[編譯]
好了,這時已經有兩個檔案了,hellomod.c和Makefile,隨便找個目錄放下,shell到這目錄,輸入make:
MODPOST 1 modules
看到這個的話說明編譯通過了,產生正確的核心模組檔案hellomod.ko
===============================================
[載入]
執行insmod hellomod.ko
[卸載]
rmmod hellomod
[查看核心輸出]
tail /var/log/messages
這時就可以看到核心模組在載入和卸載時輸出的資訊了。
================================================
P.S 本來是個挺簡單的事情,結果由於我的FC8核心與源碼不一致,導致編譯通過的模組一直載入不了,報格式錯誤,折騰了好久才發現。
為什麼很久呢,因為我uname -r出來,都說我是i686;另外我到/lib/modules/下,發現也是i686,但是我到裡面隨便找了個.ko檔案,執行modinfo發現都依賴i586,這才讓我找到真正原因。於是找出光碟片,重裝i586源碼,再編譯,一切正常。^_^