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

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

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

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

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

在此输入图像描述

答案1

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

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

  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()for ext4)并返回数据
  5. 如果在页面缓存中找到页面,则返回数据 file_get_page()
  6. 如果在页面缓存中找不到页面,则使用从文件系统读取该页面 a_ops->readpage(),这是由ext4_readpage()from ext4driver实现的
  7. VFS 堆栈使用以下命令创建块输入输出请求submit_bio()

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

答案2

我不会以任何方式对此给出详尽的答案......

你基本上是正确的,除了一个重要的分离:读()问道核心文件描述符包含什么核心处理其余的事情。无论是物理文件系统、网络文件系统、虚拟文件系统(/proc、/sys、...)都与读()。内核有底层代码来服务请求(或不服务),这就是您所说的驱动程序。

相关内容