Linux 内核文件系统与设备操作流程分析(14) // // 如果 open 函数有效那么则先锁定内核,调用此方法后 // 再解锁内核 // if (filp->f_op->open) { lock_kernel(); ret = filp->f_op->open(inode,filp); unlock_kernel(); } if (ret) cdev_put(p); return ret; }
到这里我们可以知道,对文件或设备驱动的判断与函数集的赋值都是在文件 系统这一级区分的,也就是说在有 open 操作时是到具体的文件系统,如 ext3,并在 ext3 上再次区分出是否为设备驱动,这点很好理解,因为设备 驱动也是以文件形式存在的。分析到这里可以算是把对设备驱动的操作流程 弄清晰了。但这仅是对设备驱动的操作,别忘了上面还存在一大堆的疑问, 我们知道只有在触发调用了 ext3_read_inode() 时才会区分,那么它何时 被调用的?什么情况下调用的?为什么 ext3 的文件操作集中的 open 是 空操作呢?要解答这些问题,我们仍要从 open_namei() 函数开始进行分析。