Linux核心開發 核心模組引數

2021-10-09 21:56:34 字數 3717 閱讀 8982

目錄

使用引數載入模組

module_param巨集

讀取和更改引數值

驗證引數值

宣告模組引數陣列

有關模組引數的一些說明

在本文中,我們將向模組新增引數。使用引數,您可以在載入模組時訪問模組全域性變數,並在執行時已載入模組時訪問模組全域性變數。

使用insmod命令載入模組時,可以提供引數作為key = value對,例如:

# insmod ./mymod.ko irq=20 name=mydev debug=1 address=0x1000,0x2000,0x3000
引數可以是數字,字串或(數字或字串的)陣列

要在模組中宣告乙個簡單引數,請宣告乙個全域性變數並使用

module_param巨集,例如:

#include #include #include #include static int irq=10;

module_param(irq,int,0660);

static int debug=0;

module_param(debug,int,0660);

static char *devname = "simpdev";

module_param(devname,charp,0660);

static int ******_init(void)

static void ******_cleanup(void)

module_init(******_init);

module_exit(******_cleanup);

現在,您可以使用irq,debug和devname引數編譯和載入模組:

# insmod ./******.ko irq=44 devname=simpdev debug=0
全域性變數將在使用use dmesg的init函式檢視輸出之前進行初始化:

# dmesg 

...[ 144.526050] hello... irq=44 name=simpdev debug=0

巨集原型是

module_param(name, type, perm);
名稱–已經定義的變數的名稱

type –引數型別(int,long,charp等)

許可權–/ sys / module / 《模組名稱》 / parameters /的許可權(對於沒有這樣的模組引數值檔案,則為0)

/ sys / module / 《模組名稱》 / parameters

# echo "1">/sys/module/******/parameters/debug
您可以在解除安裝模組時看到除錯變數已更改

# rmmod ******

# dmesg

...[ 362.125050] bye... irq=44 name=simpdev debug=0

使用/ sys中的檔案,如果有許可權,我們可以設定所需的任何值。例如,如果irq只能在1到32的範圍內,則無法驗證它,因為使用者可以直接訪問該變數。為了解決這個問題,我們可以實現乙個用於設定獲取引數值的介面–

kernel_param_ops

struct kernel_param_ops ;
要實現介面,我們需要定義乙個變數,實現set / get方法並使用module_param_cb註冊它:

static int my_set(const char *val, const struct kernel_param *kp)

static const struct kernel_param_ops param_ops = ;

static int num;

module_param_cb(simpcb, ¶m_ops, &num, 0664);

實際的引數值儲存在num中,set函式將使用者輸入作為字串並將其轉換為int,然後我們檢查該值是否正確(1-32)並使用核心提供的

param_set_int函式進行設定。要返回引數值,我們使用提供的param_get_int函式

如果嘗試使用錯誤的值載入模組,或者嘗試使用/ sys檔案設定錯誤的值,則會出現錯誤:

$ sudo insmod ./simp.ko irq=9 devname=mydev debug=0 simpcb=200

insmod: error: could not insert module ./simp.ko: invalid parameters

# echo "70">/sys/module/simp/parameters/simpcb

bash: echo: write error: invalid argument

我們還可以為get定義乙個自定義函式,但在此示例中它不是必需的。如果希望使用字串提供引數值但另存為數字,這將很有用

例如,如果我們希望中斷模式的引數為水平,邊沿,輪詢中的乙個,但我們想將其儲存為數字(1 –水平,2邊沿,3輪詢),則將定義set函式以從將字串轉換為int並將get函式從int轉換為字串

例如:

enum irq_type ;

static int irq_type = irq_type_level; // default

static int irqtype_op_write_handler(const char *val, const struct kernel_param *kp)

static int irqtype_op_read_handler(char *buffer, const struct kernel_param *kp)

return strlen(buffer);}

static const struct kernel_param_ops irqtype_op_ops = ;

module_param_cb(irqtype, &irqtype_op_ops, null, 0660);

要載入核心模組或更改引數值,請使用字串:

# sudo insmod ./simp.ko irq=9 devname=mydev debug=0 simpcb=20 irqtype=edge

# cat /sys/module/simp/parameters/irqtype

edge

您可以使用

module_param_array將引數宣告為數字或字串數​​組。例如:

static int addr[size];

static int count;

module_param_array(addr, int, &count, 0660);

載入模組時,請使用逗號分隔的列表來提供值:

# insmod ./simp.ko addr=0x1000,0x2000,0x3000
count是乙個輸出引數,並使用使用者提供的元素數進行更新(在此示例中為3)

源**:

或者:

linux核心模組引數

在裝載核心模組時,使用者可以向模組傳遞引數,形式為 insmod modprobe 模組名 引數名 引數值。如果不傳遞,引數將使用模組內定義的預設值。我們可以使用以下方法為模組定義乙個引數 module param 引數名,引數型別,引數讀 寫許可權 如下 定義了乙個整型引數 static int ...

Linux核心模組開發

一 核心模組基礎 1.1 什麼是核心模組 linux核心的整體結構非常龐大,其包含的元件也非常 多,如何使用這些元件呢,方法1 把所有的元件都編 方法1 把所有的元件都編 譯進核心檔案,即 zimage或bzimage,但這樣會導 致乙個問題 占用記憶體過多.有沒有一種機制能讓核心檔案本身並不包含某...

Linux核心模組開發

下面是乙個最基本的核心模組源 結構,任何模組專案都需要包含這些內容 include 模組初始化函式 static intmodule init func void 模組解除安裝函式 static void module exit func void module init module init f...