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
即提供的值的计数):
如果您想要固定大小的参数数组,请传递NULL
。这样无论用户在插入模块时(或者通过sysfs修改参数)传入什么,sysfs下的参数都会一直上报数组的所有值。用户可以覆盖从零到所有的值。如果用户不传递参数,默认值将保持不变,您将看到 sysfs 报告 1,2,3
。您可以将此视为始终考虑整个参数数组“有意义”的模块。
传递指向“动态”大小参数数组的整数的指针。当然,底层数组的大小仍然是静态的,但语义不同。现在期望用户最多传递 N(数组大小)个参数,并且在模块插入(或通过 sysfs 修改)时传递的参数数量反映在传递给 module_param_array()
的计数指针上。该模块应该只认为从 0
到 count
的索引有意义,如果用户根本不传递参数,则计数默认为 0
。
在我看来,您在选项 #2 之后对模块参数进行了编码,然后在不传递参数的情况下插入了模块,这意味着 count=0
。您可能想做的是改用选项 #1。
我正在模块中为 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
即提供的值的计数):
如果您想要固定大小的参数数组,请传递
NULL
。这样无论用户在插入模块时(或者通过sysfs修改参数)传入什么,sysfs下的参数都会一直上报数组的所有值。用户可以覆盖从零到所有的值。如果用户不传递参数,默认值将保持不变,您将看到 sysfs 报告1,2,3
。您可以将此视为始终考虑整个参数数组“有意义”的模块。传递指向“动态”大小参数数组的整数的指针。当然,底层数组的大小仍然是静态的,但语义不同。现在期望用户最多传递 N(数组大小)个参数,并且在模块插入(或通过 sysfs 修改)时传递的参数数量反映在传递给
module_param_array()
的计数指针上。该模块应该只认为从0
到count
的索引有意义,如果用户根本不传递参数,则计数默认为0
。
在我看来,您在选项 #2 之后对模块参数进行了编码,然后在不传递参数的情况下插入了模块,这意味着 count=0
。您可能想做的是改用选项 #1。