; i5 |( G# n" Q; ?! z% y/ V这一节里,我们在中断的基础上添加poll机制来实现有数据的时候就去读,没数据的时候,自己规定一个时间,如果还没有数据,就表示超时时间。 9 W8 H9 l7 o$ v8 c) h5 f' u 1 Q( b) I6 ]+ R$ k" J! y$ o3 U* S" x4 r3 s; r A3 l
poll机制总结:(韦老师总结的,不是我总结的哦!)/ G0 c8 g4 f/ y- {) E [
* P* K' n9 j$ N9 Z
1. poll > sys_poll > do_sys_poll >poll_initwait,poll_initwait函数注册一下回调函数__pollwait,它就是我们的驱动程序执行poll_wait时,真正被调用的函数。 . U. A0 R2 P0 X" x" O0 r- D2 |0 b4 i' H; F9 h
2. 接下来执行file->f_op->poll,即我们驱动程序里自己实现的poll函数; r; Z2 c$ ^" a9 X8 q4 D
/ v0 S+ k! ~4 s T, W: L& d
它会调用poll_wait把自己挂入某个队列,这个队列也是我们的驱动自己定义的; * Q1 S8 Q* V* S1 ?' ^3 F1 q ) Y2 U7 q- ^: n' C 它还判断一下设备是否就绪。 : ]2 T( M* ]$ Q - r1 `+ `, U' ]* J3. 如果设备未就绪,do_sys_poll里会让进程休眠一定时间- ^5 B. G' w9 v+ O! m/ ^
5 I, g, a2 O6 ?& a2 @4 A a4. 进程被唤醒的条件有2:一是上面说的“一定时间”到了,二是被驱动程序唤醒。驱动程序发现条件就绪时,就把“某个队列”上挂着的进程唤醒,这个队列,就是前面通过poll_wait把本进程挂过去的队列。& N4 U8 t W7 F1 i$ i* I8 A