字符设备驱动的poll机制
引入poll机制可以减少cpu资源占用
由于之前的中断程序是通过不停的查询实现的,现在引入poll机制可以让中断程序进行休眠,而不是一直处于查询状态,让cpu资源占用率降低
在用户层上,使用poll或select函数时,和open、read那些函数一样,也要进入内核sys_poll函数里
poll机制
- poll > sys_poll > do_sys_poll > poll_initwait,poll_initwait 函数注册一下回调函数__pollwait,
它就是我们的驱动程序执行 poll_wait 时,真正被调用的函数。 - 接下来执行 file->f_op->poll,即我们驱动程序里自己实现的 poll 函数
它会调用 poll_wait 把自己挂入某个队列,这个队列也是我们的驱动自己定义的;
它还判断一下设备是否就绪。 - 如果设备未就绪,do_sys_poll 里会让进程休眠一定时间
- 进程被唤醒的条件有 2:一是上面说的“一定时间”到了,二是被驱动程序唤醒。驱动程
序发现条件就绪时,就把“某个队列”上挂着的进程唤醒,这个队列,就是前面通过 poll_wait
把本进程挂过去的队列。 - 如果驱动程序没有去唤醒进程,那么 chedule_timeout(__timeou)超时后,会重复 2、3 动
作,直到应用程序的 poll 调用传入的时间到达。
如何在代码中加入poll机制
在驱动程序中
-
在file_operation 结构体里加入poll
-
-
生成一个等待队列static DECLARE_WAIT_QUEUE_HEAD(button_waitq);
-
实现自己的poll函数
-
-
加入之前的消息队列
-
-
唤醒队列里的进程