我是靠谱客的博主 无辜镜子,这篇文章主要介绍内核模块传参内核模块传参,现在分享给大家,希望可以做个参考。

内核模块传参

​ 在应用程序开发的时候,我们都知道main函数可以传递参数,main函数的两个参数,argc表示命令行参数的个数,argv是一个数组,存放命令行参数,且下标从0开始。从内核模块的模板可以看到,入口函数和出口函数参数类型都是void类型,表示两者都是不接收参数的。内核模块的入口出口函数不接收参数,不代表驱动模块不接收参数,需要用其它方法和函数。

一. 内核模块传参相关函数和宏定义

1.1 module_param

  1. module_param(name, type, perm)

    复制代码
    1
    2
    3
    4
    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

  1. MODULE_PARM_DESC(_parm, desc)

    复制代码
    1
    2
    MODULE_PARM_DESC(变量名, “变量的描述”)

    请添加图片描述
    请添加图片描述

二. 写一个带参数的驱动模块代码

  1. demo.c

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #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");
  2. Makefile

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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 命令行传递参数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ 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 属性文件传递参数

  1. 加载ko文件

    复制代码
    1
    2
    3
    4
    5
    6
    $ 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
  2. 查看属性文件

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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

    找到属性文件:

    复制代码
    1
    2
    ls /sys/module/模块名/parameters

    请添加图片描述
    请添加图片描述

最后

以上就是无辜镜子最近收集整理的关于内核模块传参内核模块传参的全部内容,更多相关内核模块传参内核模块传参内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(96)

评论列表共有 0 条评论

立即
投稿
返回
顶部