龙空技术网

Linux字符设备驱动模型之Linux内核模块参数

今天你敲代码了吗? 292

前言:

现时你们对“linux 函数参数”大致比较关切,大家都需要知道一些“linux 函数参数”的相关知识。那么小编也在网上搜集了一些对于“linux 函数参数””的相关内容,希望你们能喜欢,同学们一起来学习一下吧!

在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会在不到实现运算的方法,所以加载失败。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。点击文中文蓝字字领取

标签: #linux 函数参数