我是靠谱客的博主 无辜镜子,最近开发中收集的这篇文章主要介绍内核模块传参内核模块传参,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

内核模块传参

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

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

1.1 module_param

  1. 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

  1. MODULE_PARM_DESC(_parm, desc)

    MODULE_PARM_DESC(变量名, “变量的描述”)
    

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

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

  1. 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");
    
    
  2. 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 属性文件传递参数

  1. 加载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
    
    
  2. 查看属性文件

    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
    

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

最后

以上就是无辜镜子为你收集整理的内核模块传参内核模块传参的全部内容,希望文章能够帮你解决内核模块传参内核模块传参所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部