免费注册 查看新帖 |

Chinaunix

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

LDD3有关字符驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-12 14:03 |只看该作者 |倒序浏览
292 ssize_t scull_read(struct file *filp, char __user *buf, size_t count,
293                 loff_t *f_pos)
294 {
295         struct scull_dev *dev = filp->private_data;
296         struct scull_qset *dptr;        /* the first listitem */
297         int quantum = dev->quantum, qset = dev->qset;
298         int itemsize = quantum * qset; /* how many bytes in the listitem */
299         int item, s_pos, q_pos, rest;
300         ssize_t retval = 0;
301
302         if (down_interruptible(&dev->sem))
303                 return -ERESTARTSYS;
304         if (*f_pos >= dev->size)
305                 goto out;
306         if (*f_pos + count > dev->size)
307                 count = dev->size - *f_pos;
308
309         /* find listitem, qset index, and offset in the quantum */
310         item = (long)*f_pos / itemsize;
311         rest = (long)*f_pos % itemsize;
312         s_pos = rest / quantum; q_pos = rest % quantum;
313
314         /* follow the list up to the right position (defined elsewhere) */
315         dptr = scull_follow(dev, item);
316
317         if (dptr == NULL || !dptr->data || ! dptr->data[s_pos])
318                 goto out; /* don't fill holes */
319
320         /* read only up to the end of this quantum */
321         if (count > quantum - q_pos)
322                 count = quantum - q_pos;
323
324         if (copy_to_user(buf, dptr->data[s_pos] + q_pos, count)) {
325                 retval = -EFAULT;
326                 goto out;
327         }
328         *f_pos += count;
329         retval = count;
330
331   out:
332         up(&dev->sem);
333         return retval;
334 }
335


其中的line:310---line:316的那几个变量是什么意思?看着有点晕,劳驾哪位给讲讲,先谢了

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-09-12 14:17 |只看该作者
ldd3中,这个访问的位置要定位量子集,以及该量子集中的偏移。

  1.           /* find listitem, qset index, and offset in the quantum */
  2. 310         item = (long)*f_pos / itemsize; /* 定位item链,即该f_pos 在哪一个链中 */
  3. 311         rest = (long)*f_pos % itemsize; /* 定位该f_pos 在item链中的偏移 */
  4. 312         s_pos = rest / quantum; q_pos = rest % quantum; /* 定位特定量子集以及在该量子集中的偏移 */
  5.                 /* 注意,一个item包含了多个量子集 */
复制代码

后面的就比较简单了,我就不说了,呵呵。蓝豆兄研究得很细致啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP