无法理解scullpipe驱动程序中的spacefree函数

时间:2014-04-20 04:09:23

标签: c pointers linux-device-driver

我正在阅读" Linux设备驱动程序3"我无法理解以下代码:

/* How much space is free */
static int spacefree(struct scull_pipe *dev){
  if(dev->rp == dev->wp)
     return dev->buffersize - 1;
  return ((dev->rp + dev->buffersize - dev->wp) % dev->buffersize) - 1;
}

根据我的理解: 1. * buffer是缓冲区的开头。 2. * end是缓冲区的结尾。 3. end = buffer + buffersize 因此, buffersize 是缓冲区的总大小。

if(dev->rp == dev->wp)
     return dev->buffersize - 1;

上面的代码是正确的, if 读指针(rp)和写指针(wp)都在缓冲区的开头。因为如果没有数据写入缓冲区,那么写指针(wp)将位于缓冲区的开头(除非写指针(wp)已经包装),因此,可用空间的总量等于缓冲区大小

但是我不确定上面的代码是否正确,如果读指针(rp)和写指针(wp)都指向缓冲区的末尾(或指向缓冲区中间的内存位置) 。如果写指针(wp)指向缓冲区的末尾,则可用空间总量应 0 ,对吗?

return ((dev->rp + dev->buffersize - dev->wp) % dev->buffersize) - 1;

根据我的理解,当读指针(rp)和写指针(wp)时,上面的代码应返回缓冲区中的可用空间总量>指向缓冲区中的相同内存位置。

是否可以根据写指针(wp)的位置单独计算可用空间总量?

例如:dev-> end - dev-> wp

有人可以解释一下这段代码。

由于

1 个答案:

答案 0 :(得分:0)

我终于理解了代码:

  1. 缓冲区是圆形的。
  2. 从内存位置读取数据后,数据(在内存位置)被清除。因此,在读指针(rp)之前和写指针(wp)之后的所有内存位置都将为空。
  3. 如果读指针(rp)和写指针(wp)指向相同的内存位置,则缓冲区为空。
  4. 如果写指针(wp)出现在读指针后面,则缓冲区已满。

    return ((dev->rp + dev->buffersize - dev->wp) % dev->buffersize) - 1;

  5. 要理解上面的代码段:

    考虑一个包含10个内存位置的循环缓冲区:

     8 9 10 | 1 2 3 4 5 6 7
    

    如果读指针(rp)位于内存位置3且写指针位于内存位置7,则5个内存位置是空闲的:

    8, 9, 10, 1, 2
    

    插入值:

    return ((dev->rp + dev->buffersize - dev->wp) % dev->buffersize) - 1;

    return ((3 + 10 - 7) % 10) -1

    return ((6) % 10) -1

    return 6-1

    return 5