免费注册 查看新帖 |

Chinaunix

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

驱动中poll_wait()函数的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-19 09:47 |只看该作者 |倒序浏览
应用程序的select()系统调用,调用驱动中的poll()方法。
不理解的是在下面的poll()方法实现中,首先调用poll_wait将等待队列添加到wait结构中,接下来是个判断语句  
if (dev->rp != dev->wp)
                mask |= POLLIN | POLLRDNORM;  /* readable */
只考虑可读情况。如果这个if语句的条件不满足,那么就不会返回可读,也就是返回0。那么在这里怎么实现阻塞的呢?也就是说如果在应用的select()系统中,指定一个等待时间,在这个等待时间里如果没有描述符可读,就一直阻塞。那个这个等待时间是怎么和驱动中的poll()方法联系起来的呢?如果要修改这个poll()方法怎么修改呢?还有在poll()方法中,怎么指定描述符集中的哪一个是可读的呢?简单的返回POLLIN | POLLRDNORM,是无法指定是哪一个描述符可读的呀?
               
static unsigned int scull_p_poll(struct file *filp, poll_table *wait)
{
        struct scull_pipe *dev = filp->private_data;
        unsigned int mask = 0;

        /*
        * The buffer is circular; it is considered full
        * if "wp" is right behind "rp" and empty if the
        * two are equal.
        */
        down(&dev->sem);
        poll_wait(filp, &dev->inq,  wait);
       // poll_wait(filp, &dev->outq, wait);
        if (dev->rp != dev->wp)
                mask |= POLLIN | POLLRDNORM;  /* readable */
        //if (spacefree(dev))
        //        mask |= POLLOUT | POLLWRNORM;  /* writable */
        up(&dev->sem);
        return mask;
}

论坛徽章:
0
2 [报告]
发表于 2006-07-19 10:14 |只看该作者
在调用驱动程序的poll之前,实现调用VFS相关的poll接口的(比如sys_poll等),阻塞、等待时间等的实现是在那个里面完成的

论坛徽章:
0
3 [报告]
发表于 2006-07-19 10:28 |只看该作者
那么驱动的这个poll()方法总是立刻返回的?

论坛徽章:
0
4 [报告]
发表于 2006-07-19 10:49 |只看该作者
对啊

论坛徽章:
0
5 [报告]
发表于 2006-07-19 11:07 |只看该作者
是立刻返回的,那么如果有一个描述符集当前不可读,也就返回0。但等了一段时间后可读,那么怎么返回mask |= POLLIN | POLLRDNORM;。我的意思是怎么指示给应用程序可读的呢?
那么驱动的poll()方法的作用是什么呢?

论坛徽章:
0
6 [报告]
发表于 2006-07-19 11:19 |只看该作者
如果当前不可读,那么在sys_poll->do_poll中当前进程就会睡眠在等待队列上,这个等待队列是由驱动程序提供的(就是poll_wait中传入的那个)。当可读的时候,驱动程序可能有一部分代码运行了(比如驱动的中断服务程序),那么在这部分代码中,就会唤醒等待队列上的进程,也就是之前睡眠的那个,当那个进程被唤醒后do_poll会再一次的调用驱动程序的poll函数,这个时候应用程序就知道是可读的了。

不知道有没有解释清楚啊,呵呵

论坛徽章:
0
7 [报告]
发表于 2006-07-19 11:24 |只看该作者
非常感谢。

论坛徽章:
0
8 [报告]
发表于 2006-07-19 12:30 |只看该作者
POOL方法就是用来支持非阻塞式的访问,当然是立即返回,但是它会把这次请求放入一个等待队列中,当某个条件满足时,内核会通知应用程序(应用程序的select函数会感知),然后就会接着select操作

论坛徽章:
8
2015年辞旧岁徽章
日期:2015-03-03 16:54:15午马
日期:2015-02-04 12:00:07羊年新春福章
日期:2015-02-04 11:57:56双子座
日期:2014-12-02 11:44:59金牛座
日期:2014-10-08 16:47:08狮子座
日期:2014-08-29 13:37:46巳蛇
日期:2014-08-26 17:32:29NBA常规赛纪念章
日期:2015-05-04 22:32:03
9 [报告]
发表于 2009-12-12 16:17 |只看该作者

回复 #6 siasd 的帖子

谢谢楼上分析的很透彻

论坛徽章:
0
10 [报告]
发表于 2010-05-25 23:40 |只看该作者
谢谢siasd的解释.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP