主要看一下:Linux驱动代码重用
- 编译是由多个文件组成的 Linu x 驱动
对于复杂的 Linux 驱 动,就需要使用多个源代码文件存放不同的功能代码,这样做有利于代码分类和管理。
C或C++语言中编译多个源代码文件时,如果a.c使用 b.c文件中的函数,需要在 a.c 文件中使用 extern 预先定义 b.c中的函数, extern 的作用就是告诉编译器该 函数的函数名、参数个数、参数类型和返回值类型.这些信息对于将a.c 编译成 a.o。已经足够了.等到将 a.o 和 b.o链接成可执行文件或程序库时,编译器再到 b.o中寻找函数的具体实现,也就是说, extern只在编译阶段起作用.
除此之外,Makefile中如果 Linux驱动只有 1 个源代码文件, obj-m变量的值可以和源代码文件同名。例如,源代码文件为 main.c, obj-m 的值为 main.o。如果 Linux驱动包含多个文件现, 就需要使用module-y C或 module-objs)来指定所在的目标文件。而不能只指定被引用的目标文件。
编译完Makefile之后-----à输入su builed.sh-----àdmesg。
2.Linux 驱动模块的依赖(导出符号)
(1)代码重用分为静态和动态两种。上述介绍的方式是代码的静态重用,这种方式是代码级的重用,也就是将需要重用的代码和使用这些代码的使用者放在一起进行编译,最终生成一个可执行文件或程序库(.ko、 .so 等)。
另外一种代码共享的方式:模块依赖,也称为导出符号。如果只能用一句话解释如何利用导出符号实现代码共卒,这句话就是“在一个驱动模块里使用另一个驱动模块里的被导出的符号(常量、变量、函数等)”
(2)在 Linux 驱动中可以使用如下两个宏导出函数。
EXPORT_SYMBOL (符号名)
EXPORT_SYMBOL_GPL (符号名)【EXPORT_SYMBOL_GPL 仅用于采用 GPL 协议的 Linux 驱动模块中】
(3) 输入如下的命令可以从/proc/kallsyms 文件中查看 symbol_producer 驱动导出的符号。
cat /proc/kallsyms I grep symbol_producer
注意:在安装symbol_consumer 之前,需要先安装 symbol_producer,卸载这两个 Linux 驱动的顺序正好相反。需要先卸载 symboI_consumer,然后才能卸载 symbol_producer。
输入下面的命令可以看到 symbol_prodoucer和 symbol_consumer之间的依赖关系:lsmod I grep symbo1.
(4) depmod 和 modprobe 命令。其中 depmod 命令用于分析 Linux 模块之间的依赖性,这一功能在多个 Linux 模块之间拥有复杂的依赖关系方面非常有用。使用 depmod 分析完 Linux 模块的依赖关系后,就可以使用 modprobe 命令装载Linux模块。 modprobe命令全根据 depmod 命令生成的 Linux 模块依赖关系来装载Linux 模块,并不需要像使用 insmod 命令那样挨个装载 Linux 模块。