linux2.4和linux2.6模块参数的比较(两个版本驱动移植)
时间:2010-07-30 来源:guocai_yao
int skull_ival=0; |
int skull_array[4]; |
描述变量的字符串(也就是变量类型, 也就是模块参数)目前只支持五种类型:
- h:short
- i : int
- l : long
- s : string
如果是字符串值,则需要声明一个指针变量。
// 示例代码
#include <linux/module.h>
#include <linux/kernel.h>
static int onevalue = 1;
static char *twostring = NULL;
MODULE_PARM (onevalue, "i");
MODULE_PARM (twostring, "s");
int __init test_init(void)
{
printk ("Hello world!\n onevalue=%d, twostring=%s\n", onevalue, twostring);
return 0;
}
void __exit test_exit(void)
{
printk ("Goodbye world\n");
}
module_init(test_init);
module_exit(test_exit);
1.2 MODULE_PARM_DESC(变量名, 描述性信息)
这段描述存储在目标文件中,能够用类似 objdump 的工具查看,也可用自动的系统管理工具来显示。
例如:int base_port = 0x300;
MODULE_PARM (base_port, "i");
MODULE_PARM_DESC (base_port, "The base I/O port (default 0x300)");1.3 MODULE_AUTHOR(name)
将模块作者名加入目标文件1.4 MODULE_DESCRIPTION(desc)
在目标文件中增加模块描述文字1.5 MODULE_SUPPORTED_EDVICE(dev)
描述模块所支持的设备。内核中的注释指明这个参数可能最终用来帮助模块自动装载,然而目前还没有起到这种作用
2.linux-2.6内核
2.1 module_param (变量名, 变量类型, 使用属性)
2.6内核不再采用2.4内核中的字符串形式,而且在模块编译时会将此处申明的变量类型与变量定义的类型进行比较,判断是否一致。而且必须显式包含#include linux/moduleparam.h>变量类型可以是
- short: short
- ushort: unsigned short
- int: int
- unit: unsigned int
- long: long
- ulong:unsigned long
- charp: char*
- bool: int
- invbool: int
- intarray: int*
使用属性
除了特殊情况,通常把文件结点属性指定为 0。该参数用来设置用户的访问权限,普通用户能在内核上加载模块的几率很少。如果一定要设置结点,可用文件权限 (permission) 等概念指定 0644 等八进制数。2.2 module_param_array(变量名1, 变量类型, 指向变量2(指定前面变量1的个数)的指针(2.6.10可以直接用变量), 使用属性)
//示例代码
#include linux/module.h>
#include linux/init.h>
#include linux/moduleparam.h>
#include linux/stat.h>
#define SIZE 10
static int a[SIZE], n;
static int onevalue = 1;
static char *twostring = NULL;
module_param (onevalue, int, 0);
module_param (twostring, charp, 0);
module_param_array(a, int, &n, S_IRUGO);
static int __init test_init(void)
{
int i;
for (i = 0; i < n; ++i)
printk(KERN_ALERT "%d\n", a[i]);
printk ("Hello, world!\n onevalue=%d, twostring=%s\n", onevalue, twostring);
return 0;
}
static void __exit test_exit(void)
{
printk ("Goodbye, world\n");
return;
}
MODULE_LICENSE("GPL");
module_init(test_init);
module_exit(test_exit);2.3 其他
module_param_call(name, set, get, arg, perm)
module_param_named(name, value, type, perm)3.同时适用于2.4与2.6内核的模块参数模板
//适用于2.4与2.6内核的模块参数模板
#include linux/module.h>
#include linux/init.h>
#ifdef LINUX26
#include <linux/moduleparam.h>
#endif
#include linux/stat.h>
#define SIZE 10
static int a[SIZE];
static int onevalue = 1;
static char *twostring = NULL;
#ifdef LINUX26
static int n;
module_param (onevalue, int, 0);
module_param (twostring, charp, 0);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 10)
module_param_array(a, int, &n, S_IRUGO);
#else
module_param_array(a, int, &n, S_IRUGO);
#endif
#else
MODULE_PARM (onevalue, "i");
MODULE_PARM (twostring, "s");
#endif
4.参考资料
1) module_param_array()用法(作者:@sky);
2) 模块参数|内核变量(作者:beyes);
3) Linux2.6内核驱动移植参考(与低版本比较, 作者:jimigaga);
4) 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响(作者:周婷)。