写一个有参数的 Linux 内核模块
本文讲写一个简单的hello world 内核模块, 但是可以设置参数.
本系列:
源代码
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/moduleparam.h>
MODULE_LICENSE("GPL");
// 定义模块参数变量
static char* name = "John";
static int age = 30;
// 注册模块参数
module_param(name, charp, S_IRUGO);
MODULE_PARM_DESC(name, "Name parameter");
module_param(age, int, S_IRUGO);
MODULE_PARM_DESC(age, "Age parameter");
// 模块初始化函数
static int __init hello_init(void) {
printk(KERN_INFO "Hello, %s! Your age is %d.\n", name, age);
return 0;
}
// 模块退出函数
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye, %s!\n", name);
}
// 注册模块初始化和退出函数
module_init(hello_init);
module_exit(hello_exit);
Makefile
obj-m += hello.o
tag ?= `uname -r`
KDIR := /lib/modules/${tag}/build/
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
编译并执行
$ make all
$ sudo insmod hello.ko
$ tail -n 1 /var/log/syslog
Jul 11 01:27:56 supra kernel: [ 8683.334440] Hello, Eric! Your age is 35.
查看内核模块参数
$ cat /sys/module/hello/parameters/age
35
$ cat /sys/module/hello/parameters/name
Eric
改变内核模块参数
$ sudo echo 28 > /sys/module/hello/parameters/age
bash: /sys/module/hello/parameters/age: Permission denied
上面的权限问题, 是由于我们设置的参数权限导致的: S_IRUGO
, 可以改它为 0660
就可以了.