| 1.linux-2.4內核 1. 1 MODULE_PARM (變量名, 描述變量的字符串(也就是變量類(lèi)型) 如: | int skull_ival=0; char *skull_sval; MODULE_PARM (ival, "i"); MODULE_PARM (sval, "s"); | 又如:至少有兩個(gè)元素、至多不超過(guò)4 個(gè)元素的數組可定義為: | int skull_array[4]; MODULE_PARM (skull_array, "2-4i"); | 描述變量的字符串(也就是變量類(lèi)型, 也就是模塊參數)目前只支持五種類(lèi)型: b:byte h:short i : int l : long s : string 如果是字符串值,則需要聲明一個(gè)指針變量。
| // 示例代碼
#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(變量名, 描述性信息) 這段描述存儲在目標文件中,能夠用類(lèi)似 objdump 的工具查看,也可用自動(dòng)的系統管理工具來(lái)顯示。 例如: | 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) 描述模塊所支持的設備。內核中的注釋指明這個(gè)參數可能最終用來(lái)幫助模塊自動(dòng)裝載,然而目前還沒(méi)有起到這種作用 2.linux-2.6內核 2.1 module_param (變量名, 變量類(lèi)型, 使用屬性) 2.6內核不再采用2.4內核中的字符串形式,而且在模塊編譯時(shí)會(huì )將此處申明的變量類(lèi)型與變量定義的類(lèi)型進(jìn)行比較,判斷是否一致。而且必須顯式包含#include linux/moduleparam.h> 變量類(lèi)型可以是 - short: short
- ushort: unsigned short
- int: int
- unit: unsigned int
- long: long
- ulong:unsigned long
- charp: char*
- bool: int
- invbool: int
- intarray: int*
使用屬性 除了特殊情況,通常把文件結點(diǎn)屬性指定為 0。該參數用來(lái)設置用戶(hù)的訪(fǎng)問(wèn)權限,普通用戶(hù)能在內核上加載模塊的幾率很少。如果一定要設置結點(diǎn),可用文件權限 (permission) 等概念指定 0644 等八進(jìn)制數。 2.2 module_param_array(變量名1, 變量類(lèi)型, 指向變量2(指定前面變量1的個(gè)數)的指針(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.同時(shí)適用于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內核驅動(dòng)移植參考(與低版本比較, 作者:jimigaga); 4) 從 2.4 到 2.6:Linux 內核可裝載模塊機制的改變對設備驅動(dòng)的影響(作者:周婷)。 |