| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux驱动模块编译 -> 正文阅读 |
|
[系统运维]Linux驱动模块编译 |
1.makefile 1.1.modules模块上层makefile ?1.2.内核模块makefile 2.?makefile解析 2.1 定义变量: KERNELDIR内核top makefile所在路径。 CURRENT_PATH模块所在的文件夹路径。 ATOS_KCROSS_COMPILE定义编译工具链。 ATOS_ARCH处理器类型。 INCLUDE内核中应用的头文件所在的路径。 EXTRA_CFLAGS表示在编译模块时,需要添加的目录。编译器会从这些目录中找到所需要的头文件。 补充:如果在模块中引用了其他模块导出到内核符号表的函数,则需要包含该模块产生的符号表文件Module.sysvers。例如,modules模块中如果引用了同级文件夹中另一模块的函数则需要在modules模块makefile增加这一行定义:KBUILD_EXTRA_SYMBOL=$(obj)/../add_sub/Module.symvers 2.2 指定编译的目标文件 obj-m += module.o或obj-y? += module.o?(假设模块名为module) obj-m表示把文件module.o作为"模块"进行编译,不会编译到内核,但是会生成一个独立的 "module.ko" 文件;obj-y表示把module.o文件编译进内核; 如果有一个模块名为 module.ko, 是来自多个源文件(如?file1.c 和 file2.c ), 正确的书写应当是: obj-m := module.o module-objs := file1.o file2.o 第19行即是定义模块peripheral_modules.ko 。 2.3 模块编译 第10行 ~ 11行,编译模块。 2.4 模块装载 第12行 ~ 13行,modules_install指令是把编译的ko拷贝到根目录下的/lib/modules/4.1.15/目录中。 2.5 清除编译中间文件和编译结果 第15行 ~ 16行,modules_install指令是清除编译中间文件和编译结果。相当于以下指令: rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order 2.6 PHONY .PHONY是一个伪目标,可以防止在Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突,提高执行makefile时的效率。 2.6 makefile执行逻辑 这个 makefile 在一次执行中要被读 2 次。 KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,所以make将读入、执行ifeq之后的内容,如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(KERNELDIR)指明跳转到内核源码目录下读取那里的Makefile;M=$(CURRENT_PATH) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之后的内容。else之后的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名。obj-m := peripheral_modules.o表示编译连接后将生成peripheral_modules.o模块。 3. obj-m等在/kbuild/modules.txt中的定义 3.1 ?obj-m := <module_name>.o 在modules.txt中提到: The kbuild system will build <module_name>.o from <module_name>.c, and, after linking, will result in the kernel module <module_name>.ko. The above line can be put in either a "Kbuild" file or a "Makefile." When the module is built from multiple sources, an additional line is needed listing the files: <module_name>-y := <src1>.o <src2>.o ... 3.2 ?-C $KDIR and M=$PWD -C $KDIR The directory where the kernel source is located. "make" will actually change to the specified directory when executing and will change back when finished. M=$PWD Informs kbuild that an external module is being built. The value given to "M" is the absolute path of the directory where the external module (kbuild file) is located. 3.3 ?modules When building an external module, only a subset of the "make"targets are available. make -C $KDIR M=$PWD [target] The default will build the module(s) located in the current directory, so a target does not need to be specified. All output files will also be generated in this directory. No attempts are made to update the kernel source, and it is a precondition that a successful "make" has been executed for the kernel. modules The default target for external modules. It has the same functionality as if no target was specified. See description above. 3.4 ?modules_install Install the external module(s). The default location is /lib/modules/<kernel_release>/extra/, but a prefix may be added with INSTALL_MOD_PATH (discussed in section 5). 3.5 ?clean Remove all generated files in the module directory only. 3.6 ?help List the available targets for external modules. 参考:https://blog.csdn.net/u012247418/article/details/83684214 ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 19:30:42- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |