Linux内核模块在编译的时候可以通过命令编译:

make -C 内核源码绝对路径 M=模块源码文件所在的绝对路径 modules  

此命令的解释:

1)进入到内核源码目录
2)读取内核源码目录的Makefile
3)执行内核源码Makefile中的 modules 目标
4)根据 modules 目标的命令编译M所指向的文件路径 Makefile指定 的 C文件

如:

ARM板的内核源码路径:/root/work/linux-kernel/
模块源码路径 :/xxx/yyy/hello_model_single
命令
make -C /root/work/linux-kernel/ M=/xxx/yyy/hello_model_single modules


上述过程可以写一个相应的makefile模板:

#hello最终的模块名,单文件单模块时,这个名字就是源码文件名。hello.o对应于hello.c  也可以编译多个模块,只需要在后面依次添加上对应的.o就可以了
obj-m := hello.o
#如果是多个C文件(aa.c bb.c)编译成一个模块文件,如:target.ko,可以采用如下的方式:
# target就是最终模块的名字,自己定义,并且不能和任何一个c文件同名
obj-m := target.o	
#以下的格式: 模块名-objs = 模块的源文件对就的.o文件列表 ,aa.o bb.o 分别对应aa.c bb.c
mulc-objs = aa.o bb.o
	
#KDIR是内核源码路径,当编译X86的模块时候使用以下内核源码
#KDIR  :=/lib/modules/$(shell uname -r)/build
	
#KDIR是内核源码路径,当编译ARM 的模块时候使用自己配套的Linux内核源码
KDIR   := /root/work/linux-3.5/

#$(PWD) 是代表当前路径,也就是模块源码路径

all:
	make -C $(KDIR) M=$(PWD) modules   

clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.markers *.unsigned *.order *~

注:

一般只需根据自己的情况修改KDIR 和 obj-m := ?  内容就可以了。

PS:KDIR所指向的内核源码一定要被成功编译过,没有清除工程才能编译模块。

 

Logo

更多推荐