LDD3有关字符驱动
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
ldd3中,这个访问的位置要定位量子集,以及该量子集中的偏移。
复制代码
后面的就比较简单了,我就不说了,呵呵。蓝豆兄研究得很细致啊