昨天完成了第三章,但是脑子里总是感觉对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 *);//
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 *);//