在前面几个小节分析了do_sys_open相关的几个接口,但这样没头没脑的分析,不利于我们
了解do_sys_open接口,因此本小节主要先总体说明do_sys_open实现的功能,然后再对每一个小模块进行介绍(本次代码分析基于linux3.10)。
do_sys_open实现功能的说明:
1.首先调用get_unused_fd_flags,在该进程空间中,获取一个尚未使用的fd,若获取成功,则继续向下执行,并确认是否需要扩展task->files->fdt的内存;若当前进程已打开的文件数超过限制,则返回失败。
2.若成功获取一个尚未使用的fd,则调用do_filp_open进行后续的操作,而do_filp_open则直接调用path_openat进行后续操作
3.在path_openat中,主要包含如下几部分:
a.调用get_empty_filp接口,申请一个文件描述符指针
b.进行路径查找时需要借助结构体struct nameidata类型的变量存储查找过程相关的dentry变量、路径名、inode节点等信息,因此需要调用path_init接口用于初始化struct nameidata类型的变量,并设置路径查找的类型(根路径查找、当前路径查找等)
C.调用link_path_walk接口,进行路径的查找,执行完该接口后,若查找成功,其返回打开文件的父目录的dentry、inode等变量值
d.当查找路径成功后,则调用do_last进行文件的打开,若打开的文件为一个链接文件则do_last直接返回,由path_openat中的接下来的函数调用follow_link接口,对链接文件对应的target文件路径进行查找,并返回查找文件的父目录对应的dentry、inode,接着调用do_last进行文件的打开操作。
4.若第三步完成了文件的打开操作,则将该打开文件对应的文件描述符与fd进行关联,即
task->files->fdt[fd]=filep。
以上4步即为文件打开所需要执行的主要内容,通过这些操作,完成了文件描述符与dentry、inode、filesystem、进程描述符等变量的关联,即将文件与进程关联起来。接下来详细分析
本文暂时没有评论,来添加一个吧(●'◡'●)