ltib添加编译linux外部模块

来源:互联网 发布:php没有大数据框架吗 编辑:程序博客网 时间:2024/05/22 08:25

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-+= 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-:= 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

0 0
原创粉丝点击