字符設備幾種註冊方式的區別

數據結構

#define CHRDEV_MAJOR_HASH_SIZE	255

static struct char_device_struct {
 struct char_device_struct *next;
 unsigned int major;
 unsigned int baseminor;
 int minorct;
 char name[64];
 struct file_operations *fops;
 struct cdev *cdev;	/* will die */
} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];

/* index in the above */
static inline int major_to_index(int major)
{
 return major % CHRDEV_MAJOR_HASH_SIZE;
}

全局變量chrdevs,是一個保存所有字符設備的數組,按主轉換出的索引值從小到大排列;
每個元素爲一個char_device_struct 鏈表,鏈表元素按次設備號從小到大排列。
主設備號與索引的關係爲:major % CHRDEV_MAJOR_HASH_SIZE, 即:major = 1 與major = 256在使用相同的索引值,index=1;

設備申請方式的差異

-----------------------------------------------  支持多設備 -----------------------------------------------
    int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
        dev = 0 時,爲動態申請設備,申請到的設備號保存到dev;
        baseminor,次設備號起始編號;
        count,申請連續設備號的數量;
        name,設備名稱;
    -----------------------------------------------  只支持靜態申請 -----------------------------------------------
    int register_chrdev_region(dev_t from, unsigned count, const char *name)
        from,申請的設備號起始編號;
        count,申請連續設備號的數量;
        name,設備名稱;
-----------------------------------------------  單設備 -----------------------------------------------
    int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops)
        major = 0 時,爲動態申請設備,申請到的主設備號保存到major;
        name,設備名稱;
        fops,關聯設備的文件操作符;

注:對於申請連續的設備號,使用倒序申請。最終返回起始設備號。

功能差異

完整註冊過程

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