驱动模块传参实验

驱动模块传参实验全解析

提示:
1)学会驱动模块传参,搞清楚基本传参知识,基本内容充电
2) 打打基础吧,上学那会不也是一个实验一个实验学习过来的嘛? 现在只是没有经历和时间罢了!


需求-场景

驱动模块传参 实验

目标

掌握驱动传参实验,基础知识充电

困难点

驱动模块传参就固定的3个方法,但是不会用,为什么那样也不懂,基础不扎实,总是忘。 所以整理一下,熟悉了解,知所以然。

API 掌握

传参方法 使用场景
module_param(name, type, perm) 基本类型
module_param_array(name, type, nump, perm) 数组
module_param_string(name, string, len, perm) 字符串

module_param

  • name: 模块参数的名称
  • type: 模块参数的数据类型
  • perm: 模块参数的访问权限

参数 type 可以取以下任意一种情况:

基本类型 类型说明
bool 布尔型
inbool 布尔反值
charp 字符指针(相当于 char *,不超过 1024 字节的字符串)
short 短整型
ushort 无符号短整型
int 整型
uint 无符号整型
long 长整型
ulong 无符号长整型

知识点

基础充电-应用程序main函数传参

受限补充基础知识,我们在学习C语言时候入门第一个 main 函数

int main(int argc,char *argv[ ]

这个argc argv[] 到底是什么东西, 这个理解了才能更加方便我们理解传参实验

我们在学习的时候,很多时候就是在main 方法里面写各种逻辑和调用,没有用到参数argc 和 *argv 参数,实际当中 他就是一个man 函数入口,在编译之后 在命令行中就是用来传递参数用的。

参数的作用

  • argc(argument count)

示命令行参数的数量(包括程序名本身),类型是整数(int)。
例如:运行 ./a.out hello 123,argc 的值是 3(程序名 + 2个参数)。

  • argv(argument vector):
    是一个字符串数组(char*[]),存储所有命令行参数的具体内容。

argv[0]:程序名(如 “./a.out”)。

argv[1] 到 argv[argc-1]:用户输入的参数。

argv[argc]:固定为 NULL(表示数组结尾)

实验

如下 一个最基础的.c 源码文件 paramtest_001.c

#include <stdio.h>

int main(int argc, char const *argv[]) {
   
   
    // 打印程序名称和参数数量
    printf("程序名称: %s\n", argv[0]);
    printf("参数个数: %d\n", argc - 1);
    
    // 检查是否有参数传入
    if (argc < 2) {
   
   
        printf("使用方法: %s [参数1] [参数2] ...\n", argv[0]);
        printf("示例: %s hello world 123\n", argv[0]);
        return 1; // 返回非零表示错误
    }
    
    // 打印所有传入的参数
    printf("传入的参数:\n");
    for (int i = 1; i < argc; i++) {
   
   
        printf("%d: %s\n", i, argv[i]);
    }
    
    return 0; // 返回0表示成功
}

对它进行编译

gcc paramtest_001.c -o test.out

那么就生成了 parameters.out 执行文件,我们什么也不带参数,

直接执行 可执行文件 ./test.out 结果如下。

在这里插入图片描述

我们带带参数 测试实验:

  ./test.out Android 123 

在这里插入图片描述

小结

我们上面的实验,是为了补充基础,main 函数的带参数相关的参数说明,在C语言体系下的main 函数的一些基本知识。 那么在Linux 驱动层面,驱动其实也就是一个程序,系统提供了传参方法,如上三种方法。传参形式其实和main 基本一致的,这也是为什么需要 借助main 函数,稍微理解一下传参,方便理解。

基础

具体实验

驱动传参 基本数据类型传递 module_param

测试代码
#include <linux/init.h>
#include <linux/module.h>

static int debug_level = 1;
static char *device_name = "mydevice";
static int max_count = 10;
static bool enable_feature = true;

module_param(debug_level, int, 0644);
module_param(device_name, charp, 0644);

module_param(max_count, int, 0644);
module_param(enable_feature, bool, 0644);

MODULE_PARM_DESC(debug_level, "Debug level (0-3)");
MODULE_PARM_DESC(device_name, "Device name string");
MODULE_PARM_DESC(max_count, "Maximum device count");
MODULE_PARM_DESC(enable_feature, "Enable special feature");

static int __init mymodule_init(void)
{
   
   
    printk(KERN_INFO "Module loaded with params:\n");
    printk(KERN_INFO "  debug_level=%d\n", debug_level);
    printk(KERN_INFO "  device_name=%s\n", device_name)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值