scull在ldd3这本书中是这么介绍的:
从一个真实设备驱动提取的代码片段, scull 是一个字符驱动, 操作一块内存区域好像它是一个设备.scull 的优势在于它不依赖硬件. scull 只是操作一些从内核分配的内存.这个设备除了演示内核和字符驱动的接口和允许用户运行一些测试之外, 不做任何有用的事情.
scull的作用是当用户申请内存空间时,只有用户写时才需要申请内存,这就存在零散的内存区域,也需要管理这些区域,即出现了scull中scull_dev,scull_qset数据结构。
裸设备是一个可变长度的内存区,使用一个间接块链表。
scull_dev->data指向一个指针数组,这个数组(quantum-set,量子集)有SCULL_QSET那么长,每个指针指向一个SCULL_QUANTUM字节的内存区。
也就是一个scull_dev->data指向的空间可存储内容为SCULL_QSET*SCULL_QUANTUM个字节。
pipe是一二简单的循环缓冲区,默认值是4000字节。
struct scull_dev {
struct scull_qset *data; /* 指向第一个量子集*/
int quantum; /* 当前量子大小the current quantum size */
int qset; /* 当前数组大小the current array size */
unsigned long size; /* 当前可存储数据amount of data stored here */
unsigned int access_key; /* 可由 sculluid(一次只能是一个用户使用)和scullpriv (scullpriv 对每个虚拟终端(或者 X 终端会话)是私有的)使用*/
struct semaphore sem; /* 互斥信号量 */
struct cdev cdev; /* 字符设备结构 */