載入函式
解除安裝函式
模組引數
匯出符號
模組的宣告與描述
通過insmod或者modprobe載入模組時,載入函式將會自動執行
通過rmmod解除安裝模組時,解除安裝函式將會被自動執行
描述核心模組的許可許可權,如果不宣告,載入時將收到核心被汙染(kernel tainted)的警告
大多數情況下,採用gpl v2
module_license
("gpl v2"
);
模組引數是模組被載入時,可以傳遞給它的值,對應於模組內部的區域性變數
模組可以匯出符號(symbol),對應函式或變數,如果匯出,則其它模組就可以使用了
形式被固定為module_init(函式名);
,返回整型值,若初始化成功,則返回0,失敗返回錯誤碼
在核心中,也可以通過request_module(模組名)
函式靈活地載入其它核心模組
一般以__init
標識對初始化函式做額外宣告,原型如下
#define __init __attribute__ ((__section__ (".init.text"))) __cold
指定該函式,在鏈結的時候,放到init.text
段,初始化的時候,呼叫這些函式,初始化完成後,釋放記憶體
資料也可以用__initdata
進行標識,鏈結時,放到init.data
區段,同樣在初始化完成後,釋放其記憶體
static
int __init hello_init
(void
)static
int a __initdata=
1;
形式被固定為module_exit(函式名)
,不返回任何值,解除安裝函式利用__exit
進行修飾
同樣,只是在解除安裝階段起作用的變數,也可以利用__exitdata
進行修飾
使用者態通過main函式即可完成引數傳遞,在核心態中,可以使用module_param(引數名,引數型別,引數許可權)
為模組定義引數,例如:
static
int a=10;
module_param
(a,int
,0644
);
呼叫形式為
insmod 模組名 引數名=引數值也可以設定引數陣列,形式為insmod book.ko book_name=『nihao』 book_num=100
module_param_array(陣列名,陣列型別,陣列長度,引數許可權)
如果呼叫的時候,引數預設,則使用內部預設值
如果是內建模組,則無法通過insmod載入模組,但是可以通過bootloader,在bootargs中設定模組名.引數名=值
的形式,給內建模組傳遞引數
引數載入後,在/sys/module/模組名/的目錄下,將出現parameters目錄,裡面可以檢視引數資訊
相關巨集定義在src/include/stat.h
s_irugo=
(s_irusr|s_irgrp|s_iroth)
s_irusr:使用者讀 00400
s_irgrp:使用者組讀 00040
s_iroth: 其他讀 00004
因此,許可權可以用巨集或者八進位制表示法
符號包括函式和變數,/proc/kallsyms
檔案對應核心符號表,記錄了符號以及符號所在的記憶體位址
模組可以使用以下兩種方法匯出符號到核心符號表,匯出的符號可以被其它模組使用,但是使用前需要宣告
export_symbol
(符號名)
;//所有模組都能使用
export_symbol_gpl
(符號名)
;//gpl許可的模組能使用
module_author(作者名字);
module_description(「描述內容」);
module_version(「版本號」);對於usb、pci等裝置驅動,通常會建立裝置表,表明支援的裝置
module_device_table(type, name);
module_alias(「別名」);
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...
LINUX 裝置驅動 完善 版(二)
dev fifo.c include include include include include include define major num 250 struct mycdev static dev t g pdevnum struct mycdev g pcdev struct clas...
linux 字元裝置 驅動框架 二
前面編寫了乙個簡單的 linux字元裝置驅動 linux driver 1 接下來簡單地來看一下字元裝置驅動的框架。在linux 字元裝置裡,有三個比較重要的資料結構,分別是 struct file operations,struct file和struct inode 下面來簡單的說明一下 這個結...