linux字符设备驱动-poll机制笔记
来源:互联网 发布:金手指考试软件下载 编辑:程序博客网 时间:2024/05/05 09:13
一、开发环境
1、内核:Linux 2.6.22.6;
2、JZ2440
3、ubuntu 9.10
二、poll增加过程
Poll就是监控文件是否可读的一种机制,作用与select一样。
应用程序的调用函数如下:
int poll(struct pollfd *fds,nfds_t nfds, int timeout);
Poll机制会判断fds中的文件是否可读,如果可读则会立即返回,返回的值就是可读fd的数量,如果不可读,那么就进程就会休眠timeout这么长的时间,
然后再来判断是否有文件可读,如果有,返回fd的数量,如果没有,则返回0。
1、在定义的file_operations类型结构体中增加.poll的支持。即增加.poll=xxx_poll。xxx_poll是函数名,可以任意。
2、实现xxx_poll函数。
xxx_poll函数中主要调用的函数就是poll_wait函数。其原型为:
static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
这个函数中 p->qproc(filp, wait_address, p);p->qproc在init_poll_funcptr()中被赋值为__poll_wait。即实现__poll_wait(filp, wait_address, p),__poll_wait函数实现将当前进程挂到wait_address队列中。
3、应用调用poll函数时,系统会调用fs/select.c文件中的sys_poll函数,这个函数会调用do_sys_poll函数,do_sys_poll函数会调用do_poll函数,在do_poll函数中有
__timeout = schedule_timeout(__timeout);
这才是真正的休眠函数。
三、poll机制架构
1、系统调用poll或select,对应的内核函数都是sys_poll,sys_poll位于fs/select.c文件中。
sys_poll()->
do_sys_poll()->
poll_initwait() //参数(&table)初始化了table
do_poll() -> //参数(nfds, head, &table, timeout)重要的设置、休眠在这里实现
do_pollfd() //mask = file->f_op->poll(file, pwait)把写的驱动函数赋值给poll
schedule_timeout() // 休眠函数,判断参数if (count || !*timeout || signal_pending(current))
//不成立则休眠
do_poll函数中有一个死循环,在里面用do_pollfd函数去调用驱动中的poll函数(fds中每个成员的字符驱动程序都会被扫描到),驱动程序中的Poll函数的工作有两个,一个就是调用poll_wait 函数,把进程挂到等待队列中去(这个是必须的,你要睡眠,必须要在一个等待队列上面,否则到哪里去唤醒你呢??),另一个是确定相关的fd是否有内容可读,如果可读,就返回1,否则返回0。如果返回1,do_poll函数中的count++。接下来在do_poll函数中会判断三个条件(if (count ||!timeout || signal_pending(current))),决定是否跳出死循环。如果成立就直接跳出;否则,就睡timeout个jiffes这么长的时间(调用schedule_timeout实现睡眠)。
这三个条件之一就是刚才的count,可见如果相关的fd可读,程序就会跳出do_poll函数,停止睡眠。其他两个条件:一是,如果在timeout这段时间内没有其他进程去唤醒它,那么第二次执行判断的时候就会跳出死循环。二是,如果在这段时间内有其他进程唤醒它,那么也可以跳出死循环返回(例如我们可以利用中断处理函数去唤醒它,这样的话一有数据可读,就可以让它立即返回)。
可见,驱动程序里与poll相关的地方有两处:一是构造file_operation结构时,要定义自己的poll函数。二是通过poll_wait来调用上面说到的__pollwait函数,
2、韦视频截图
- linux字符设备驱动-poll机制笔记
- LINUX字符设备驱动2------POLL机制
- Linux字符设备驱动之poll机制
- 字符设备驱动--POll机制
- 字符设备驱动-poll机制
- 字符设备之笔记-Poll机制分析
- 嵌入式linux:字符设备驱动-----按键驱动(中断+poll机制)
- linux设备驱动之POLL机制
- 字符设备驱动-----按键驱动(中断+poll机制)
- 字符设备驱动-----按键驱动(中断+poll机制)
- 高级字符设备驱动-Poll设备方法笔记
- linux设备驱动开发-高级字符设备操作poll
- linux 设备驱动笔记 - 字符设备驱动
- linux字符驱动之poll机制按键驱动
- linux字符驱动之poll机制按键驱动
- linux字符驱动之poll机制按键驱动
- linux字符驱动之poll机制GPIO状态监测驱动
- linux字符驱动之poll机制按键驱动
- openssl以及加密
- JavaSE 学习参考:构造方法
- proc_open(): fork failed errors
- #新手常见问题:Eclipse代码提示不出来的问题。
- 【网络】TCP中的四个计时器
- linux字符设备驱动-poll机制笔记
- Mockito 入门篇的
- C结构体基础
- Round A APAC Test 2017 Problem B.Rain
- 关于 Java 中 finally 语句块的深度辨析
- hdu 6016 Count the Sheep
- 图像的稀疏表示——ScSPM和LLC的总结
- 一手掌握chrome断点调试
- Android View 源码解析(一)