關於module param 巨集 轉)

2021-05-24 10:50:26 字數 2477 閱讀 6250

在使用者態下程式設計可以通過main()的來傳遞命令列引數,而編寫乙個核心模組則通過module_param()

module_param巨集是linux 2.6核心中新增的,該巨集被定義在include/linux/moduleparam.h檔案中,具體定義如下:

#define module_param(name, type, perm)                

module_param_named(name, name, type, perm)

其中使用了 3 個引數:要傳遞的引數變數名, 變數的資料型別, 以及訪問引數的許可權。

<<<

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 修改, 你的模組看到的引數值也改變了, 但是你的模組沒有任何其他的通知. 你應當不要使模組引數可寫, 除非你準備好檢測這個改變並且因而作出反應.

>>>

這個巨集定義應當放在任何函式之外, 典型地是出現在原始檔的前面.定義如:

static char *whom = "world";

static int howmany = 1;

module_param(howmany, int, s_irugo);

module_param(whom, charp, s_irugo);

模組引數支援許多態別:

bool

invbool

乙個布林型( true 或者 false)值(相關的變數應當是 int 型別). invbool 型別顛倒了值, 所以真值變成 false, 反之亦然.

charp :乙個字元指標值. 記憶體為使用者提供的字串分配, 指標因此設定.int

long

short

uint

ulong

ushort

基本的變長整型值. 以 u 開頭的是無符號值.

陣列引數, 用逗號間隔的列表提供的值, 模組載入者也支援. 宣告乙個陣列引數, 使用:

module_param_array(name,type,num,perm);

這裡 name 是你的陣列的名子(也是引數名),

type 是陣列元素的型別,

num 是乙個整型變數,

perm 是通常的許可權值.

如果陣列引數在載入時設定, num 被設定成提供的數的個數. 模組載入者拒絕比陣列能放下的多的值.測試模組,源程式hello.c內容如下:#include

#include

#include

module_init(hello_init);

module_exit(hello_exit);

編譯生成可執行檔案hello

插入:# insmod hello who="world" times=5

出現5次"hello,world!":

#(1)hello,world!

#(2)hello,world!

#(3)hello,world!

#(4)hello,world!

#(5)hello,world!

解除安裝:# rmmod hello

出現:#goodbye,world!

浮點轉整數的巨集

union luai cast define lua number2int i,d printf d n i 很神奇的巨集,可以試一下 這個巨集神奇的在正數和負數的雙精度浮點數時都可以正確工作,以四捨五入方式轉換為 32 位整數。這個數字是 1.5 2 52 小於 2 31 的數字在和這個magic...

關於巨集定義

一 巨集替換 1.巨集展開的順序 先由外層向內層檢查,直至最內層後依次向外層展開。例外 遇到 開頭的巨集就不再往內檢查,從該層開始往外展開。2.重新掃瞄和替換 在替換列表中的所有引數替換過之後,預處理器將對結果token序列重新掃瞄以便對其中的巨集再次替換。當正在替換的巨集在其替換列表中發現自身時,...

關於offsetof巨集

offsetof 巨集 這是在看書的時候遇到的,估計以後會用到,避免遺忘,先記下來吧。一般形式 define offsetof type,member size t type 0 member 說明 通過 type 0 將0位址強制轉換為type結構型別中的指標 通過 type 0 member 訪...