scullc驱动的工作方式类似于一个缓冲区,管理一段可以在上面读写的内存,不多也不少。
scullc内部的内存是由链表将结构连接在一起的。链表目录由一系列scull_qset节点组成,
scull_qset有一个指向下一个节点的指针和一个数据域。这个数据区域是一由包含量子的表组成的
。这个表里面有scull_num_quantum个量子,每一个量子有scull_quantum_size bytes,
共建scull_num_quantum×scull_quantum_size个数据。
scull使用的内存区域这里也成为设备,其长度是可变的,写的越多,她就变得越长。用更短的文件以覆盖的方式写设备时则会变短。
void * kmalloc(size_t size,int flags);
void kfree(void * ptr);
对kmalloc的调用将试图分配size个字节大小的内存;
其返回值指向该内存的指针,分配失败返回null。flags参数用来描述内存的分配方式。(通常用GFP_KERNEL)
这个函数分配的内存应该通过kfree释放,我们不应该将非kmalloc返回的指针传递给kfree.但是将null指针传递给kfree是合法的。
每一个设备都是一个指针链表,其中每一个指针都指向一个scull_qset结构。
默认情况下,每一个这样的scull_qset结构通过一个中间指针数组最多可引用4000000个字节。
也就是说使用1000个指针的数组,每个指针指向一个4000字节的区域。我们将每个内存区称为一个量子,而这个指针数组成为量子集。
/* scull_qset结构 struct scull_qset { void **data; struct scull_qset *next; } struct scull_dev { struct stull_qset *data: struct semaphore sem; struct cdev cdev; } */ int scull_trim(struct scull_dev *dev){ int qset = dev->qset;//量子集的数量 访问所有数据节点,清空当前节点数据,清空当前设备数据 dptr=dev->data第一个scull_qset;dptr->next下一个scull_qset; for(dptr = dev->data; dptr; dptr=next){ 如果存在量子集,顺序访问量子集中的所有量子 ,并清空数据。 qset量子数量; quantuam量子大小,也就是可以使用的内存区域 */ if(dptr->data){ |