Linux内核模块参数

一、在用户态编写程序时,我们都应该知道,是可以给程序传递参数的,那么同样在内核模块中也可以有同样的需求,下面的例子展示如何给内核模块传递参数。

二、编写源文件helloworld.c

#include <linux/init.h> //所有模块都必须包含的头文件 
#include <linux/module.h> //一些宏定义,例如这里的KERN_INFO
#include <linux/init.h>
#include <linux/moduleparam.h>

#define DRIVER_AUTHOR "[email protected]"
#define DRIVER_DESC   "A sample driver"  

static int myint = 55;// default value

//需要使用module_param来对参数进行说明,指明这个参数的类型,权限等
module_param(myint,int,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
MODULE_PARM_DESC(myint,"A integer");

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world!\n");//前面的宏表示打印的级别  
    printk(KERN_INFO "myint is an integer: %d\n", myint);


    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "hello exit!\n");
}

module_init(hello_init);//用宏来指定入口,加载模块时里面的加载函数会被调用  
module_exit(hello_exit);

//模块的许可证 
MODULE_LICENSE("GPL");
//模块的作者
MODULE_AUTHOR(DRIVER_AUTHOR);
//模块的描述
MODULE_DESCRIPTION(DRIVER_DESC);

/*
载入模块的时候,如果不指定参数就是上面的默认值,如果要指定参数的话
可以像下面这样来指定参数。
insmod helloworld.ko  myint=100

*/

三、编写Makefile

ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all:                               
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules   
clean:                                             
        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

else
    obj-m := helloworld.o

endif

四、编译内核模块生成helloworld.ko

make all 或make

五、安装内核模块

1、如果不指定参数,为默认值。sudo insmod helloworld.ko

dmesg查看输出信息

 myint is an integer: 55

2、如果指定参数,insmod helloworld.ko  myint=100

dmesg查看输出信息

 myint is an integer: 100

六、查看模块详细信息

modinfo helloworld.ko
filename:       /home/xz/kernel/helloworld_4/helloworld.ko
description:    A sample driver
author:         [email protected]
license:        GPL
srcversion:     B811A968754929D3AAAAFB4
depends:        
vermagic:       4.4.0-119-generic SMP mod_unload modversions retpoline 

parm:           myint:A integer (int)

七、卸载已安装的内核模块

sudo rmmod helloworld

完毕。

猜你喜欢

转载自blog.csdn.net/xiezhi123456/article/details/80030171