1.将test文件夹copy到内核的driver文件夹下
cp -a ~/testrpm/BUILD/linux/drivers/
2.vi修改driver文件夹下的Makefile
virpm/BUILD/linux/drivers/Makefile
3.Makefile
可以仿照Makefile里的内容在最后添加如下一行
ojb-m += test/ ## 然后保存退出
注1: obj-y += foo.o表示要由foo.c或者foo.s文件编译得到foo.o并链接进内核,而obj-m则表示该文件要作为模块编译。 除了y,m以
外的obj-x形式的目标都不会被编译。而更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式,如:obj-$(CONFIG_ISDN) += isdn.o
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
除了obj-形式的目标以外,还有lib-y library库,hostprogs-y 主机程序等目标,但是基本都应用在特定的目录
和场合下。
注2:多文件模块的定义
如果一个模块由多个源文件组成,那么稍微复杂一些,采用模块名加 -objs后缀或者 -y后缀的形式来定义模块的组成文件。如以下例子:
obj-$(CONFIG_EXT2_FS) += ext2.o
ext2-y := balloc.o bitmap.o
ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o
模块的名字为ext2,由balloc.o和bitmap.o两个目标文件最终链接生成ext2.o 直至ext2.ko文件,是否包括
xattr.o取决于内核配置文件的配置情况。如果CONFIG_EXT2_FS的值是y也没有关系,在此过程中生成的 ext2.o将
被链接进built-in.o最终链接进内核。这里需要注意的一点是,所在的目录中不应该再包含和模块名相同的源文件如ext2.c/ext2.s。(这一点非常重要,也即含有module_init和module_exit的模块也必须在ext2-y中指定,而obj-$(CONFIG_EXT2_FS)中指定的只是一个最终生成的.ko的名字,并且去掉了.o后缀)或者写成如-objs的形式:
obj-$(CONFIG_ISDN) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
4.模块编译
例子1:
./ltib-m shell
LTIB> cdrpm/BUILD/linux/drivers/test/
LTIB> make V=1 ARCH=powerpc
例子2:
编译模块的时候,你可以将模块放在代码树中,用Make modules的方式来编译你的模块,你也可以将模块相关文
件目录放在代码树以外的位置,用如下命令来编译模块:
make -C path/to/kernel/src M=$PWD modules
-C指定代码树的位置,M=$PWD 或 M=`PWD` 告诉kbuild回到当前目录来执行build操作。对于交叉编译环境为:
$(MAKE) ARCH=arm CROSS_COMPILE=arm-linux- -C $(KERNELDIR) M=$(PWD) modules
注意这里是以arm为例。
5.模块的安装
当你需要将模块安装到非默认位置的时候,你可以用INSTALL_MOD_PATH 指定一个前缀,如:
make INSTALL_MOD_PATH=/foo modules_install
模块将被安装到 /foo/lib/modules目录下。
以下是test.c
#include<linux/init.h> /* printk()*/
#include<linux/module.h> /* __init__exit */
static int __init hello_init(void) /*模块加载函数,通过insmod命令加载模块时,被自动执行*/
{
printk(KERN_INFO " Hello Worldenter\n");
return 0;
}
static void __exit hello_exit(void) /*模块卸载函数,当通过rmmod命令卸载时,会被自动执行*/
{
printk(KERN_INFO " Hello World exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("wht"); /*模块作者,可选*/
MODULE_LICENSE("GPL"); /*模块许可证明,描述内核模块的许可权限,必须*/
MODULE_DESCRIPTION("Asimple Hello World Module"); /*模块说明,可选*/
MODULE_ALIAS("a simplestmodule"); /*模块说明,可选*/
以下是Makefile
ifneq ($(KERNELRELEASE),)
obj-m := test.o
else
KDIR := ../..
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD)
endif