0

我正在一个模块中为 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 */

/sys/module/mymodule/parameters现在,这些参数按应有的方式列在 VFS中。如果我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]);
   }

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

4

1 回答 1

0

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

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

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

在我看来,您在选项 #2 之后编写了模块参数,然后在不传递参数的情况下插入了模块,这意味着count=0. 您可能想要做的只是选择选项#1。

于 2022-02-08T03:28:02.923 回答