2022年编译linux外部驱动模块时的基础知识 .pdf

上传人:H****o 文档编号:25532807 上传时间:2022-07-11 格式:PDF 页数:4 大小:34.95KB
返回 下载 相关 举报
2022年编译linux外部驱动模块时的基础知识 .pdf_第1页
第1页 / 共4页
2022年编译linux外部驱动模块时的基础知识 .pdf_第2页
第2页 / 共4页
点击查看更多>>
资源描述

《2022年编译linux外部驱动模块时的基础知识 .pdf》由会员分享,可在线阅读,更多相关《2022年编译linux外部驱动模块时的基础知识 .pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、读书之法 ,在循序而渐进 ,熟读而精思编译 linux 外部驱动模块时的基础知识linux内核模块编译引言为了清晰的编译Linux 内核,内核编译系统使用Kbuild 规则对编译的过程以及依赖进行规约。在内核模块的编译中,为了保持与内核源码的兼容以及传递编译链接选项给GCC,也使用Kbuild 规则。内核模块的源代码可以在内核源码树中,也可以在内核源码树外,当使用Kbuild 时,两种情况的编译方式也大致相似。一般的内核模块在开发时,都是放在源码树外的。本文主要是针对源码树外部的内核模块的编译。为了屏蔽内核模块编译的复杂性,开发人员需要编写额外的Makefile ,最终让编译内核模块就像编译普

2、通的应用程序一样,敲入”make ” 就行了。本文后面就给了一个实例。编译外部模块在编译外部模块之前,需要首先准备好当前内核的配置以及内核头文件,同时,当前内核的modules enable选项应该开启(编译内核时指定)。命令行选项使用如下命令编译外部模块:make C M= 其中 -C 表明 make 要调用 下的 Makefile ,该 Makefile 就是内核的Makefile ,M 为该 Makefile 的参数,指定外部模块源码的路径。当Makefile 接收到 M 参数时,就默认编译外部模块。例如,当前目录下存放一个外部模块的源码,其编译命令如下:make C /lib/modu

3、les/uname -r/build M=pwd 其中 uname r 获取当前运行内核的版本,pwd 为当前源码路径,将其展开之后为:make C /lib/modules/ 2.6.42.9/build M=/home/user/hello 其中 /lib/modules/ 2.6.42.9/build是指向内核源码目录的符号链接。编译完成之后,要安装驱动时,调用如下命令:make C /lib/modules/uname -r/build M=pwd modules_install 编译目标modules编译外部模块,默认目标就是modules modules_install安装编译成功

4、了的外部模块,默认的安装目录为/lib/modules/extra/,前缀可以同过INSTALL_MOD_PATH 指定。clean清除选项help列出可用的外部目标Kbuild文件在执行了 make C /lib/modules/uname-r/build M=pwd之后,内核源码树中的Makefile会再次跳转到 pwd目录下,加载Kbuild 或 Makefile( 如果没有Kbuild 文件,则加载Makefile ,因此, Kbuild 文件中的内容也可以放到Makefile 中)。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,

5、共 4 页读书之法 ,在循序而渐进 ,熟读而精思如果模块源码目录中的Kbuild 或 Makefile 中没有定义编译目标时,编译过程最终是什么都没生成的。以下一行就是定义生成目标:obj- m: = .o .o上面的 obj-m 变量是指外部模块,其后面的一组.o最终生成.ko模块。同样,还有一个变量obj-y ,它包含要静态编译进入内核的模块。本文不考虑它。在默认情况下,内核源码编译系统会将.c编译成 .o,并最终链接生成 .ko。如果 .ko需要多个源文件时,Kbuild或 Makefile 中要添加如下行:-y: = src1.o src2.o .Makefile 与 Kbuild 合

6、并为了屏蔽编译内核模块的复杂性,让使用人员简单的调用make/makeinstall即可完成内核模块的编译,模块源码目录下通常添加了一个wrapper Makefile,供向的Makefile 包含了 Kbuild部分,内容如下:ifneq ($(KERNELRELEASE),) obj-m := hello.o else default: $(MAKE) -C /lib/modules/uname -r/build M=pwd modules endif Kbuild 与 Makefile 分离当内核模块源码目录下同时包含了Kbuild 与 Makefile 时,编译系统只加载Kbuild

