linux如何识别特定的文件系统来执行系统调用

How linux identify a particular file system to execute system call

能否总结一下当我尝试执行 read()/write() 系统调用时发生的 events/steps。内核如何知道哪个文件系统发出这些命令。

假设一个进程调用 write()。 然后它将调用 sys_write()。

现在可能,因为 sys_write() 代表当前进程执行,它可以访问 结构 task_struct 因此它可以访问结构 files_struct结构 fs_struct 包含文件系统信息。

但在那之后我没看到 fs_struct 如何帮助识别文件系统。

编辑:既然 Alex 已经描述了流程......我仍然怀疑 read/write 是如何被路由到 FS 的,因为 VFS 没有这样做,那么它一定发生在其他地方,还有底层块设备是如何连接的,最后是硬件协议PCI/USB。

涉及实际数据结构的简单流程图会有所帮助

请帮忙。

此答案基于内核版本 4.0。我找出了一些处理 read 系统调用的代码。我建议您克隆 Linux 源代码库并按照源代码进行操作。

  1. read 的系统调用处理程序在 fs/read_write.c:620 被调用。它接收一个文件描述符(整数)作为参数,并调用 fdget_pos 将其转换为 struct fd.
  2. fdget_pos 调用 __fdget_pos 调用 __fdget 调用 __fget_light__fget_light 使用 current->files,当前进程的文件描述符 table,查找与传递的文件描述符编号对应的 struct file
  3. 回到系统调用处理程序,文件结构被传递给 vfs_read,位于 fs/read_write.c:478
  4. vfs_read 调用 __vfs_read,后者调用 file->f_op->read。从这里开始,您将使用特定于文件系统的代码。

所以 VFS 并没有真正打扰 "identifying" 文件所在的文件系统;它只是使用存储在其 struct file 中的 "file operation" 函数指针中的 table。当 struct file 被初始化时,它被赋予正确的 f_op 函数指针 table,它为其文件系统实现所有特定于文件系统的操作。

每个文件系统都将自己注册到 VFS。当一个文件系统被挂载时,它的超级块被读取并且 VFS 超级块被填充这个信息。这个文件系统的函数指针 table 此时也被填充。当 file->f_op->read 调用发生时,实际上调用了文件系统中的注册函数。您可以参考http://www.science.unitn.it/~fiorella/guidelinux/tlk/node102.html

中的文字