驱动多文件编译和驱动命令行传参

news2024/11/29 3:59:02

目录

1. 驱动的多文件编译

1.1. 准备两个文件

1.2. 修改Makefile文件

1.3. 执行Make命令生成.ko文件

2. 驱动模块传递参数

2.1. 传递一个参数

2.1.1. 函数原型分析

2.1.2. 撰写.c文件

2.1.3. 撰写makefile

2.1.4. 编译makefile并验证

2.2. 传递多个参数并使用modeinfo查看驱动信息

2.2.1. 函数原型分析和命令解析

2.2.2. 撰写.c文件

2.2.3. 撰写makefile

2.2.4. 编译makefile验证

2.2.5. 使用modeinfo进行查看

2.3. 传递数组

2.3.1. 分析函数原型

2.3.2. 撰写.c文件

2.3.3. 撰写makefile文件

2.3.4. 编译makefile进行验证

3. 驱动安装完成以后更改变量方法

3.1. 查看lsmod可以查看驱动

3.2. 修改驱动变量

3.2.1. 找到路径

3.2.2. 查看变量值

3.2.3. 修改变量值


1. 驱动的多文件编译

流程如下

1.1. 准备两个文件

我使用了hello.c和add.c两个文件

hello.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>
//static防止别人用重名函数
static int __init hello_init(void)//入口:资源申请
{
printk("SouthernBird\n");
//_init将hello_init放到.init.text段中
return 0;
}

//static防止别人用重名函数
static void __exit hello_exit(void)//出口:资源释放
{
printk("I am leave\n");
//_exit将hello_exit放到.exit.text段中
}
module_init(hello_init);//告诉内核驱动的入口地址
module_exit(hello_exit);//告诉内核驱动的出口地址
MODULE_LICENSE("GPL");//许可证

add.c为空

1.2. 修改Makefile文件

KERNELDIR:=/lib/modules/$(shell uname -r)/build
#KERNELDIR:=/home/hq/temp/kernel-3.4.39/
PWD:=$(shell pwd)
all:
	make -C $(KERNELDIR) M=$(PWD) modules
clean:
	make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=demo.o
demo-y+=hello.o add.o

重点看:obj-m:=demo.o 和 demo-y+=hello.o add.o两句(前面的makefile在我上片帖子已经做了解析)

  • obj-m:=demo.o 这一行定义了一个变量obj-m,它指定了要编译生成的目标模块文件的名称为demo.o。该模块文件是通过编译demo.c源文件生成的。
  • demo-y+=hello.o add.o 这一行定义了一个变量demo-y,它指定了要编译生成的模块文件所需要的其他对象文件。在这里,hello.o和add.o是要与demo.o一起编译生成的对象文件。

1.3. 执行Make命令生成.ko文件

2. 驱动模块传递参数

2.1. 传递一个参数

2.1.1. 函数原型分析

函数原型:module_param(name, type, perm)
功能:	接收命令行传递的参数
参数:
	name:变量名
	type:变量类型
	perm:权限 0664 0775

2.1.2. 撰写.c文件

#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>
//定义变量a
int a=10;
//使用函数
module_param(a, int, 0644);
    
static int __init hello_init(void)
{
printk("SouthernBird:a is %d\n",a);//打印a的函数
return 0;
}

