字符设备驱动的poll机制

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

由于之前的中断程序是通过不停的查询实现的,现在引入poll机制可以让中断程序进行休眠,而不是一直处于查询状态,让cpu资源占用率降低
在用户层上,使用poll或select函数时,和open、read那些函数一样,也要进入内核sys_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. 在这里插入图片描述

  3. 生成一个等待队列static DECLARE_WAIT_QUEUE_HEAD(button_waitq);
    在这里插入图片描述

  4. 实现自己的poll函数

  5. 在这里插入图片描述

  6. 加入之前的消息队列

  7. 在这里插入图片描述

  8. 唤醒队列里的进程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值