在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);
移除后,驱动从内核中被清除,无法继续工作