免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2433 | 回复: 5
打印 上一主题 下一主题

[学习分享] LDD3第二章中scull_dev的问题,求指教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-12 11:31 |只看该作者 |倒序浏览
本帖最后由 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,这句话就没意义了啊。

我的基础实在太差,求一起懂得的网友能够给我指点迷津呢

scull.rar

16.98 KB, 下载次数: 0

论坛徽章:
0
2 [报告]
发表于 2012-10-13 16:13 |只看该作者
等待高手了。。。

论坛徽章:
0
3 [报告]
发表于 2012-10-16 15:08 |只看该作者
帮顶一下吧,这个是否要放到程序设计=》内核源码板块?

论坛徽章:
0
4 [报告]
发表于 2012-10-16 16:57 |只看该作者
dev->size 记录当前有效数据的长度, 应该是实际写入的长度了。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-06 06:20:00
5 [报告]
发表于 2012-10-16 18:45 |只看该作者
看帖就得回,不回就是不厚道!!

论坛徽章:
0
6 [报告]
发表于 2013-01-22 10:43 |只看该作者
itemsize=quantum×qset,是一个量子集scull_qset的大小,也就是第一个链表的大小(不是整个量子集)。有好多链表呢。所以*f_ops/itemsize是第几个链表,*f_ops%itemsize是上面判断出来的链表内的具体位置。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP