欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux驱动代码中MODULE_PARM_DESC的作用

程序员文章站 2024-03-21 08:24:04
...

结论

MODULE_PARM_DESC是用来描述驱动模块的参数信息的。

例如驱动内有这么一行代码:MODULE_PARM_DESC(stacfgpath, "Get path of sta cfg");

假设编译生成的驱动文件为 test.ko

我们使用: modinfo test.ko

#:modinfo test.ko
filename:    /home/test/test.ko
license:     GPL
srcversion:  
depends:
retpoline:   Y
name:        test
vermagic:    4.15.0-129-generic SMP mod_unload
parm:        stacfgpath:Get path of sta cfg (charp)

MODULE_PARM_DESC内描述的信息就会在parm这一行参数显示出来,这样用户就知道要加载这个驱动可以传入哪些参数了。


以下为查找该函数作用的过程

  • 问题

在跟踪Linux网络驱动的过程中看到了以下代码段:

static char *stacfgpath = NULL;
module_param(stacfgpath, charp, 0000);
MODULE_PARM_DESC(stacfgpath, "Get path of sta cfg");

 那MODULE_PARM_DESC()第二个参数是干嘛的呢?


  • 测试

在ubuntu的终端上编写以下测试代码:

编写test.c

#include <linux/module.h>
#include <linux/init.h>

static char *stacfgpath = NULL;
module_param(stacfgpath, charp, 0000);

static int __init test_init(void)
{
    printk("test_init\n");
    printk("stacfgpath is :%s\n", stacfgpath);
    return 0;
}

static void __exit test_exit(void)
{
    printk("test_exit\n");
}

module_init(test_init);
module_init(test_exit);
MODULE_LICENSE("GPL");

 

编写Makefile

编写该文件前需要先确认当前ubuntu系统编译链的位置,然后填入KDIR。

可以查看一下/lib/modules/这个目录,我的是在 /lib/modules/4.15.0-129-generic/build/

obj-m := test.o
KDIR := /lib/modules/4.15.0-129-generic/build/

all:
    make -C $(KDIR) M=$(PWD) modules
clean:
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order

 然后在shell终端输入: make

 可见生成的test.ko

 安装驱动:

#:sudo insmod test.ko stacfgpath="hello"

 卸载驱动:

#:sudo rmmod test.ko

我们发现终端没有打印任何消息出来。

这时需要查看内核打印,使用dmesg。

以下为打印的内容:

test_init

stacfgpath is :hello

test_exit

 可见stacfgpath参数被改变hello了。

 

 如果安装驱动时不传参数。

以下为打印的内容:

test_init

stacfgpath is :(null)

test_exit

那 MODULE_PARM_DESC(stacfgpath, "Get path of sta cfg"); 第二个参数的字符串是干嘛的呢,没看到"Get path of sta cfg"这个字符串出现啊。

man insmod

查看了一下,发现

SEE ALSO

modprobe(), rmmod(), lsmod(), modinfo()

在man modinfo

发现可以查看驱动模块的参数信息

 NAME

modinfo - show information about a Linux Kernel module

 于是尝试了一下:

 #:modinfo test.ko

 我们发现MODULE_PARM_DESC内描述的信息在parm这一行参数显示了出来。

那为什么要对模块的参数加入描述信息呢?

是为了让用户知道要加载这个驱动可以传入哪些参数,其中包括参数类型,名称等。