在Linux内核中,使用cdev结构体描述一个字符设备,cdev结构体的定义如下
struct cdev
{
//内嵌的kobject对象
struct kobject kobj;
//所属模块
struct module *owner;
//文件操作描述符
struct file_operations *ops;
//与cdev 对应的字符设备文件的 inode->i_devices 的链表头
struct list_head list;
//设备号
dev_t dev;
//设备范围号大小
unsigned int count;
};
dev_t成员定义了设备号,为32位,其中12位为主设备号,20位为设备号
使用宏可以从dev_t获得主设备号和次设备号:
MAJOR(dev_t dev)
MINOR(dev_t dev)
cdev结构体的另一个重要成员file_operations定义了字符设备驱动提供给虚拟文件系统的接口函数
Linux内核提供了一组函数以用于操作cdev结构体
//cdev_init函数用于初始化cdev的成员
void cdev_init(struct cdev*,struct file_operations *);
//用于动态申请一个cdev内存
struct cdev *cdev_alloc(void);
void cdev_put(struct cdev *p);
//添加一个cdev到系统
//通常发生在驱动模块加载函数中
int cdev_add(struct cdev *, dev_t, unsigned);
//删除系统中的一个cdev
//通常发生在驱动模块卸载函数中
void cdev_del(struct cdev *);