筆記一:雜項設備子系統

一、概述:

部分硬件驅動(不常用的)並不符合預先定義的字符設備的範疇,而且普通的字符設備的主設備號不管是靜態分配還是動態分配,都會消耗一個主設備號,比較浪費主設備號資源,因此引入了雜項設備驅動。
    雜項設備是一個典型的字符設備,其主設備號固定爲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....)。

總結:
從上述可以看出:雜項設備這類字符設備中:設備唯一,由具體的次設備號代表(描述)一個設備。


四、附(內核啓動起來對雜項設備子系統的初始化及啓動過程)
注:下圖是一位前輩總結的圖!










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章