LDD3有关字符驱动

发布于 2022-09-22 10:57:42 字数 8488 浏览 9 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

羁客 2022-09-29 10:57:42

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包含了多个量子集 */

复制代码
后面的就比较简单了,我就不说了,呵呵。蓝豆兄研究得很细致啊

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文