Linux 模块中的模块参数数组未显示在 sysfs 中

Module parameter array in Linux module not showing up in sysfs

我正在模块中为 Linux 编写字符设备驱动程序。

我需要使用模块参数数组来显示有关打开设备的一些状态信息,但这无法正常工作。我还使用了一个 int 参数(不是数组),它们是这样初始化的:

static int open_permissions[3] = {1,2,3}; 
static int count;
module_param_array(open_permissions, int, &count, 0660);


static int allow_live_bait = 1;             /* default to on */
module_param(allow_live_bait, int, 0660);  /* a int type */

现在这些参数已按原样列在 VFS /sys/module/mymodule/parameters 中。如果我用文本编辑器打开 allow_live_bait 参数,它会正确显示数字 1,但如果我打开 open_permissions 参数(始终使用文本编辑器),它不会显示任何内容.

此外,这不是初始化不正确的问题,因为我尝试像这样在 init_module 函数中打印数组的值,并且它们已正确初始化:

   for(j = 0;j<3;j++){
      printk("%s : open permission %d : %d",MODNAME,j,open_permissions[j]);
   }

我想知道这是使用数组参数时的正常行为还是我做错了什么。

这是因为 module_param_array() 允许关于第三个参数的两个选项之一(nump 即提供的值的计数):

  1. 如果您想要固定大小的参数数组,请传递NULL。这样无论用户在插入模块时(或者通过sysfs修改参数)传入什么,sysfs下的参数都会一直上报数组的所有值。用户可以覆盖从零到所有的值。如果用户不传递参数,默认值将保持不变,您将看到 sysfs 报告 1,2,3。您可以将此视为始终考虑整个参数数组“有意义”的模块。

  2. 传递指向“动态”大小参数数组的整数的指针。当然,底层数组的大小仍然是静态的,但语义不同。现在期望用户最多传递 N(数组大小)个参数,并且在模块插入(或通过 sysfs 修改)时传递的参数数量反映在传递给 module_param_array() 的计数指针上。该模块应该只认为从 0count 的索引有意义,如果用户根本不传递参数,则计数默认为 0

在我看来,您在选项 #2 之后对模块参数进行了编码,然后在不传递参数的情况下插入了模块,这意味着 count=0。您可能想做的是改用选项 #1。