免费注册 查看新帖 |

Chinaunix

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

[驱动] 新手,驱动代码看不懂 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-01 14:07 |只看该作者 |倒序浏览
本帖最后由 xshenpan 于 2014-12-01 14:07 编辑

正在看《linux设备驱动开发详解》 宋宝华 写的
看到代码有些疑问,代码如下,问题就是顶格用双斜线“//"注释的地方

  1. static ssize_t globalfifo_read(struct file *filp,char __user *buf,size_t count,loff_t *ppos)
  2. {
  3.         int ret = 0;
  4.         struct globalfifo_dev *dev = filp->private_data;
  5.         /* 定义等待队列 */
  6.         DECLARE_WAITQUEUE(wait,current);
  7.         /* 获得信号量 */
  8.         down(&dev->sem);
  9.         /* 进入读等待队列头 */
  10.         add_wait_queue(&dev->r_wait,&wait);
  11.         /* 等待FIFO有数据(非空)*/
  12.         while(dev->current_len == 0){
  13.                 /* 如果是以非阻塞方式访问则返回 */
  14.                 if(filp->f_flags & O_NONBLOCK){
  15.                         ret = -EAGAIN;
  16.                         goto out;
  17.                 }
  18.                 /* 将进程改为睡眠态,可被信号打断,此时进程还未睡眠 */
  19.                 __set_current_state(TASK_INTERRUPTIBLE);
  20.                 /* 在睡眠之前释放信号量,以免发生死锁 */
  21. // 如果在调用schedule之前发生了进程切换会怎样
  22.                 up(&dev->sem);
  23.                 /* 进行进程调度 */
  24.                 schedule();
  25.                 /* 在调用完schedule之后,进程已经睡眠 */
  26.                 /* 如果进程被信号** */
  27.                 if(signal_pending(current)){
  28.                         ret = -ERESATRTSYS;
  29.                         goto out2;
  30.                 }
  31.                 /* 否则,则不是被信号**,而全局内存区有数据了 */
  32.                 /* 此时,要获取信号量 */
  33. // 这句能否放在循环外面
  34.                 down(&dev->sem);       
  35.         }
  36.        
  37. //        down(&dev->sem);

  38.         /* 如果想要得到的长度大于了当前长度 */
  39.         if(count > dev->current_len)
  40.                 count = dev->current_len;
  41.                
  42.         if(copy_to_user(buf,(void*)(dev->mem),count)){
  43.                 ret = -EFAULT;
  44.                 goto out;
  45.         }
  46.         else{
  47.                 /* 将内存空间的数据前移到dev->mem位置 */
  48.                 memcpy(dev->mem,dev->mem+count,dev->current_len - count);
  49.                 dev->current_len -= count;
  50.                 printk(KERN_INFO"read %d bytes(s),current len %d\n",count,dev->current_len);
  51.                 /* 此时,读走了数据则mem空间不是满的了,可以**写进程 */
  52.                 wake_up_interruptible(&dev->w_wait);
  53.                 ret = count;
  54.         }
  55.         out:up(&dev->sem);
  56.         /* 这里移除的是写等待队列,当读进程被**时
  57.         肯定被写进程移除了读等待队列 */
  58.         out2:remove_wait_queue(&dev->w_wait,&wait);
  59. // 为什么要在这里才改变状态,能不能在前面改变
  60.         set_current_state(TASK_RUNNING);
  61.         return ret;
  62. }
复制代码
还请帮忙看下我写的注释对吗?

感觉驱动学的一头雾水,,不知道这些驱动为什么要这样写
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP