LDD 第三章 (一.重要的结构和实现)
一.重要的结构和实现
设备描述结构
struct scull_dev {
struct scull_qset *data;
int quantum;
int qset;
unsigned long size;
unsigned int access_key;
struct semaphore sem;
struct cdev cdev;
};
设备量子集
struct scull_qset {
void **data;
struct scull_qset *next;
};
起初看了上面的图有一些不明白,当看了scull_trim的代码以后,就很清晰了.
很多地方的指针被申明为void *,主要是为了让你在使用之前转换类型.
int scull_trim(struct scull_dev *dev)
{
struct scull_qset *next, *dptr;
int qset = dev->qset;
int i;
for (dptr = dev->data; dptr; dptr = next)
{
if (dptr->data) {
for (i = 0; i < qset; i++)
kfree(dptr->data[i]); //这里是循环释放量子指针
kfree(dptr->data); //这里是释放整个量子集队列指针
dptr->data = NULL;
}
next = dptr->next;
kfree(dptr); //这里是释放量子集结构指针
}
dev->size = 0; //清空设备数据计数
dev->quantum = scull_quantum; //设置为内核预定义的量子大小
dev->qset = scull_qset; //设置为内核预定义的量子集大小
dev->data = NULL;
return 0;
}