數據結構
#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 }