一、在用户态编写程序时,我们都应该知道,是可以给程序传递参数的,那么同样在内核模块中也可以有同样的需求,下面的例子展示如何给内核模块传递参数。
二、编写源文件helloworld.c
#include <linux/init.h> //所有模块都必须包含的头文件
#include <linux/module.h> //一些宏定义,例如这里的KERN_INFO
#include <linux/moduleparam.h>
#define DRIVER_AUTHOR "xz@vi-chip.com.cn"
#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: xz@vi-chip.com.cn
license: GPL
srcversion: B811A968754929D3AAAAFB4
depends:
vermagic: 4.4.0-119-generic SMP mod_unload modversions retpoline
parm: myint:A integer (int)
七、卸载已安装的内核模块
sudo rmmod helloworld
完毕。