我是靠谱客的博主 愤怒飞鸟,最近开发中收集的这篇文章主要介绍怎样使用module_param()来手动传递变量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

对于如何向模块传递参数,Linux kernel 提供了一个简单的框架。其允许驱动程序声明参数,并且用户在系统启动或模块装载时为参数指定相应值,在驱动程序里,参数的用法如同全局变量。

使用下面的宏时需要包含头文件<linux/moduleparam.h>


module_param() 和 module_param_array() 的作用就是让那些全局变量对 insmod 可见,使模块装载时可重新赋值。

module_param_array() 宏的第三个参数用来记录用户 insmod 时提供的给这个数组的元素个数,NULL 表示不关心用户提供的个数

module_param() 和 module_param_array() 最后一个参数权限值不能包含让普通用户也有写权限,否则编译报错。这点可参考 linux/moduleparam.h 中 __module_param_call() 宏的定义。

字符串数组中的字符串似乎不能包含逗号,否则一个字符串会被解析成两个

 

一个测试用例:parm_hello.c

 

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>


#define MAX_ARRAY 6

static int int_var = 0;
static const char *str_var = "default";
static int int_array[6];
int narr;

module_param(int_var, int, 0644);
MODULE_PARM_DESC(int_var, "A integer variable");


module_param(str_var, charp, 0644);
MODULE_PARM_DESC(str_var, "A string variable");

module_param_array(int_array, int, &narr, 0644);
MODULE_PARM_DESC(int_array, "A integer array");
 

static int __init hello_init(void)
{
       int i;
       printk(KERN_ALERT "Hello, my LKM.n");
       printk(KERN_ALERT "int_var %d.n", int_var);
       printk(KERN_ALERT "str_var %s.n", str_var);

       for(= 0; i < narr; i ++){
               printk("int_array[%d] = %dn", i, int_array[i]);
       }
       return 0;
}

static void __exit hello_exit(void)
{
       printk(KERN_ALERT "Bye, my LKM.n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ydzhang");
MODULE_DEION("This module is a example.");

 

测试:insmod parm_hello.ko int_var=100 str_var=hello int_array=100,200

最后

以上就是愤怒飞鸟为你收集整理的怎样使用module_param()来手动传递变量的全部内容,希望文章能够帮你解决怎样使用module_param()来手动传递变量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部