好吧,当我们在用户空间中对某些fds进行轮询时,fds属于正在打开的设备节点(设备文件)。数据如何到达该设备文件以及内核空间中的数据如何进入用户空间?
答案 0 :(得分:0)
当为某个文件描述符调用poll()时,在内核空间中调用向文件操作结构注册的相应设备poll_xyx()方法。 然后,此方法检查数据是否随时可用,如果此条件为真,则设置事件掩码并且轮询返回到用户空间。 用户空间应用程序检查事件掩码并了解数据是否已准备好进行处理。因此,用户空间应用程序现在调用文件描述符上的read(),从而调用在内核空间中向文件操作结构注册的设备read_xyz()方法。此方法使用copy_to_user()或put user()将内核空间中的数据复制到用户应用程序传递的缓冲区。
但是,如果在数据不可用时调用poll(),则进程将在等待队列中进入休眠状态。当数据到达时,驱动程序唤醒在函数poll_schedule_timeout()内的等待队列上休眠的进程。在唤醒应用程序之后,继续进行上述相同的过程。