字符设备驱动的poll机制

引入poll机制可以减少cpu资源占用

由于之前的中断程序是通过不停的查询实现的,现在引入poll机制可以让中断程序进行休眠,而不是一直处于查询状态,让cpu资源占用率降低
在用户层上,使用poll或select函数时,和open、read那些函数一样,也要进入内核sys_poll函数里
字符设备驱动的poll机制

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 调用传入的时间到达。

如何在代码中加入poll机制

在驱动程序中

  1. 在file_operation 结构体里加入poll

  2. 字符设备驱动的poll机制

  3. 生成一个等待队列static DECLARE_WAIT_QUEUE_HEAD(button_waitq);
    字符设备驱动的poll机制

  4. 实现自己的poll函数

  5. 字符设备驱动的poll机制

  6. 加入之前的消息队列

  7. 字符设备驱动的poll机制

  8. 唤醒队列里的进程