调用流程
应用层调用poll时,内核调用了sys_poll
在sys_poll中首先初始化,判断了nfds是超过struct file支持的最大的fd数(默认256),将传入的timeout时间转化为cpu时钟周期,并且调用了poll_initwait初始化了一个函数指针,用于操作系统异步回调的;
接下来,进行了一个while循环,从0到nfds给每一个struct pollfd对象开辟内存,是以链表节点poll_list大小开辟的(一个链表节点是一个page,链表节点中有struct pollfd结构),然后将用户空间的pollfd拷贝到链表节点中,再将链表节点连接起来。
出了循环所有的pollfd事件用poll_list链接起来了,然后调用do_poll进行处理。
对于do_poll分析