linux模組的編譯步驟詳解
Linux 模組的編譯步驟
1. 原始碼準備
#include <linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("GPL");
static int hello_init(void)
{
printk(KERN_ALERT"Hello,world!\n");
return 0;
}
static int hello_exit(void)
{
printk(KERN_ALERT"good bye,cruelworld!\n");
}
module_init(hello_init);
module_exit(hello_exit);
2. 編寫Makefile檔案
obj-m := modules.o
modules-objs := mymod.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) modules
#clean:
#rm -rf *.o *.cmd *.ko *.mod.c*.tmp_versions
注意:default下面一行要以tab鍵開頭。
3. 編譯模組
在mymod.c所在資料夾中,執行make,出現錯誤:
make-C /lib/modules/2.6.32-220.el6.x86_64/build M=/zk modules
make: *** /lib/modules/2.6.32-220.el6.x86_64/build: 沒有那個檔案或目錄。 停止。make: *** [default] 錯誤 2
原因分析:其實該目錄下的build檔案是存在的,不過build檔案是一個連結檔案,它指向的內容不存在。也就是/usr/src/kernels目錄為空,所以出現了這個錯誤。KDIR目錄是模組編譯環境的目錄。這種情況的出現時由於缺少核心開發包kernel-devel導致的。
解決方法:直接利用本地映象檔案來安裝。
首先掛載映象檔案:mount /dev/cdrom /mnt/cds,然後進入Packages目錄下;
然後搜尋是否安裝kernel-devel:rpm –q kernel-devel*,出現提示:
package kernel-debug-2.6.32-220.el6.x86_64.rpm is not installed
package kernel-debug-devel-2.6.32-220.el6.x86_64.rpm is notinstalled
package kernel-devel-2.6.32-220.el6.x86_64.rpm is notinstalled
package kernel-doc-2.6.32-220.el6.noarch.rpm is not installed
這時候,利用命令rpm -ivh kernel-devel-2.6.32-220.el6.x86_64.rpm安裝即可。
當這個錯誤解決後,再次執行make:
make -C /lib/modules/2.6.32-220.el6.x86_64/build M=/zk modules
make[1]: Entering directory`/usr/src/kernels/2.6.32-220.el6.x86_64'
CC [M] /zk/mymod.o
/zk/mymod.c: 在函式‘__exittest’中:
/zk/mymod.c:16: 警告:返回了不相容的指標型別
LD [M] /zk/modules.o
Building modules, stage2.
MODPOST 1 modules
CC /zk/modules.mod.o
LD [M] /zk/modules.ko.unsigned
NO SIGN [M]/zk/modules.ko
make[1]: Leaving directory`/usr/src/kernels/2.6.32-220.el6.x86_64'
這時候,在mymod.c所在的目錄生成了如下幾個檔案:
modules.mod.o mymod.c modules.ko modules.o mymod.o
modules.ko.unsigned modules.order modules.mod.c Module.symvers
4. 載入和解除安裝我們的模組
終端輸入:
[root@localhost zk]# insmod modules.ko
然後檢視是否成功掛載:[root@localhost zk]# dmesg | tail -1
輸出結果如下:
Hello,world!
然後再解除安裝一下模組: [root@localhost zk]# rmmodmodules.ko
然後檢視是否成功解除安裝: [root@localhost zk]# dmesg |tail -2
輸出如下: Hello,world!
good bye,cruel world!