在Linux内核中,用struct cdev来表示字符设备。

1. cdev结构体

//在linux/include/linux/cdev.h中
struct cdev {
    struct kobject kobj;//内嵌的内核对象
    struct module *owner;//该设备的驱动程序所属的内核模块,一般设置为THIS_MODULE;
    const struct file_operations *ops;//文件操作结构体指针,file_operations结构体中包含一系列对设备进行操作的函数接口
    struct list_head list;//用来将已经向内核注册的所有字符设备形成链表
    dev_t dev;//设备号。dev_t封装了unsigned int,该类型前12位为主设备号,后20位为次设备号;
    unsigned int count;//隶属于同一主设备号的次设备号的个数
};

cdev结构是内核对字符设备驱动的标准描述。在实际的设备驱动开发中,通常使用自定义的结构体扩展struct cdev结构,来描述一个特定的字符设备。这个自定义的结构体中必然会包含cdev结构,另外还要包含一些描述这个具体设备某些特性到字段。比如:

struct my_dev
{
	struct cdev cdev; 
	unsigned char buf[BUF_SIZE]; //扩展字段
};

2.获取一个独立的cdev结构:

struct cdev * cdev_alloc (void);

3.初始化已分配的cdev结构

void cdev_init(struct cdev *cdev, struct file_operations *fops);

4.将该结构添加到内核

int cdev_add(struct cdev *dev, dev_t num, unsigned int count); 如果调用成功,则驱动可以工作了。

5.移除字符设备

void cdev_del(struct cdev *dev); 移除后,驱动从内核中被清除,无法继续工作