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