linux polkit(Linux poll机制详细讲解)
所有的系统调用 ,基于都可以在它的名字前加上“sys_ ”前缀 ,这就是它在内核中对应的函数 。比如系统调用open 、read 、write 、poll ,与之对应的内核函数为:sys_open 、sys_read 、sys_write 、sys_poll 。
一 、内核框架:
对于系统调用poll或select ,它们对应的内核函数都是sys_poll 。分析sys_poll ,即可理解poll机制 。
1.
sys_poll函数位于fs/select.c文件中 ,代码如下:
它对超时参数稍作处理后 ,直接调用do_sys_poll 。
2.
do_sys_poll函数也位于位于fs/select.c文件中 ,我们忽略其他代码:
poll_initwait函数非常简单 ,它初始化一个poll_wqueues变量table:
poll_initwait > init_poll_funcptr(&pwq->pt, __pollwait); > pt->qproc = qproc;
即table->pt->qproc = __pollwait ,__pollwait将在驱动的poll函数里用到 。
3.
do_sys_poll函数位于fs/select.c文件中 ,代码如下:
分析其中的代码 ,可以发现,它的作用如下:
①从02行可以知道 ,这是个循环 ,它退出的条件为:
a. 09行的3个条件之一(count非0,超时 、有信号等待处理)
count顺0表示04行的do_pollfd至少有一个成功 。
b. 11 、12行:发生错误
②重点在do_pollfd函数 ,后面再分析
③第30行 ,让本进程休眠一段时间 ,注意:应用程序执行poll调用后 ,如果①②的条件不满足 ,进程就会进入休眠 。那么 ,谁唤醒呢?除了休眠到指定时间被系统唤醒外 ,还可以被驱动程序唤醒──记住这点 ,这就是为什么驱动的poll里要调用poll_wait的原因 ,后面分析 。
4.
do_pollfd函数位于fs/select.c文件中 ,代码如下:
可见 ,它就是调用我们的驱动程序里注册的poll函数 。
二 、驱动程序:
驱动程序里与poll相关的地方有两处:一是构造file_operation结构时 ,要定义自己的poll函数 。二是通过poll_wait来调用上面说到的__pollwait函数,pollwait的代码如下:
p->qproc就是__pollwait函数 ,从它的代码可知 ,它只是把当前进程挂入我们驱动程序里定义的一个队列里而已 。它的代码如下:
执行到驱动程序的poll_wait函数时,进程并没有休眠 ,我们的驱动程序里实现的poll函数是不会引起休眠的。让进程进入休眠 ,是前面分析的do_sys_poll函数的30行“__timeout = schedule_timeout(__timeout) ” 。
poll_wait只是把本进程挂入某个队列 ,应用程序调用poll > sys_poll > do_sys_poll > poll_initwait ,do_poll > do_pollfd > 我们自己写的poll函数后 ,再调用schedule_timeout进入休眠 。如果我们的驱动程序发现情况就绪 ,可以把这个队列上挂着的进程唤醒。可见 ,poll_wait的作用 ,只是为了让驱动程序能找到要唤醒的进程 。即使不用poll_wait ,我们的程序也有机会被唤醒:chedule_timeout(__timeout) ,只是休眠__time_out这段时间 。
现在来总结一下poll机制:
1. poll > sys_poll > do_sys_poll > poll_initwait ,poll_initwait函数注册一下回调函数__pollwait ,它就是我们的驱动程序执行poll_wait时,真正被调用的函数 。
2. 接下来执行file->f_op->poll ,即我们驱动程序里自己实现的poll函数
它会调用poll_wait把自己挂入某个队列 ,这个队列也是我们的驱动自己定义的;
它还判断一下设备是否就绪 。
3. 如果设备未就绪,do_sys_poll里会让进程休眠一定时间
4. 进程被唤醒的条件有2:一是上面说的“一定时间 ”到了 ,二是被驱动程序唤醒 。驱动程序发现条件就绪时 ,就把“某个队列 ”上挂着的进程唤醒 ,这个队列 ,就是前面通过poll_wait把本进程挂过去的队列 。
5. 如果驱动程序没有去唤醒进程 ,那么chedule_timeout(__timeou)超时后 ,会重复2 、3动作 ,直到应用程序的poll调用传入的时间到达 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!