分类: LINUX
2010-09-30 15:06:29
SCULL的内存使用
SCULL以一片系统内存作为一个字符设备,对其进行操作。SCULL的内存使用是很有趣的。
代表SCULL设备的数据结构是scull_dev。scull_dev通过一个链表来管理内存,链表的具体结构为scull_qset,每个scull_qset指向一块内存区域:这块内存区域被分成1000份,每份4000个字节。所以,每份称为quantum,份数成为quantum set,其实份数就是指针了。 SCULL设备的规划如下图:
这个内存使用模型是以scull_qset结构为单位的,当你向SCULL中写入一个byte的数据时,SCULL需要分配给你一个scull_qet结构,这至少需要1000个指针(占用4000字节或8000字节,这取决于平台是32位还是64位)和一个quantum(4000字节)。所以写一个字节对于这样一个内存使用模型的开销是很大的。SCULL内存使用模型并没有限制最大使用内存的数目,你可以用完你的机器上所有的实际内存。SCULL只限制了一个scull_qset可以容纳4000x1000大小的内存。
struct scull_pipe {
wait_queue_head_t inq, outq; /* read and write queues */
char *buffer, *end; /* begin of buf, end of buf */
int buffersize; /* used in pointer arithmetic */
char *rp, *wp; /* where to read, where to write */
int nreaders, nwriters; /* number of openings for r/w */
struct fasync_struct *async_queue; /* asynchronous readers */
struct semaphore sem; /* mutual exclusion semaphore */
struct cdev cdev; /* Char device structure */
}; |
Name
register_chrdev_region — register a range of device numbers
Synopsis
Arguments
from
the first in the desired range of device numbers; must include the major number.
count
the number of consecutive device numbers required
name
the name of the device or driver.
Description
Return value is zero on success, a negative error code on failure. |