天下

记录修行的印记

Linux设备驱动程序:gnu make 扩展语法

要点:
在用户空间驱动程序
insmod
modprobe
rmmod


一些宏:
LINUX_VERSION_CODE
整数宏


GNU make 扩展语法
obj-m   +=hello.o
KERNELDIR   := /usr/src/linux-headers-2.6.32-5-686
PWD :=$(shell pwd)
.PHONY: test clean all
all:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versionsm *.order *.symvers .tmp_versions

test:
    insmod ./hello.ko
    rmmod hello
    dmesg -c

obj-m
由内核构造系统使用的makefilet符号,用来确定在当前目录中应构造哪些模块.
即m:指定把对象编译为模块

obj-y
指定把对象编译进内核中

如果我们要构造的模块为module.ko,并由file1.c和file2.c则正确的makefile可如下编写:
obj-m :=module.o
module-objs :=file1.o file2.o

为了让上面的makefile可以工作,必须在大的内核构造系统环境中调用它们,所以上述命令首先要改变-C指定的目录,即:
 $(MAKE) -C $(KERNELDIR)
然后指定M变量目录,即让makefile在构造modules目标之前返回到模块源代码的目录,既当前目录 M=$(PWD),最后modules目标指向obj-m变量中设定的模块.


M不是一个编译选项,而是一个变量,从顶层makefile文件里可以找到它的定义
文件在
/usr/src/linux-headers-2.6.32-5-common/Makefile

69 ifeq ("$(origin M)", "command line")
70   KBUILD_EXTMOD := $(M)
71 endif


-C 用于指定内核源代码的目录

-M 用于module所在的目录

 

如果一个模块包括了多个.c文件(如 file1.c , file2.c),则应该以如下方式编写Makefile
obj-m := modulename.o
module-objs := file1.o file2.o

posted on 2012-03-16 11:11 天下 阅读(755) 评论(3)  编辑 收藏 引用 所属分类: kernel & Driver

评论

# re: Linux设备驱动程序:gnu make 扩展语法 2013-02-12 17:52 kangear

学习了,转载过去了,不过没有一个官方的参考资料吗。好像不是太全呀。  回复  更多评论   

# re: Linux设备驱动程序:gnu make 扩展语法 2014-11-11 10:03 away

不错  回复  更多评论   

# re: Linux设备驱动程序:gnu make 扩展语法 2014-11-11 10:04 away

好像应该用 obj-m :=hello.o
一行就够了  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年3月>
26272829123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(4)

随笔分类(377)

随笔档案(327)

链接

最新随笔

搜索

最新评论