内核Poll机制

Poll机制

Poll机制引入

休眠-唤醒机制来等待某个事件产生。完全取决的外部事件,可能等待的时间可能太长。为了避免等待时间过长,

增加超时时间,就是对应的poll机制。

具体流程:

使用poll机制,查询驱动程序是否有数据。

进入内核态,如果有数据,立刻返回

如果当时驱动中没有数据,内核程序进入休闲状态。

如果按键按下,驱动程序的中断被调用,记录数据,唤醒休眠程序,在调用read函数。

但是时间如果超时,也会唤醒内核态休眠的程序。

根据poll返回的值,判断是否有数据,然后调用对应的函数:read函数。

Poll流程

 

 

Poll机制执行说明:

App执行poll函数,进入内核态,调用drv_poll函数。

如果此时没有驱动数据,drv_poll把任务挂入等待队列wq。等中断发生或者超时时间到达,去唤醒该任务,判断有无驱动数据,然后返回用户空间。

没有数据,休眠一会,在休眠过程中中断发生,任务被唤醒,返回用户空间。

超时时间一到,任务被唤醒,判断有否数据,并返回用户空间。

在用户空间,根据poll返回的数值,判断是否读取read函数看,获取底层产生的硬件数据。

注意事项

drv_poll是把任务挂入到队列wq。不是在drv_poll中进入休眠,在drv_poll之后进入休眠

app调用poll,有机会调用drv_poll函数2次

任务被唤醒有2种:1.中断唤醒。2 超时时间到达。

App根据drv_poll返回的数,判断是否调用read函数。

drv_poll函数功能

把当前任务挂入wq

poll_wait:把任务挂入到等待队列。

返回设备状态:

App调用poll,用的参数:与没有数据可以读:POLLIN。有没有空间可以写数据:POLLOUT。

drv_poll需要返回自己的状态:POLLIN或者POLLOUT。

监控类型:

事件类型

说明

POLLIN

有数据可读

POLLRDNORM

等同于POLLIN

POLLRDBAND

Priority band data can be read,有优先级较较高的“band data”可读

Linux系统中很少使用这个事件

POLLPRI

高优先级数据可读

POLLOUT

可以写数据

POLLWRNORM

等同于POLLOUT

POLLWRBAND

Priority data may be written

POLLERR

发生了错误

POLLHUP

挂起

POLLNVAL

无效的请求,一般是fd未open

 

posted @ 2022-07-28 21:47  JwChu  阅读(221)  评论(0编辑  收藏  举报