内核模块编译总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Modules在编译的时候会遇到下列问题:

1.首先是要加载内核存放的路径,同时,在编译modules之前要先区内核所在的目录下执

行make modules_prepare。

2.如果模块在编译过程中出现没有定义的变量(编译过程中显示*.*undefined!)警告时,

这样编译出来的ko在最后插入时候将报以下错误(unknown symbol,can’t insert)

3.第二个是不同的ko insmod有个先后的顺序,依赖其它模块的ko最后插入,被依赖的

模块在最前面插入。

4.最后看一下编译一个模块所用的makefile文件:

INCLUDE := $(PWD)/

ifneq ($(KERNELRELEASE),)

EXTRA_CFLAGS += -I$(INCLUDE)

EXTRA_CFLAGS += -march=ba2

obj-m += ec_ap.o

ec_ap-objs := ec_ap.o ec_ap_core.o ec_ap_diag.o

else

PWD := $(shell pwd)

KDIR := /home/share/Develop/code/linux/kernel/linux-2.6.29

all:

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

.PHONY clean:

make -C $(KDIR) M=$(PWD) clean

-rm -f *.o *.ko *.mod.c modules.order Module.symvers

Endif

#KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile 时,#KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。#obj-m :=ec_ap.o表示编译连接后将生成ec_ap.o模块。

#ec_ap-objs := ec_ap.o ec_ap_core.o ec_ap_diag.o表示ec_ap.o 由ec_ap.o与ec_ap_core.o ec_ap_diag.o连接生成。如果有多个依赖文件文件,需要把这一句加上

#PWD := $(shell pwd) 执行shell命令,把当前路径赋值给PWD

#-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile

#M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make 将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。

#$(MAKE) 指定编译器

#modules 声明编译模块

#clean:

# rm -rf .*.cmd *.o *.ko *.mod.c .tmp_versions 这是个清除命令与编译没有关系,当执行make clean 时就会执行这条指令然后删除这类的文件

相关文档
最新文档