linux字符设备文件通信,Linux字符设备驱动模型之Linux内核模块参数

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

一、Linux内核模块参数

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

b09dcd9c972d17eccb111d1ab7cf4d8d.png

502459c4a450746991bce56cfa871ce2.png

如上图所示即为所使用代码。定义全局变量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。如下图:

1bae7f6f5c93e5d4e810fb0e64833bac.png

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

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

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

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

add_sub_driver.c

4975bde27a2b3d1a94a7f293269ab14d.png

如上图即为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文件:

ec7284d28a8e5b1e1f797afc2979d67e.png

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

hello_driver.c文件:

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

a5aec9eec0438752b350eb63aa28d6db.png

cf4cadf2d744e11cf2cdf9bb99e50808.png

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

编译管理工具Makefile:

c33198734574550cf7a17c9b8b2889ef.png

如上图为编译所使用的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

8d8e6114e0fb713f143c52bfa7e8e392.png

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

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

9f2469829cfbf47a971aef90b07b1892.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值