scull

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;    

}
scull_dev结构

struct scull_dev {

     struct stull_qset *data:
     int quantum://量子
     int qset://量子集
     unsigned long size:
     unsigned int access_key;

     struct semaphore sem;

     struct cdev cdev;

}

*/ 

int scull_trim(struct scull_dev *dev){
  struct scull_qset *next, *dptr;//声明scull_qset结果的两个指针

  int qset = dev->qset;//量子集的数量
  int i;
  /*

     访问所有数据节点,清空当前节点数据,清空当前设备数据

     dptr=dev->data第一个scull_qset;dptr->next下一个scull_qset;
*/

  for(dptr = dev->data; dptr; dptr=next){
/*

    如果存在量子集,顺序访问量子集中的所有量子 ,并清空数据。  

    qset量子数量;

    quantuam量子大小,也就是可以使用的内存区域

*/

    if(dptr->data){
      // In the current nodes, free all pointers.
      for(i=0;i<qset;i++){
    kfree(dptr->data);//释放所有的指针,指向的内存区域
    dptr->data = NULL;
      }
    }
    next=dptr->next;//指向下一个指针scull_qset
    kfree(dptr);//释放该scull_qset的内存区域
  }
  // Reset the device
  dev->size = 0;
  dev->quantum = SCULL_QUANTUM_SIZE;
  dev->qset = SCULL_NUM_QUANTUM;
  dev->data = NULL;
  return 0;
}

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值