深入解析STREAMS的操作原理与机制
1. 首次打开流的操作流程
当vp->v_stream == 0时,意味着这是该流的首次打开操作。首先会进行内存检查,以确保STREAMS没有使用过多的内存。接着,会分配一个队列对和一个流头,初始化流头(stdata_t)并设置STWOPEN标志,同时让vp->v_stream指向该流头,队列对中的q_ptr字段也会指向流头。
若该vnode是一个FIFO,流头的streamtab指针(sd_strtab)会被修改,指向FIFO的streamtab结构,这将导致不同的流头处理例程被执行。
之后,使用qattach()函数将流头队列附加到驱动程序,并调用驱动程序的打开例程。任何配置为自动推入流的模块都会被推入,STREAMS提供了模块自动推入功能,管理员可以使用autopush实用程序通过sad驱动程序和特定的ioctl命令来配置模块列表,每次流首次打开时自动推入。
最后,清除STWOPEN标志,并唤醒在流头等待的进程。
2. 打开克隆设备的步骤
STREAMS克隆设备每次打开时会自动生成其次要设备号