内核模块编译总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 时就会执行这条指令然后删除这类的文件