分类: LINUX
2011-08-03 09:12:04
#ifneq($(KERNELRELEASE),)
obj-m := hello.o
#else
KERNELDIR := /usr/src/linux/
modules:
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) $@
install:
insmod hello.ko
uninstall:
rmmod hello.ko
clean:
rm -rf *.ko *.o *.mod.c *.symvers *.order
/* ===================================================================================
上述makefile开始执行的时候,为定KERNELDIR义,所以为空,#ifneq($(KERNELRELEASE),)不成立,执行
else分支,执行到$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) $@ 的时候,make 离当前路径,到
KERNELDIR := /usr/src/linux/ kernel路径下读取相关的配置文件信息,之后回到当前目录下再次从
头执行makefile 文件,这个时候KERNELRELEASE 已经定义,不为空,那就执行obj-m := hello.o命令
生成我们的目标.KO文件.
===================================================================================*/
/*/* ===================================================================================
* =====================================================================================
*
* Filename: hello.c
*
* Description: dragon
*
* Version: 1.0
* Created: 2011年08月02日 03时02分35秒
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Company:
*
* =====================================================================================
*/
#include
#include
static char *param1 = "param1\n";
static int param2 = 2;
module_param(param1, charp, S_IRUGO);
module_param(param2, int, S_IRUGO);
MODULE_LICENSE("GPL"); /* 必不可少*/
/* 下面的信息是模块详细信息,作者自己根据喜好可增加,目的便于
使用该模块的用户能用诸如modinfo了解该模块的相关信息*/
MODULE_AUTHOR("dragon");
MODULE_DESCRIPTION("module learning");
MODULE_ALIAS(" test module");
MODULE_VERSION("2.6.27");
int exportsymbol_test(void)
{
printk("export symbol test\n");
return 0;
}
EXPORT_SYMBOL_GPL(exportsymbol_test);
//EXPORT_SYMBOL(exportsymbol_test);
static int __init hello_init(void)
{
printk("hello init\n");
printk("param1:%sparam2:%d\n", param1, param2);
return 0;
}
static void __exit hello_exit(void)
{
printk("hello exit\n");
printk("param1:%sparam2:%d\n", param1, param2);
return;
}
module_init(hello_init);
module_exit(hello_exit);