一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

module_param、 MODULE_PARM_DESC 、EXPORT_SYMBOL .

 wanwanstudy 2012-03-08

在用戶態(tài)下編程可以通過(guò)main()的來(lái)傳遞命令行參數(shù),而編寫(xiě)一個(gè)內(nèi)核模塊則通過(guò)module_param ()
module_param宏是Linux 2.6內(nèi)核中新增的,該宏被定義在include/linux/moduleparam.h文件中,具體定義如下:
#define module_param(name, type, perm)
module_param_named(name, name, type, perm)

其中使用了 3 個(gè)參數(shù):要傳遞的參數(shù)變量名, 變量的數(shù)據(jù)類(lèi)型, 以及訪問(wèn)參數(shù)的權(quán)限。
module_param (name,type,perm);
module_param 使用了 3 個(gè)參數(shù): 變量名, 它的類(lèi)型, 以及一個(gè)權(quán)限掩碼用來(lái)做一個(gè)輔助的 sysfs 入口(啥意思). 這個(gè)宏定義應(yīng)當(dāng)放在任何函數(shù)之外, 典型地是出現(xiàn)在源文件的前面.定義如:
static char *whom = "world";
static int howmany = 1;
module_param (howmany, int, S_IRUGO);
module_param (whom, charp, S_IRUGO);
模塊參數(shù)支持許多類(lèi)型:
bool
invbool
一個(gè)布爾型( true 或者 false)值(相關(guān)的變量應(yīng)當(dāng)是 int 類(lèi)型). invbool 類(lèi)型顛倒了值, 所以真值變成 false, 反之亦然.
charp
一個(gè)字符指針值. 內(nèi)存為用戶提供的字串分配, 指針因此設(shè)置.
int
long
short
uint
ulong
ushort
基本的變長(zhǎng)整型值. 以 u 開(kāi)頭的是無(wú)符號(hào)值.

數(shù)組參數(shù), 用逗號(hào)間隔的列表提供的值, 模塊加載者也支持. 聲明一個(gè)數(shù)組參數(shù), 使用:

module_param _array(name,type,num,perm);
這里 name 是你的數(shù)組的名子(也是參數(shù)名),
type 是數(shù)組元素的類(lèi)型,
num 是一個(gè)整型變量,
perm 是通常的權(quán)限值.
如果數(shù)組參數(shù)在加載時(shí)設(shè)置, num 被設(shè)置成提供的數(shù)的個(gè)數(shù). 模塊加載者拒絕比數(shù)組能放下的多的值.

perm參數(shù)的作用是什么?
最后的 module_param 字段是一個(gè)權(quán)限值; 你應(yīng)當(dāng)使用 中定義的值. 這個(gè)值控制誰(shuí)可以存取這些模塊參數(shù)在 sysfs 中的表示.如果 perm 被設(shè)為 0, 就根本沒(méi)有 sysfs 項(xiàng). 否則, 它出現(xiàn)在 /sys/module下面, 帶有給定的權(quán)限. 使用 S_IRUGO 作為參數(shù)可以被所有人讀取, 但是不能改變; S_IRUGO|S_IWUSR 允許 root 來(lái)改變參數(shù). 注意, 如果一個(gè)參數(shù)被 sysfs 修改, 你的模塊看到的參數(shù)值也改變了, 但是你的模塊沒(méi)有任何其他的通知. 你應(yīng)當(dāng)不要使模塊參數(shù)可寫(xiě), 除非你準(zhǔn)備好檢測(cè)這個(gè)改變并且因而作出反應(yīng).
perm參數(shù)的作用是什么?
最后的 module_param 字段是一個(gè)權(quán)限值,表示此參數(shù)在sysfs文件系統(tǒng)中所對(duì)應(yīng)的文件節(jié)點(diǎn)的屬性。你應(yīng)當(dāng)使用 中定義的值. 這個(gè)值控制誰(shuí)可以存取這些模塊參數(shù)在 sysfs 中的表示.當(dāng)perm為0時(shí),表示此參數(shù)不存在 sysfs文件系統(tǒng)下對(duì)應(yīng)的文件節(jié)點(diǎn)。 否則, 模塊被加載后,在/sys/module/ 目錄下將出現(xiàn)以此模塊名命名的目錄, 帶有給定的權(quán)限.。
權(quán)限在include/linux/stat.h中有定義
比如:
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001
使用 S_IRUGO 作為參數(shù)可以被所有人讀取, 但是不能改變; S_IRUGO|S_IWUSR 允許 root 來(lái)改變參數(shù). 注意, 如果一個(gè)參數(shù)被 sysfs 修改, 你的模塊看到的參數(shù)值也改變了, 但是你的模塊沒(méi)有任何其他的通知. 你應(yīng)當(dāng)不要使模塊參數(shù)可寫(xiě), 除非你準(zhǔn)備好檢測(cè)這個(gè)改變并且因而作出反應(yīng).

通過(guò)宏MODULE_PARM_DESC()對(duì)參數(shù)進(jìn)行說(shuō)明:
static unsigned short size = 1;
module_param(size, ushort, 0644);
MODULE_PARM_DESC(size, “The size in inches of the fishing pole”
“connected to this computer.” );

 

 

 

module_param() module_param_array() 的作用就是讓那些全局變量對(duì)insmod 可見(jiàn),使模塊裝載時(shí)可重新賦值。

module_param_array() 宏的第三個(gè)參數(shù)用來(lái)記錄用戶insmod 時(shí)提供的給這個(gè)數(shù)組的元素個(gè)數(shù),NULL 表示不關(guān)心用戶提供的個(gè)數(shù)

module_param() module_param_array() 最后一個(gè)參數(shù)權(quán)限值不能包含讓普通用戶也有寫(xiě)權(quán)限,否則編譯報(bào)錯(cuò)。這點(diǎn)可參考linux/moduleparam.h __module_param_call() 宏的定義。

字符串?dāng)?shù)組中的字符串似乎不能包含逗號(hào),否則一個(gè)字符串會(huì)被解析成兩個(gè) 

 

一個(gè)測(cè)試用例:parm_hello.c

 

#include<linux/module.h>
#include<linux/moduleparam.h>
#include<linux/kernel.h>


#defineMAX_ARRAY 6

staticintint_var=0;
staticconstchar*str_var="default";
static int int_array[6];
intnarr;

module_param(int_var,int,0644);
MODULE_PARM_DESC(int_var,"A integer variable");


module_param(str_var,charp,0644);
MODULE_PARM_DESC(str_var,"A string variable");

module_param_array(int_array,int,&narr,0644);
MODULE_PARM_DESC(int_array,"A integer array");
 

staticint__init hello_init(void)
{
       inti;
       printk(KERN_ALERT"Hello, world./n");
       printk(KERN_ALERT"int_var %d./n",int_var);
       printk(KERN_ALERT"str_var %s./n",str_var);

       for(i=0;i<narr;i++){
               printk("int_array[%d] = %d/n",i,int_array[i]);
       }
       return0;
}

staticvoid__exit hello_exit(void)
{
       printk(KERN_ALERT"Bye, world./n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("kelly");
MODULE_DEION("This module is a example.");

Linux中EXPORT_SYMBOL的用法


EXPORT_SYMBOL標(biāo)簽內(nèi)定義的函數(shù)對(duì)全部?jī)?nèi)核代碼公開(kāi),不用修改內(nèi)核代碼就可以在您的內(nèi)核模塊中直接調(diào)用。您還可以手工修改內(nèi)核源代碼來(lái)導(dǎo)出另外的函數(shù),用于重新編譯并加載新內(nèi)核后的測(cè)試。


Linux symbol export method:

[1] If we want export the symbol in a module, just use the EXPORT_SYMBOL(xxxx) in the C or H file.
    And compile the module by adding the compile flag -DEXPORT_SYMTAB.
    Then we can use the xxxx in the other module.


[2] If we want export some symbol in Kernel that is not in a module such as xxxx in the /arch/ppc/fec.c.
    Firstly, define the xxxx
in the fec.c;
    Secondly, make a new file which contain the "extern" define the
xxxx(for example, extern int xxxx
);
    Lastly, in the ppc_ksyms.c we includes the new file, and add the EXPORT_SYMBOL(
xxxx
).
    Then we can use the
xxxx

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    久久人人爽人人爽大片av| 神马午夜福利免费视频| 深夜日本福利在线观看| 超碰在线免费公开中国黄片| 91亚洲精品综合久久| 99免费人成看国产片| 国产毛片不卡视频在线| 亚洲中文字幕视频一区二区| 91精品国自产拍老熟女露脸| 嫩呦国产一区二区三区av| 免费特黄一级一区二区三区| av国产熟妇露脸在线观看| 99久久婷婷国产亚洲综合精品 | 一区二区免费视频中文乱码国产| 日韩av亚洲一区二区三区| 国产精品亚洲精品亚洲| 国产欧美另类激情久久久| 精品综合欧美一区二区三区 | 久久精品国产99精品最新| 国产一区二区三区丝袜不卡| 亚洲日本久久国产精品久久| 老司机精品视频在线免费| 久久三级国外久久久三级| 亚洲免费视频中文字幕在线观看 | 日韩欧美中文字幕av| 91精品国自产拍老熟女露脸| 91亚洲国产成人久久| 色播五月激情五月婷婷| 日本99精品在线观看| 日韩精品成区中文字幕| 91人妻人人揉人人澡人| 亚洲中文字幕在线观看黑人| 亚洲一区二区精品国产av| 久久精品国产熟女精品| 国产精品福利一级久久| 亚洲精品有码中文字幕在线观看| 国产女优视频一区二区| 九九热这里只有精品哦| 中文字幕一区久久综合| 男人和女人干逼的视频| 成年人视频日本大香蕉久久|