驱动编译进内核和编译成模块有什么区别
内核模块或者设备驱动开发者经常接触的Makefile语法包含以下几个部分。
1.目标定义:
目标定义用来定义哪些内容要作为模块编译,哪些内容要编译进内核。
例如1:
obj-y +=foo.o
#表示要由foo.c或者foo.s文件编译得到foo.o并连接到内核当中去。
obj-m +=foo.o
#表示要由foo.c或者foo.s文件编译得到foo.o编译成模块。
除了
obj-y
,obj-m
以外的obj-x
都不会编译。最常用的就是根据
Kconfig
得到的.config
文件的CONFIG_变量
来决定文件的编译方式。
例如2:
obj-$(CONFIG_ISDN)+=isdn.o
2.多文件模块的定义
如果一个模块由多个文件组成,这时候应该采用模块名加-objs
后缀或者-y
后缀的形式来定义模块的组成文件。
例如3:
obj-$(CONFIG_EXT3_FA) +=ext3.o
ext3-y:=balloc.o bitmap.o
ext3-$(CONFIG_EXT3_XTT)+=xttattor.o
简单说明上面的意思。
模块的名字是
ext2
,它至少由balloc.o
和bitmap.o
两个目标文件最长生产。是否再添加xttattor.o
要看CONFIG_EXT3_XTT
是否为y
或者m
.
上面的这种模块方式也可以直接写成obj的形式。
obj-$(CONFIG_ISDN)+=isdn.o
isdn-objs :=isdn_net_lib.o isdn_v110.o isdn_common.o
3.目录层次的迭代
就是表示某一个目录是否编译。
例如4:
obj-$(CONFIG_CBS) += cbs/
当
CONFIG_CBS
为y
或者m
的时候,会去找cbs
目录下的Makefile
文件。但是cbs/makefile
文件具体是编译成模块还是内核完全由它自己觉得。
CONFIG_CBS
只是表示包含或者不包含进入编译,没有其他的很大的意义。
4.编译进内核和模块的区别
通过上面的说明,我们应该明白了y和m在大部分的情况下是有区别的。那他们的区别到底是什么呢?
例如:
obj-$(CONFIG_DEMO) +=cbs.o
如果CONFIG_DEMO
=y
,则会将生成内核中。
=m
, 则会生成cbs.ko模块文件
=n
, 则不会编译此文件