内核模块module传参

linux 2.6允许用户insmod的时候往内核模块里面传递参数,它主要使用module_param宏定义来实现这一功能。

参数应用

module_param(name, type, perm);
module_param(参数名,参数类型,参数读写权限)

举例:

static int howmany=1;
module_param(howmany, int, 0);

在装载内核模块时,用户可以向模块传递参数,形式为:

insmod/modprobe 模块名 参数名=参数值

如果不传递,参数将使用模块内定义的缺省值。如果模块被内置,就无法insmod了,但bootloader可以通过在bootargs里设置

模块名.参数名=值

给该内置的模块传递参数。

参数类型

参数的类型可以是byte,short,ushort, int, uint, long, ulong, charp, bool或invbool(布尔的反)

除此之外,内核模块还支持参数数组:

module_param_array(数组名,数组类型,数组长,参数读写权限)

insmod时使用逗号分割数组元素。

参数目录

模块被加载后,在/sys/module/目录下将出现以此模块命名的目录。

当读写权限为0时,表示此参数不存在sysfs文件系统下对应的文件节点,如果此模块存在参数读写权限不为0的命令行参数,在此模块的目录下还将出现parameters目录,

其中包含一系列以参数名命名的文件节点,这些文件的权限值就是传入module_param()的参数的读写权限,而文件的内容为参数的值。

示例

// led.c
//********************************
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/io.h>

MODULE_LISENCE("GPL");
MODULE_AUTHOR("limingth");
MODULE_DESCRIPTION("led module driver");
MODULE_VERSION("version1.0");
MODULE_ALIAS("myled test");

static int *vmem;
static int led_no = 0;
module_param(led_no, int, 0);

static __init int led_init(void)
{
    printk("led init ok!
");
    vmem = ioremap(0xe0200284, 4);
    printk("vmem = %p
");
    *vmem &=  ~(1<<led_no);
    return 0;
}

static __exit led_exit(void)
{
    printk("led exit ok!
");
    *vmem = 0xf;
    
    return ;
}

module_init(led_init);
module_exit(led_exit);
//*************************************
应用:
insmod led.ko led_no=1
rmmod led

注:在操作系统下,所有的地址均为虚拟地址,所以物理地址需要通过ioremap或mmap函数将物理地址转换为虚拟地址后,再对地址操作。

原文地址:https://www.cnblogs.com/embedded-linux/p/8196406.html