static void __exit hello_exit(void)
{
printk("I am leave\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

2.1.3. 撰写makefile

KERNELDIR:=/lib/modules/$(shell uname -r)/build
#KERNELDIR:=/home/hq/temp/kernel-3.4.39/
PWD:=$(shell pwd)
all:
	make -C $(KERNELDIR) M=$(PWD) modules
clean:
	make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=hello.o

2.1.4. 编译makefile并验证

不传参数验证

传参验证

2.2. 传递多个参数并使用modeinfo查看驱动信息

2.2.1. 函数原型分析和命令解析

》1.函数原型:MODULE_PARM_DESC(_parm,desc)
功能:	对变量的功能进行描述
参数:
	_parm:变量名
	desc:描述字段

》2.命令
    sudo modeinfo XXXX.ko 查看驱动信息

2.2.2. 撰写.c文件

#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>
//定义变量a和b
int a=10;
int b=20;
//使用命令行传参函数
module_param(a,int,0644);
module_param(b,int,0644);

//使用功能描述函数
MODULE_PARM_DESC(a,"this is a");
MODULE_PARM_DESC(b,"this is b");

static int __init hello_init(void)
{
printk("SouthernBird:a is %d\n",a);//打印a的函数
printk("SouthernBird:b is %d\n",b);//打印a的函数
return 0;
}

static void __exit hello_exit(void)
{
printk("I am leave\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

2.2.3. 撰写makefile

KERNELDIR:=/lib/modules/$(shell uname -r)/build
#KERNELDIR:=/home/hq/temp/kernel-3.4.39/
PWD:=$(shell pwd)
all:
	make -C $(KERNELDIR) M=$(PWD) modules
clean:
	make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=hello.o

2.2.4. 编译makefile验证

使用dmesg查看

2.2.5. 使用modeinfo进行查看

sudo modinfo hello.ko

关于变量的描述成功出现

2.3. 传递数组

2.3.1. 分析函数原型

函数原型:module_param_array(name, type, nump, perm) 
功能:接收命令行传递的数组
参数:
	name:数组名
	type:数组类型
	nump:参数个数
	perm:权限

2.3.2. 撰写.c文件

#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>
//定义数组
int ww[10]={0};

//定义module_param_array函数需要的元素个数
int num=0; //这里让num默认为0,通过module_param_array进行改变
//接收命令行传递数组
module_param_array(ww, int,&num, 0644);

static int __init hello_init(void)
{
int i=0;//注意此处i的位置
//在入口打印传递的数组
for(i=0;i<num;i++)
{
printk("ww[%d]:%d\n",i,ww[i]);
}
return 0;
}

static void __exit hello_exit(void)
{
printk("I am leave\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

2.3.3. 撰写makefile文件

KERNELDIR:=/lib/modules/$(shell uname -r)/build
#KERNELDIR:=/home/hq/temp/kernel-3.4.39/
PWD:=$(shell pwd)
all:
	make -C $(KERNELDIR) M=$(PWD) modules
clean:
	make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=hello.o

2.3.4. 编译makefile进行验证

注:按住传递命令行数组时候使用下方命令

sudo insmod hello.ko ww=2,5,6,7

3. 驱动安装完成以后更改变量方法

下面教程,以数组驱动为例

3.1. 查看lsmod可以查看驱动

3.2. 修改驱动变量

3.2.1. 找到路径

一般路径在:/sys/module/驱动模块的名字/parameters

上图就能看到我的驱动只有一个变量ww

3.2.2. 查看变量值

使用

cat <变量名>

3.2.3. 修改变量值

》1.使用

su

进入超级管理员模式

》2.使用

echo <新值> > <变量名>

就可修改变量值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程的创建和使用(二)

1、线程的类和方法 Thread类是JVM用来管理线程的一个类&#xff0c;换句话说&#xff0c;每个线程都有唯一一个的Thread对象与之关联。 1.1、Thread的常见方法 方法说明Thread()创建线程对象Thread(Runnable target)使用Runnable对象创建线程对象Thread(String name)创建线程…

【SpringCloud-5】gateway网关

网关是干啥用的就不用再说了。 sringcloud中的网关&#xff0c;第一代是zuul&#xff0c;但是性能比较差&#xff08;1.x是阻塞式的&#xff0c;2.x是基于Netty的&#xff09;&#xff0c;然后有了第二代GateWay&#xff0c;基于Reactor模型 异步非阻塞。 springcloud网关就是一…

经理的工作岗位职责描述10篇

经理的工作岗位职责描述&#xff08;篇1&#xff09; 1、销售工具的开发和制作 2、负责各类媒体、渠道的软文撰写&#xff0c;产品信息推广; 3、筹办重点客户&#xff0c;潜在客户的讲座论坛会议; 4、市场推广活动&#xff1a;展会seminar oadshow等活动 5、产品上市沟通&#…

IIC协议通信解析,内附完整代码。

一&#xff1a;硬件接口 1.1&#xff1a;功能引脚 1.2&#xff1a;IIC总线通信注意事项 二&#xff1a;通信协议 &#xff08;1&#xff09;空闲状态&#xff1a; &#xff08;2&#xff09;起始位&#xff1a; &#xff08;3&#xff09;有效数据位 &#xff08;4&#x…

最近跳槽,压力真大...

前几天&#xff0c;跟个老朋友吃饭&#xff0c;他最近想跳槽去大厂&#xff0c;觉得压力很大&#xff0c;问我能不能分享些所谓的经验套路。 每次有这类请求&#xff0c;都觉得有些有趣&#xff0c;不知道你发现没有大家身边真的有很多人不知道怎么面试&#xff0c;也不知道怎…

【玩转Docker小鲸鱼叭】MacOS系统配置Docker镜像加速器

当我们通过 docker pull拉取镜像时&#xff0c;如果不指定仓库&#xff0c;默认从 Docker Hub &#xff08;docker.io&#xff09;获取镜像&#xff0c;而国内用户访问Docker Hub仓库时&#xff0c;通常速度很忙&#xff0c;经常超时导致拉取镜像失败&#xff0c;所以通常要通过…

上海亚商投顾:沪指震荡调整 CPO概念股持续大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日震荡调整&#xff0c;保险等权重板块走低&#xff0c;上证50跌超1.5%&#xff0c;创业板指较为抗跌。CPO、…

【新固态格式化】

新固态格式化 初始化硬盘 从管理进入磁盘管理 Windows 7及其以后的系统建议使用GPT MBR 是 Master Boot Record 的缩写&#xff0c;是一种传统而常用的磁盘布局。GPT 是 Globally Unique Identifier Partition Table 的缩写&#xff0c;是一种与 UEFI 相关的新磁盘布局。其…

Day23 实战篇 ——Jmeter压力测试实战

Day23 实战篇 ——Jmeter压力测试实战 文章目录 Day23 实战篇 ——Jmeter压力测试实战一、分布式压测原理二、分布式环境配置Slaves机器配置Master机器配置参数化文件配置三、分布式压测执行Slave机器执行Master机器执行四、常见问题处理问题一问题二问题三问题四项目中使用Jme…

redis缓存设计-Redis(八)

上篇文章介绍了redis缓存设计&#xff0c;热点key&#xff0c;bigkey注意事项。 原创 redis缓存设计-Redis&#xff08;七&#xff09;https://blog.csdn.net/ke1ying/article/details/131268967 命令使用 hgetall&#xff0c;lrange&#xff0c;smembers&#xff0c;zrange…

【初识Linux】——01Linux系统

目录索引 Linux介绍&#xff1a;Linux历史&#xff1a;Linux系统应用&#xff1a;*服务器系统&#xff1a;**嵌入式系统&#xff1a;**桌面应用系统&#xff1a;**版本&#xff1a;* Linux系统的安装&#xff1a;虚拟机&#xff1a;安装VMware&#xff1a;安装centOS操作系统&a…

【AI实战】开源可商用的中英文大语言模型baichuan-7B,从零开始搭建

【AI实战】开源可商用的中英文大语言模型baichuan-7B&#xff0c;从零开始搭建 baichuan-7B 简介baichuan-7B 中文评测baichuan-7B 搭建参考 baichuan-7B 简介 baichuan-7B 是由百川智能开发的一个开源可商用的大规模预训练语言模型。基于 Transformer 结构&#xff0c;在大约…

解决安卓12限制32个线程

Android 12及以上用户在使用Termux时&#xff0c;有时会显示[Process completed (signal 9) - press Enter]&#xff0c;这是因为Android 12的PhantomProcesskiller限制了应用的子进程&#xff0c;最大允许应用有32个子进程。 这里以ColorOS 12.1为例&#xff08;其他系统操作略…

状态机编程实例-嵌套switch-case法

嵌入式软件开发中&#xff0c;状态机编程是一个比较实用的代码实现方式&#xff0c;特别适用于事件驱动的系统。 本篇&#xff0c;以一个炸弹拆除的小游戏为例&#xff0c;介绍状态机编程的思路。 C/C语言实现状态机编程的方式有很多&#xff0c;本篇先来介绍最简单最容易理解…

uni-app uni-file-picker文件上传实现拍摄从相册选择获取图片上传文档服务器

前言 最近在使用uni-app写H5移动端&#xff0c;有一个从手机拍摄从相册选择获取图片上传到文档服务器功能。 查阅uni-app发现关于上传图片&#xff0c;uni-file-picker文件上传&#xff0c;uni.chooseImage&#xff0c;uni.uni.uploadFile 它和pc端原理差不多&#xff0c;都是…

5年测试经验,测试老鸟总结功能测试——全测试点覆盖

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 功能测试主要包括…

使用vscode编写并运行typescript代码

1.安装vsCode Visual Studio Code - Code Editing. Redefined 2.安装nodejs 下载 | Node.js 中文网 3.打开vscode&#xff0c;在vscode里面打开终端&#xff08;快捷键是ctrl~) 查看是否成功安装node和npm&#xff1a; node -v npm -v 在终端中输入如下命令并…

ELK详细安装配置

1.安装jdk1.8&#xff08;略&#xff09; 2.安装配置本机防火墙&#xff08;略&#xff09; 3.ELK版本选择 参考&#xff1a;支持一览表 | Elastic 选择支持java8的版本 4.版本6安装 root依次用户执行 wget https://artifacts.elastic.co/downloads/elasticsearch/elast…

C++基础(1)——程序内存模型和引用

前言 本文主要介绍了C中内存模型的四区及存放的数据&#xff0c;引用的基本语法。 1.1&#xff1a;代码区&#xff08;程序运行前&#xff09; 1&#xff1a;存放CPU执行的机器指令 2&#xff1a;代码区是共享的&#xff0c;共享的目的是对于频繁被执行的程序&#xff0c;只…

在Centos Stream 9上Docker的实操教程(七) - Docker上实现MYSQL实现主从复制

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…