提示:
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)
驱动模块传参实验全解析

最低0.47元/天 解锁文章
498

被折叠的 条评论
为什么被折叠?