7、文件。两个文件内容分别如下:Makefile内容如下:default: $(MAKE)-C /lib/modules/uname -r/build M=pwd 这里的 Makefile 只是对内核Makefile 调用进行了封装。Kbuild内容如下:EXTRA_CFLAGS := -I.-include ./xxx.h obj-m := module1.o module2.o module1-objs := src1.o module2-objs := src2.o 头文件在内核源码树中,头文件的存放规则如下:1.如果该头文件定义的是模块内部的接口,则头文件放在模块所在的目录下2.如果头文件

8、中内容在内核其他子系统中使用,则放在include/linux 模块版本精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 4 页读书之法 ,在循序而渐进 ,熟读而精思模块版本选项是通过内核编译选项CONFIG_MODVERSIONS 定义的,它是一个简单的ABI 兼容性检查机制。对于模块的每个导出符号,都有一个对应的CRC校验值。当模块加载或使用时,内核会用自己的CRC值与模块的CRC值进行对比,如果不同,则拒绝加载模块。在内核源码树根目录中,其中的Module.symvers文件就包含了内核所有的导出符号以及所有编译后模块的导出符号。s

9、ymbol from kernel(vmlinux+all modules)在编译内核时,根目录下会生成Module.symvers文件,它包含了内核以及编译后的模块导出的所有符号。对于每一个符号,相应的CRC校验值也被保存,Module.symvers每一行数据格式如下: 0 x2d036834 scsi_remove_host drivers/scsi/scsi_mod 当内核编译选项CONFIG_MODVERSIONS 关闭时,所有的CRC值都为 0 x00000000 。Module.symvers文件主要有以下用途:1.列出 vmlinux 和所有模块的导出函数2.列出所有符号的CR

10、C校验值symbol and extern modules当编译外部模块时,在MODPOST 阶段时,会访问内核源码树中的Module.symvers检测当前模块的外部符号是否已经被定义,同时,如果外部模块源码根目录下包含了Module.symvers文件,该文件也会被检测。对于当前模块的每个外部符号,编译系统都会从当前目录下的Module.symvers以及内核源码树下的 Module.symvers中查找,检测是否有该符号。在 MODPOST 阶段,会在当前目录下生成一个新的Module.symvers ,它包含kernel 中未定义的所有符号。当外部模块需要从另一个外部模块中导入符号时,

11、有三种方法可以解决。1.使用 top-level Kbuild文件例如,两个模块foo.ko,bar.ko ,其中 foo.ko 依赖 bar.ko 中的导出符号,可以使用一个顶层公用的 Kbuild 文件对两个模块同时编译,假设目录如下:./foo/ = contains foo.ko ./bar/ = contains bar.ko 顶层的 Kbuild 文件内容如下:obj-y := foo/ bar/ 执行 make -C $KDIR M=$PWD,在编译过程中,两个模块的导出符号是共享的。2.使用额外的Module.symvers文件首先生成外部模块bar.ko ,生成之后,bar.

12、ko 目录下生成一个Module.symvers文件,它包含了 kernel 中的 Module.symvers未定义的所有符号(当然包含bar.ko 的导出符号 )。在编译 foo.ko 时,为了能访问bar.ko 的导出符号,可以将bar.ko 生成的 Module.symvers文件复制到foo 编译目录。编译时,会读取 foo 目录下的Module.symvers文件,同时,生成一个所有未在kernel 中定义的符号文件Module.symvers 。3. 调用 make时传入参数KBUILD_EXTRA_SYMBOLS杂项精选学习资料 - - - - - - - - - 名师归纳总结

13、 - - - - - - -第 3 页,共 4 页读书之法 ,在循序而渐进 ,熟读而精思模块编译有时候需要通过检查内核编译选项CONFIG_option 决定哪些功能被编译进模块,在Kbuild 中,可以直接使用这些选项。例如:obj-$(CONFIG_EXT2_FS) += ext2.o ext2-y := balloc.o bitmap.o dir.o ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o 通常情况下, $(CONFIG_EXT2_FS) 的值为 m,y 或未定义。为m 时,说明目标模块编译成内核模块,若未y,则目标编译进vmlinux ,若未定义,则目标不编译。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 4 页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