核心模組的編寫1

2021-09-30 09:41:03 字數 3167 閱讀 4129

#include
#include
module_license("dual bsd/gpl");//是用來告知核心, 該模組帶有乙個自由的許可證; 沒有這樣的說明, 在模組載入時核心會抱怨.
static int hello_init(void)

static void hello_exit(void)

module_init(hello_init);//特別的核心巨集來指出這兩個函式的角色,
//乙個在模組載入到核心時被呼叫( hello_init )以及乙個在模組被去除時被呼叫( hello_exit )

module_exit(hello_exit);

最後 你可以用 insmod 和 rmmod 工具來測試這個模組. 注意只有超級使用者可以載入和解除安裝模組.

export_symbol(name);

export_symbol_gpl(name);
上面巨集定義的任乙個使得給定的符號在模組外可用. _gpl 版本的巨集定義只能使符號對 gpl 許可的模組可用.

可以在模組中包含的其他描述性定義有 

module_author ( 宣告誰編寫了模組 ), 

module_descripion( 乙個人可讀的關於模組做什麼的宣告 ), 

module_version ( 乙個**修訂版本號; 看 的注釋以便知道建立版本字串使用的慣例), 

module_alias ( 模組為人所知的另乙個名子 ), 以及 

module_device_table ( 來告知使用者空間, 模組支援那些裝置 ). 

#include

module_param(variable, type, perm);

要想在 sysfs下可見(可以在模組載入時修改的引數),必須通過巨集 module_param 來顯式宣告,該巨集有三個引數,

第乙個為引數名,即已經定義的變數名,

第二個引數則為變數型別,可用的型別有 byte, short, ushort, int, uint, long, ulong, charp 和 bool 或 invbool,分別對應於 c 型別 char, short, unsigned short, int, unsigned int, long, unsigned long, char * 和 int,使用者也可以自定義型別 ***(如果使用者自己定義了 param_get_***,param_set_*** 和 param_check_***)。

該巨集的第三個引數用於指定訪問許可權,如果為 0,該引數將不出現在 sysfs 檔案系統中,允許的訪問許可權為 s_irusr, s_iwusr,s_irgrp,s_iwgrp,s_iroth 和 s_iwoth 的組合,它們分別對應於使用者讀,使用者寫,使用者組讀,使用者組寫,其他使用者讀和其他使用者寫,因此用檔案的訪問許可權設定是一致的。 

module_param(my_invisible_int, int, 0);//第三個引數設定為0,引數不可見

module_parm_desc(my_invisible_int, "an invisible int under sysfs");//僅僅是個描述語句。

module_param(my_visible_int, int, s_irusr | s_iwusr | s_irgrp | s_iroth);

module_parm_desc(my_visible_int, "an visible int under sysfs");

module_param(mystring, charp, s_irusr | s_iwusr | s_irgrp | s_iroth);

module_parm_desc(mystring, "an visible string under sysfs");

假設乙個模組內部定義如上,那麼可以用下面的命令來修改模組內部的可見引數。

$ insmod ./module-param-exam.ko my_invisible_int=10 my_visible_int=20 mystring="hello,world"//插入模組時設定引數

my_invisible_int = 10

my_visible_int = 20

mystring = 'hello,world'

$ ls /sys/module/module_param_exam/parameters/ //顯示可見的引數

mystring my_visible_int

$ cat /sys/module/module_param_exam/parameters/mystring //顯示引數的值

hello,world

$ cat /sys/module/module_param_exam/parameters/my_visible_int 20

$ echo 2000 > /sys/module/module_param_exam/parameters/my_visible_int //通過管道給引數傳值

$ cat /sys/module/module_param_exam/parameters/my_visible_int //顯示傳值之後的結果

2000

$ echo "abc" > /sys/module/module_param_exam/parameters/mystring

$ cat /sys/module/module_param_exam/parameters/mystring

abc$ rmmod module_param_exam //退出模組

my_invisible_int = 10

my_visible_int = 2000

mystring = 'abc'

linux核心模組的編寫

之前學了核心模組的編寫,但是沒有動手實驗,這次試驗才發現還是有好動東西需要學習!我的環境是虛擬機器跑centos 7 1.首先編寫模組 include include module license dual bsd gpl static int hello init void static void...

編寫核心模組hello world

1 準備環境 mkdir src lkm example cd src lkm example 2 建立檔案 lkm example.c include include include module license gpl module author robert w.oliver ii modul...

核心驅動模組編寫規範

書寫格式範例 include include 模組入口函式規範 static int init func init void static void exit func exit void 關閉init中占用的資源 printk byebye s n module module init func ...