概述
内核模块传参
在应用程序开发的时候,我们都知道main函数可以传递参数,main函数的两个参数,argc表示命令行参数的个数,argv是一个数组,存放命令行参数,且下标从0开始。从内核模块的模板可以看到,入口函数和出口函数参数类型都是void类型,表示两者都是不接收参数的。内核模块的入口出口函数不接收参数,不代表驱动模块不接收参数,需要用其它方法和函数。
一. 内核模块传参相关函数和宏定义
1.1 module_param
-
module_param(name, type, perm)
name:模块参数,或者(以KBUILD MODNAME和‘.’作为前缀)内核命令行参数。注意-被改为_,所以用户可以使用"foo-bar=1",即使是变量"foo_bar"。 type:变量类型,支持:byte、hexint、short、ushort、int、uint、long、ulong(这些都是整数类型),charp(一个字符类型的指针,可以用来表示字符串变量),bool(只有两个值,非真即假,非1即0) perm:变量在系统中的权限,八进制表示,不能有可执行权限
1.2 MODULE_PARM_DESC
-
MODULE_PARM_DESC(_parm, desc)
MODULE_PARM_DESC(变量名, “变量的描述”)
二. 写一个带参数的驱动模块代码
-
demo.c
#include <linux/init.h> #include <linux/module.h> int i_param = 125; module_param(i_param, int, 0664); MODULE_PARM_DESC(i_param, "this is i_param range[0-255]"); char c_param = 'a'; module_param(c_param, byte, 0664); MODULE_PARM_DESC(c_param, "this is char var"); char* s = "hello driver"; module_param(s, charp, 0664); MODULE_PARM_DESC(s, "this is char point var"); static int __init demo_init(void) { printk("%s:%s:%dn", __FILE__, __func__, __LINE__); printk("c_param = %cn", c_param); printk("i_param = %dn", i_param); printk("p = %sn ", s); return 0; } static void __exit demo_exit(void) { printk("%s:%s:%dn", __FILE__, __func__, __LINE__); printk("c_param = %cn", c_param); printk("i_param = %dn", i_param); } module_init(demo_init); module_exit(demo_exit); MODULE_LICENSE("GPL");
-
Makefile
KERNELDIR:=/lib/modules/$(shell uname -r)/build/ PWD:=$(shell pwd) all: make -C $(KERNELDIR) M=$(PWD) modules clean: make -C $(KERNELDIR) M=$(PWD) clean obj-m:=demo.o
三. 两种传递参数的方式
3.1 命令行传递参数
$ sudo dmesg -C #清理之前的内核打印信息
$ sudo insmod demo.ko i_param=11 c_param=65 s=hello_andrea #重新加载demo.ko 并为参数传递值
$ sudo dmesg #查看内核打印信息
[ 1928.124676] /home/stu/study/driver/2-param/demo.c:demo_init:20
[ 1928.124677] c_param = A
[ 1928.124677] i_param = 11
$ sudo rmmod demo #卸载demo模块
$ sudo dmesg #查看内核打印信息
[ 1928.124676] /home/stu/study/driver/2-param/demo.c:demo_init:20
[ 1928.124677] c_param = A
[ 1928.124677] i_param = 11
[ 1928.124677] p = hello_andrea
[ 1946.794659] /home/stu/study/driver/2-param/demo.c:demo_exit:30
[ 1946.794660] c_param = A
[ 1946.794660] i_param = 11
3.2 属性文件传递参数
-
加载ko文件
$ sudo insmod demo.ko [sudo] stu 的密码: stu@hqyj:~/study/driver/2-param$ ls demo.c demo.ko demo.mod demo.mod.c demo.mod.o demo.o Makefile modules.order Module.symvers
-
查看属性文件
stu@hqyj:/sys/module/模块名/parameters$ ls c_param i_param s stu@hqyj:/sys/module/demo/parameters$ cat c_param 97 stu@hqyj:/sys/module/demo/parameters$ cat i_param 125 stu@hqyj:/sys/module/demo/parameters$ cat s hello driver stu@hqyj:/sys/module/demo/parameters$ ls c_param i_param s
找到属性文件:
ls /sys/module/模块名/parameters
最后
以上就是无辜镜子为你收集整理的内核模块传参内核模块传参的全部内容,希望文章能够帮你解决内核模块传参内核模块传参所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复