对于scull设备的理解

来源:互联网 发布:紫光国芯 知乎 编辑:程序博客网 时间:2024/05/18 03:06
昨天完成了第三章,但是脑子里总是感觉对scull还达不到透彻的理解。昨天睡觉前又想了想这个设备,现在试试以下的理解看可不可以。
1)scull是一个设备;
2)这个设备通过一个结构体scull_dev描述。
3)scull_dev有7个成员,其中
    struct qset *data,指向一个用来存储数据的链表,我们把这个链表的每一个节点称为一个量子集,那么data就是这个由n个量子集构成的链表的头指针;
    int quantum,描述量子集中每个量子的大小,通常默认为4000字节;
    int qset,描述量子集中量子的数量,通常默认为1000个;
    unsigned long size,保存在其中的数据总量;//没理解透
    unsigned int access_key;由sculluid和scullpriv使用;//没理解透
    struct semaphore sem;互斥信号量;//没理解透
    struct cdev cdev,一个字符设备,用来描述该设备。

struct qset
{
  void **data;    //指向量子集的首元素,因为量子是一个存储空间,需要void *描述;所以指向量子集需要类型void **
  struct qset *next;    //下一个节点
};

//在<linux/cdev.h>中描述
struct cdev {
    struct kobject kobj;
    struct module *owner;
    const struct file_operations *ops;
    struct list_head list;
    dev_t dev;
    unsigned int count;
};
void cdev_init(struct cdev *, const struct file_operations *);//使用struct file_operations结构的常量来初始化cdev结构体.
struct cdev *cdev_alloc(void);//为cdev指针分配一个结构体空间
void cdev_put(struct cdev *p);//
int cdev_add(struct cdev *, dev_t, unsigned); //将你的设备模块关联到内核上。设备被激活了.参数:设备结构体,设备号,有多少设备会使用这个驱动。
void cdev_del(struct cdev *);//从系统内核上除去设备模块。
void cd_forget(struct inode *);//