前篇介紹的 hello-1.c 需要進行編譯成 kernel module 之後,才能夠載入執行,而編譯 kernel module 跟編譯一般程式有很大的不同。首先我們需要建立一個 Makefile,內容指示編譯器如何去進行 compile 的動作:
obj-m += hello-1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
在完成以上內容的 Makefile 之後,只須執行 make 命令,就可以建立出名為 hello-1.ko 的 kernel module。其中 obj-m 表示要編譯成模組的檔案名稱集合。依慣例 all 為預設的 make 動作,clean 為清除的動作。
一開始在我的目錄裡只有 hello-1.c 與 Makefile 兩個檔案,再進行 make 之後會產生一些中間黨與 kernel module:
[root@Pomelo-14-61 LKMP]# ls
hello-1.c Makefile
[root@Pomelo-14-61 LKMP]# make
make -C /lib/modules/2.6.32-279.22.1.el6.x86_64/build M=/root/pomelo/LKMP modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-279.22.1.el6.x86_64'
CC [M] /root/pomelo/LKMP/hello-1.o
Building modules, stage 2.
MODPOST 1 modules
CC /root/pomelo/LKMP/hello-1.mod.o
LD [M] /root/pomelo/LKMP/hello-1.ko.unsigned
NO SIGN [M] /root/pomelo/LKMP/hello-1.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-279.22.1.el6.x86_64'
[root@Pomelo-14-61 LKMP]# ls
hello-1.c hello-1.ko.unsigned hello-1.mod.o Makefile Module.symvers
hello-1.ko hello-1.mod.c hello-1.o modules.order