linux param指的是「module_param」函數,其作用是傳遞命令列參數;在使用者態下編程可以透過「main()」的參數來傳遞命令列參數,而編寫一個核心模組則透過“module_param()”來傳遞參數。
本教學操作環境:linux5.9.8系統、Dell G3電腦。
linux param是什麼?
linux驅動程式之module_param的用法
我們在使用者態寫程式時都喜歡用main函數的如果參數來向程式內傳遞資料
#include <stlib.h> #include <stdio.h> int main(int argc,char **argv) { exit(0); }</stdio.h></stlib.h>
其中argc為傳入程式內參數的個數,argv為傳入的參數,其中的第一個參數argv[0]為目前檔案的含路徑的名字,所以實際傳入程式內的參數個數為argc-1個。
核心模組中沒有main函數,所以向模組內部傳入參數可以透過module_param這個巨集定義來實現:
// 原型 #define module_param(name, type, perm) \ module_param_named(name, name, type, perm)
name:傳入參數名稱
type:傳入參數類型,有byte, short, ushort, int, uint, long, ulong, charp, bool,invbool這幾種類型
perm:這個為sysfs中資源的存取權限,下面再細說,主要有以下權限類型在uapi/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 // 其他人可执行权限
模組程式碼編寫:
#include <linux> int num = 100; module_param(num,int,S_IRUSR); static int __init param_init(void) { printk("[%s] num = %d\r\n",__FUNCTION__,num); return 0; } static void __exit param_exit(void) { printk("[%s] num = %d\r\n",__FUNCTION__,num) } module_init(param_init); module_exit(param_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Chen");</linux>
Makefile檔:
ifneq ($(KERNELRELEASE),) obj-m:=param.o else KERNEL_DIR:=/lib/modules/$(shell uname -r)/build CURRENT_DIR:=$(shell pwd) ccflags-y:=-std=gnu99 -Wno-declaration-after-statement all: $(MAKE) -C $(KERNEL_DIR) M=$(CURRENT_DIR) modules clean: $(MAKE) -C $(KERNEL_DIR) M=$(CURRENT_DIR) clean endif
編譯程序,安裝模組,然後dmesg
模組安裝後在/sys/module資料夾下會產生對應模組名字的資料夾,進入資料夾內
進入資料夾,資料夾內parameters資料夾內會會有先前程式中的num
##從圖片中可以看出核心在檔案系統中會產生對應的檔案讓使用者訪問,並且模組中module_param巨集定義中的perm設定了使用者唯讀權限,所以num檔案權限與其對應。 當然你也可以設定可寫權限來改變輸入參數 的值,改變後內核模組中的 該 參數會改變但是不會有任何資訊提示。
以上是linux param是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!