Linux 如何读取“真实文件”和“虚拟文件”?

Pau*_*aul 3 linux filesystems proc

我发现在 Linux 中有“真实文件”和“虚拟文件”,真实文件是驻留在硬盘上的文件,而虚拟文件只是由内核表示为文件的数据。

例如,/proc目录中的文件是虚拟文件。

我想了解像这样的函数如何read()知道如何读取真实文件以及如何读取虚拟文件。我创建了下图来显示我对这个主题的理解,如果我的理解有误,请纠正我:

在此处输入图片说明

mya*_*aut 5

在 VFS 层中,所有文件都是虚拟的(它实际上是由 SunOS 工程师发明的,用于绑定 UFS(基于磁盘)和 NFS(基于网络)文件系统)。

每个 openfile都有f_op提供通用例程实现的函数表(其中一些可能是通用的),每个 open都有inode一个附加address_space对象,该对象还具有a_ops包含必要实现的 C 函数表 ( )。顺序是这样的:

  1. sys_read(): 应用程序使用系统调用启动文件读取
  2. 调用传递到 VFS 堆栈顶层 ( vfs_read())
  3. 使用file->f_op->read()do_sync_read()或将调用传递给文件系统驱动程序new_sync_read()
  4. 如果文件以直接输入输出模式打开,则适当的函数 ( a_ops->direct_IO(), ext4_direct_IO()forext4则调用 ) 并返回数据
  5. 如果在页面缓存中找到页面,则返回数据 file_get_page()
  6. 如果在页面缓存中找不到页面,则使用from驱动程序a_ops->readpage()实现的文件系统读取 它ext4_readpage()ext4
  7. VFS 堆栈使用创建块输入输出请求 submit_bio()

来自http://myaut.github.io/dtrace-stap-book/kernel/fs.html,它有点过时了,因为 VFS 堆栈在我写完这篇文章后被重构了一点