模块传参
module_param(name, type, perm);
功能:将指定的全局变量设置成模块参数
用法:首先,在内核模块代码中声明 全局变量 name 作为传参对象。然后,使用该函数告知内核。最后,安装内核时,在模块后为全局变量赋值。
#include <linux/module.h>
#include <linux/kernel.h>
static char* str = "Hello, World!!";
module_param(str, charp, S_IRUSR);
int __init mychar_param_init(void) {
printk("The string is %s\n", str);
return 0;
}
void __exit mychar_param_exit(void) {
printk("exit mychar param\n");
}
MODULE_LICENSE("GPL");
module_init(mychar_param_init);
module_exit(mychar_param_exit);
注意:在使用 module_param 时,如果操作权限过高会导致编译报错。[ link ]
同理,可以使用 module_param_array 传递数组。
模块依赖
使用导出符号的地方,需要对这些符号进行 extern 声明后才能使用这些符号。
/home/ubuntu/Code/drivers/char/mychar_param.c:4:1: error: multiple storage classes in declaration specifiers
extern static char* str = "Hello, World!!";
^~~~~~
/home/ubuntu/Code/drivers/char/mychar_param.c:4:21: warning: 'str' initialized and declared 'extern'
extern static char* str = "Hello, World!!";
原因{2}:static 和 extern 都是存储类型,不可以同时使用。
编译时,在引用依赖的地方报出如下错误:
/home/ubuntu/Code/drivers/char/mychar_dep.c:5:45: error: 'str' undeclared (first use in this function)
printk("The dependence string is %s\n", str);
^~~
使用函数依赖{3}不会产生如上问题。后来发现,extern 声明应该放在引用外部变量的地方。
参考: