一.module_param
1.為什麼引入
在使用者態下程式設計可以通過main()來傳遞命令列引數,而編寫乙個核心模組則可通過module_param()來傳遞命令列引數.
2. module_param巨集是linux 2.6核心中新增的,該巨集被定義在include/linux/moduleparam.h檔案中,具體定義如下:
/* helper functions: type is byte, short, ushort, int, uint, long,
ulong, charp, bool or invbool, or *** if you define param_get_***,
param_set_*** and param_check_***.
*/#define module_param_named(name, value, type, perm)
param_check_##type(name, &(value));
module_param_call(name, param_set_##type, param_get_##type, &value, perm);
__module_parm_type(name, #type)
#define module_param(name, type, perm)
module_param_named(name, name, type, perm)
由此可知 module_param的實現是通過module_param_named(name, name, type, perm)的。
3.module_param使用了3個引數:變數名,它的型別,以及乙個許可權掩碼用來做乙個輔助的sysfs入口。
這個巨集定義應當放在任何函式之外,典型地是出現在原始檔的前面。
eg: static char *whom="world"
static int tige=1;
module_param(tiger,int,s_irugo);
module_param(whom,charp,s_irugo);
4.模組引數支援許多態別:
bool
invbool
乙個布林型( true 或者 false)值(相關的變數應當是 int 型別). invbool 型別顛倒了值, 所以真值變成 false, 反之亦然.
charp :乙個字元指標值. 記憶體為使用者提供的字串分配, 指標因此設定.
intlong
short
uint
ulong
ushort
基本的變長整型值. 以 u 開頭的是無符號值.
5.陣列引數, 用逗號間隔的列表提供的值, 模組載入者也支援。
宣告乙個陣列引數, 使用:
module_param_array(name,type,num,perm);
這裡 name 是你的陣列的名子(也是引數名),
type 是陣列元素的型別,
num 是乙個整型變數,
perm 是通常的許可權值.
如果陣列引數在載入時設定, num 被設定成提供的數的個數. 模組載入者拒絕比陣列能放下的多的值.
tiger-john說明:
perm引數的作用是什麼?
最後的 module_param 欄位是乙個許可權值,表示此引數在sysfs檔案系統中所對應的檔案節點的屬性。你應當使用 中定義的值. 這個值控制誰可以訪問這些模組引數在 sysfs 中的表示.當perm為0時,表示此引數不存在 sysfs檔案系統下對應的檔案節點。 否則, 模組被載入後,在/sys/module/ 目錄下將出現以此模組名命名的目錄, 帶有給定的許可權.。
許可權在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 引數可以被所有人讀取, 但是不能改變; s_irugo|s_iwusr 允許 root 來改變引數. 注意, 如果乙個引數被 sysfs 修改, 你的模組看到的引數值也改變了, 但是你的模組沒有任何其他的通知. 你應當不要使模組引數可寫, 除非你準備好檢測這個改變並且因而作出反應.
二例項:
說了這麼多,看乙個程式體驗以下:
1.module_param.c
view plaincopy to clipboardprint?
/*
* file name : module_param.c
* author : tiger-john
*/ #include
#include
#include
module_license("gpl");
static char *who;
static int times;
module_param(who,charp,0644);
module_param(times,int,0644);
static int __init hello_init(void)
static void __exit hello_exit(void)
module_init(hello_init);
module_exit(hello_exit);
/** file name : module_param.c
* author : tiger-john
*/#include
#include
#include
module_license("gpl");
static char *who;
static int times;
module_param(who,charp,0644);
module_param(times,int,0644);
static int __init hello_init(void)
static void __exit hello_exit(void)
module_init(hello_init);
module_exit(hello_exit);
2.編寫makefile檔案
view plaincopy to clipboardprint?
1 obj-m:=module_param.o
2 current_path:=$(shell pwd)
3 version_num :=$(shell uname -r)
4 linux_path :=/usr/src/linux-headers-$(version_num)
5
6 all :
7 make -c $(linux_path) m=$(current_path) modules
8 clean :
9 make -c $(linux_path) m=$(current_path) clean
1 obj-m:=module_param.o
2 current_path:=$(shell pwd)
3 version_num :=$(shell uname -r)
4 linux_path :=/usr/src/linux-headers-$(version_num)
5 6 all :
7 make -c $(linux_path) m=$(current_path) modules
8 clean :
9 make -c $(linux_path) m=$(current_path) clean
3.在終端輸入:make
4 .載入模組: sudo insmdo module_param.ko who=tiger times=4
5.dmesg :檢視結果。
過程例項:
a.在終端輸入:make
think@ubuntu:~/module_param$ make
make -c /usr/src/linux-headers-2.6.32-25-generic m=/home/think/module_param modules
make[1]: 正在進入目錄 `/usr/src/linux-headers-2.6.32-25-generic'
building modules, stage 2.
modpost 1 modules
make[1]:正在離開目錄 `/usr/src/linux-headers-2.6.32-25-generic'
think@ubuntu:~/module_param$
b.在終端輸入: sudo insmod module_param.ko who=tiger times=4
think@ubuntu:~/module_param$ sudo insmod module_param.ko who=tiger times=4
c 在終端輸入:dmesg
[ 4297.711137] 1 tiger!
[ 4297.711139] 2 tiger!
[ 4297.711140] 3 tiger!
[ 4297.711141] 4 tiger!
linux 一 之linux簡介
其實在前幾天我使用的是csdn來寫部落格,嘗試了一下,發現真的太浪費時間了。可能是自己不太習慣的原因吧。所以最後還是換回使用。接下來給大家帶來的是linux,大家聽到這裡linux感覺很神秘的樣子,其實它也就是乙個作業系統而已。伺服器 web伺服器 mail伺服器 database伺服器以及做程式開...
Linux之如何學習linux
這些天我們也分享了好多linux的內容,從文字相關命令到檔案和目錄操作命令,也講了shell 管道 環境變數等內容。其實linux的內容不僅僅如此,後續我暫時會停止全面講解基本和常用命令的步伐,會挑選一些重點 難點 內容來分享。今天我來講講如何學習linux 僅供參考。首先,你要知道linux都有什...
linux 一 之linux簡介
其實在前幾天我使用的是csdn來寫部落格,嘗試了一下,發現真的太浪費時間了。可能是自己不太習慣的原因吧。所以最後還是換回使用。接下來給大家帶來的是linux,大家聽到這裡linux感覺很神秘的樣子,其實它也就是乙個作業系統而已。伺服器 web伺服器 mail伺服器 database伺服器以及做程式開...