hello內(nèi)核模塊編譯的全過程
內(nèi)核版本:2.6.10
在/home/tmp/下建立兩個(gè)文件hello.c,Makefile
hello.c
------------
#include linux/init.h>
#include linux/kernel.h>
#include linux/module.h>
MODULE_LICENSE("GPL");
static int hello_init(void)
{
printk(KERN_ALERT "hello module initn");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "hello module exitn");
}
module_init(hello_init);
module_exit(hello_exit);
--------------
Makefile
----------
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -f *.ko *.mod.c *.mod.o *.o
-----------
編譯模塊
#make
清除
#make clean
-----------
為了能夠在終端顯示信息,要修改
/lib/modules/2.6.10/build/include/linux/kernel.h
文件的KERN_ALERT宏。
#define KERN_ALERT "1>"
修改為
#define KERN_ALERT "0>"
------------
安裝模塊
#insmod hello.ko
終端顯示
hello module init
查看已安裝的模塊
#lsmod
卸載模塊
#rmmod hello
終端顯示
hello module exit
-----------
有以下幾點(diǎn)要注意:
1,hello.c文件中調(diào)用的頭文件
init.h中的module_init(),module_exit()
kernel.h中的printk(),KERN_ALERT
module.h中的MODULE_LICENSE()
2,Makefile文件中的核心是
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
1),-C $(KERNELDIR)
表示在$(KERNELDIR)目錄下執(zhí)行make命令。
2),M=$(PWD)
表示包含$(PWD)下的Makefile文件。
3),modules
表示模塊編譯。
4), 用到了ifneq...else...endif語(yǔ)句
由于開始還沒定義KERNELRELEASE,所以只能執(zhí)行else分支。
而在執(zhí)行
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
后,會(huì)在內(nèi)核的Makefile中定義KERNELRELEASE,當(dāng)進(jìn)入本Makefile時(shí),
則只會(huì)執(zhí)行ifneq的第一個(gè)分支,即
obj-m := hello.o
這一句話是非常重要的。事實(shí)上,這個(gè)Makefile做的本份工作就是它。
我們也可以用命令行的方式來編譯:
在Makefile中的內(nèi)容寫為:
obj-m := hello.o
然后在終端敲入:
#make -C /lib/modules/2.6.10/build M=/home/tmp modules
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
linux相關(guān)文章:linux教程
評(píng)論