Linux之module param 函式學習

2021-07-10 03:22:47 字數 4968 閱讀 9048

一.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伺服器以及做程式開...