ok6410学习笔记(7.poll驱动设计)

本节难点:

1. 理解内核信号量,阻塞型设备驱动,poll之间的关系,其实三者之间的关系并不矛盾,可以一起使用。可以把信号量放到阻塞设备驱动下层,等待条件成立后再去申请信号量。poll是对多个文件进行监控,如果只用阻塞型设备驱动的话,有一个文件不能读写,整个进程就挂起了。如果用poll只要有一个能读写,进程就可以正常进行,然后再用阻塞型设备驱动去处理。
2.select和poll函数之间参数传递
3.select和do_select的内核源码

本节知识点:

细节知识点:

1.select就是多通道查看 阻塞设备驱动的阻塞条件是否符合的。
2.select找到do_select,do_select实现两个任务,一个是poll的实现,另一个是处理各种文件集和等待时间,然后实现阻塞。select的参数是传递给do_select的,poll的参数是来自do_select的。根据内核代码Select.c文件中的do_select函数可知,根据poll返回的掩码判断是否进入阻塞。
3.do_select   通过不同文件的struct file  找到不同文件的poll  把每一个设备文件都分别通过poll_wait把对应的等待队列添加到poll_table  *wait中,根据 读写条件(即是阻塞驱动那块的那个条件参数)返回掩码mask,如果文件都不符合就根据*wait进行阻塞(阻塞的是调用select的应用层进程)。

重点函数:

1.select系统调用:select(maxfdp, &rfds, &wfds, NULL, &time)  maxfdp比最大的文件描述符大1,rfds读文件集,wfds写文件集,ex异常文件集,time定时器,当给timeval结构体中的time赋值为0的时候,不管是否有文件满足要求,都不阻塞马上返回,无文件满足返回0,有文件满足返回正值。当timeval结构体指针为NULL的时候,select直接进入阻塞,直到某个文件满足要求。time赋值为一个正值的时候,就是等待的最长时间。(有三种方结束阻塞,1有文件满足了,2有信号来终止阻塞,3time时间到了)。 但是还是不明白,第四个参数被监控异常的文件集
2.select常用宏:FD_SET(文件描述符,文件集)   将文件描述符添加到对应文件集中去,FD_CLR将对应文件描述符从对应的文件集中清除   FD_ZERO清空文件集   FD_ISSET在调用select后判断是那个文件可读或者可写。
3.poll_wait(struct file *fp,&dev->inq,wait)   将等待队列inq添加到poll_table *wait中
4.几个常用的掩码:掩码都是unsigned int型的   POLLIN可读  POLLRDNORM 数据可读   POLLOUT可写   POLLWRNORM数据可写  一般可读和数据可读连用。

驱动结构:

select结构:
1.FD_ZERO先将文件集清零
2.FD_SET往文件集中写入数据
3.调用select并给select的各个参数赋值
4.FD_ISSET检查文件是否可读可写
poll结构:
1.poll_wait把文件的等待队列加入*wait
2.最重要的一部分,判断阻塞条件,返回掩码

最后PS:电脑系统崩了   练习先不做了

你可能感兴趣的:(ok6410学习笔记(7.poll驱动设计))