当前位置: > 华清远见教育集团 > 嵌入式学习 > 讲师博文 > Linux字符设备驱动模型之Linux内核模块参数
Linux字符设备驱动模型之Linux内核模块参数
时间:2017-11-06作者:华清远见

在Linux内核驱动中,难免的两个内核模块之间具有依赖关系,他们或许是通过进行某种传参,获取进行函数之间的调用。因为每一个模块在Linux系统Kernel中是相对独立的,所以Linux内核驱动模块之间进行通信就不能直接使用函数调用等方式了。

一、Linux内核模块参数

在上文中已经给出了一个简单的Linux内核驱动模块的模板了。那么我们在这个模板上进行添加代码。



       

如上图所示即为所使用代码。定义全局变量static int  a和static char *str。在Linux内核中使用宏module_param声明这两个参数作为内核参数进行传递。宏module_param的三个参数分别代表参数变量本身、变量的类型和此参数的使用权限。后当内核模块插入成功,同样在static int __init hello_init(void)函数中将这两个参数进行打印。

将其编译生成Linux内核驱动文件hello_driver.ko。将其拷贝到板卡根文件系统中。后使用命令insmod hello_driver.ko装载驱动模块hello_driver。如下图:

如上图,当驱动模块装载成功后,会有相应的打印输出,但这并未体现出Linux内核模块参数的特点。

 

二、Linux内核模块参数之间的通信

实际上Linux内核模块参数的特性应该体现在内核驱动模块之间的通信或者调用。现在将实现两个Linux内核驱动模块,然后进行调用。

模块一:文件名-----add_sub_driver.c和add_sub_driver.h

add_sub_driver.c

如上图即为add_sub_driver.c驱动模块的代码,其所做的事非常简单,实现两个参数之间的和(int add_int(int i, int j))和差(int sub_int(int i, int j))。后通过EXPORT_SYMBOL模块导出符将相应的函数导入到内核符号表中,可供Linux内核其他驱动模块进行调用。

add_sub_driver.h文件:

模块二:文件名-----hello_driver.c和add_sub_driver.h

hello_driver.c文件:

hello_driver.c文件Demo是在上一个实验上扩展的,如下图:



       

如上图,定义两个全局变量,通过宏module_param声明其为内核模块参数传递,后通过在hello_driver内核模块加载时进行调用add_sub_driver内核模块的实现方法函数,两个变量作为参数传递。实现两个Linux内核模块之间的通信。后使用printk将调试信息打印。

编译管理工具Makefile:

如上图为编译所使用的Makefile文件。其可以同时编译出hello_driver内核模块hello_driver.ko和add_sub_driver内核模块add_sub_driver.ko。

三、Linux内核模块通信验证

将编译生成的hello_driver.ko和add_sub_driver.ko文件拷贝到板卡根文件系统中。然后相序插入内核模块。

方式一:先加载hello_driver.ko后加载add_sub_driver.ko

如上图可知,当先加载hello_driver.ko时,加载失败,报错:不能插入hello_driver.ko,其中包含有无效的参数。

方式二:先加载add_sub_driver.ko后加载hello_driver.ko

如上图可知,当先加载add_sub_driver.ko后加载hello_driver.ko时,直接加载成功。原因是add_sub_driver.ko驱动模块中存在hello_driver.ko驱动模块加载时所做运算的运算方法函数。当add_sub_driver.ko模块没有被加载时,加载hello_driver.ko会在不到实现运算的方法,所以加载失败。


发表评论
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2018 北京华清远见科技发展有限公司 版权所有 ,京ICP备16055225号,京公海网安备11010802025203号