- 论坛徽章:
- 0
|
本帖最后由 1354613072 于 2012-10-12 14:53 编辑
看了第二章的内容,对于结构体struct scull_dev的理解不知道对不对。
现将自己的理解还有不懂的问题贴在这里,希望有一起学习的网友帮助。
struct scull_dev{
struct scull_qset *data;
int quantum;
int qset;
unsigned long size;
unsigned int access_key;
struct semaphore sem;
struct cdev cdev;
};
这里我主要想说quantum、qset和size三个变量。按照注释,quantum指的是单个量子的大小,按照默认值应该是4000吧;qset指的是数组的大小,也就是量子集的大小,按照书上说的默认值,应该为1000;size指的是保存在其中的数据总量,这个我有点迷糊了,到底指的是一个量子中的保存的数据总量呢,还是量子集中保存的数据总量呢。
配套的LDD3给的源代码中,loff_t scull_llseek(struct file *filp, loff_t off, int whence)函数中,有这么一句话:
case 2:/*SEEK_END*/
new_pos = dev->size + off;
break;
我不明白数据总量加上一个偏移地址怎么就能查找到末尾。
最后一个问题,在read函数中ssize_t scull_read(struct file *filp, char __user *buf, size_t count, off_t *f_pos)
{
quantum = filp->private_data->quantum;
qset = filp->private_data->qset;
itemsize = quantum * qset;
size = filp->private_data->size;
if (down_interruptible(&dev->sem))
return -ERESTARTSYS;
if (*f_pos >= dev->size)
goto out;
if (*f_pos + count > dev->size)
count = dev->size - *f_pos;
/* find listitem, qset index, and offset in the quantum */
item = (long)*f_pos / itemsize;
rest = (long)*f_pos % itemsize;
}
根据我的理解,itemsize指的是整个量子集的大小,亦即itemsize = 1000 * 4000,而size指的是数据总量,不管是单个量子的数据总量还是量子集中的数据总量,总应该小于量子集的大小的,亦即size <= itemsize.
根据 if (*f_pos >= dev->size) goto out;判断出,正常情况下*f_pos总应该小于size的,即*f_pos < size < itemsize。那么下面的语句item = (long)*f_pos / itemsize;得出的值就应该总为0,这句话就没意义了啊。
我的基础实在太差,求一起懂得的网友能够给我指点迷津呢 |
|