一、概述:
部分硬件驅動(不常用的)並不符合預先定義的字符設備的範疇,而且普通的字符設備的主設備號不管是靜態分配還是動態分配,都會消耗一個主設備號,比較浪費主設備號資源,因此引入了雜項設備驅動。
雜項設備是一個典型的字符設備,其主設備號固定爲10,在linux/major.h中定義#define MISC_MAJOR10。
雜項設備是將我們寫的普通的字符設備進行再次封裝,降低了我們編寫字符設備驅動的難度,同時節約了主設備號資源。
二、雜項設備註冊流程:
主要爲三步:
1、填充字符設備核心結構體file_operations;
2、填充雜項設備核心結構體miscdevice;
3、向內核註冊misc_register();-->註銷爲misc_deregister()
例子:(主要體現流程)
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.open = dev_open,
.release = dev_close,
.read = dev_read,
};
struct miscdevice dev_misc = { //填充miscdevice結構體
.minor=MISC_DYNAMIC_MINOR, //動態獲取次設備號
.name=DRIVER_NAME,
.fops = &dev_fops
};
misc_register(&dev_misc); //註冊並自動生成節點
三、雜項設備驅動與應用層的數據交互流程
主設備號爲10,主要通過次設備號找到對應的file_operations結構體。
在misc.c中是實現雜項設備子系統的核心,在其misc_fops->misc_open()中找到次設備號,通過次設備號找到對應的f_ops結構體。
具體見misc_open()函數:
找到對應次設備號的fops結構體之後,用戶層與驅動進行數據交互(read/write....)。
總結:
從上述可以看出:雜項設備這類字符設備中:設備唯一,由具體的次設備號代表(描述)一個設備。
四、附(內核啓動起來對雜項設備子系統的初始化及啓動過程)
注:下圖是一位前輩總結的圖!