首页 > 代码库 > Linux文件系统4--打开文件

Linux文件系统4--打开文件

1.前言

本文所述关于文件管理的系列文章主要是对陈莉君老师所讲述的文件系统管理知识讲座的整理。

Linux可以支持不同的文件系统,它源于unix文件系统,也是unix文件系统的一大特色。

本文将以不同文件系统之间的拷贝为实例进行讲述

2. 实例:文件拷贝

技术分享

图 不同文件系统之间的拷贝

技术分享

图 文件拷贝对应的C语言片段

3.打开文件

3.1 open函数

文件读写之前都要先打开文件,打开函数的原型如下:

技术分享

 

技术分享

3.2 打开文件的内核实现

 从整体流程来看,open的内核实现如下:

  • 进程从用户态获取路径名到内核缓冲区;

  • 然后查找到父目录;如果设置了O_CREAT标志,则继续查找路径最后一个分量

  • 最后获取对应文件的打开文件结构

  • 将这个结构与当前进程的打开文件表联系起来,返回相应的fd。

4. do_sys_open

 技术分享

4.1 do_filp_open

  • 当内核要访问一个文件时,第一步需要找到这个文件,这由do_filp_open完成。

  • 在do_filp_open的实现中,查找文件过程由path_init和link_path_walk完成。

  • 这两个函数将用户传进来的用字符串表示的文件路径,转换成一个dentry结构,建立好相应的inode,并将查找结果存储在nameidata结构中。

4.1.1 nameidata_to_filp

  •   nameidata结构体

 技术分享

技术分享

4.1.2 fd_install

技术分享

5.查找文件

技术分享

 

技术分享

 

技术分享

 5.1 dentry cache的引入

 技术分享

5.2 dentry cache的描述

技术分享

技术分享

 

技术分享

 

技术分享

 

Linux文件系统4--打开文件