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

时间:2015-03-24 03:56:38

标签: linux linux-kernel vfs

可以总结一下我尝试执行read()/ write()系统调用时发生的事件/步骤。内核如何知道发出这些命令的文件系统。

让我们说一个进程调用write()。 然后它将调用sys_write()。

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

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

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

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

请帮忙。

2 个答案:

答案 0 :(得分:13)

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

  1. 调用read的{​​{1}}的Syscall处理程序。它接收文件描述符(整数)作为参数,并调用fs/read_write.c:620将其转换为fdget_pos
  2. struct fd致电fdget_pos来电__fdget_pos来电__fdget__fget_light使用__fget_light(当前进程的文件描述符表)来查找与传递的文件描述符编号对应的current->files
  3. 返回系统调用处理程序,文件结构将传递到struct filevfs_read
  4. fs/read_write.c:478调用vfs_read,调用__vfs_read。从此处开始,您将使用特定于文件系统的代码。
  5. 所以VFS并不会真正打扰"识别"文件所在的文件系统;它只是使用"文件操作表"函数指针存储在file->f_op->read中。初始化struct file时,会给出正确的struct file函数指针表,该表实现其文件系统的所有特定于文件系统的操作。

答案 1 :(得分:0)

每个文件系统都将自己注册到VFS。安装文件系统时,将读取其超级块,并使用此信息填充VFS超级块。此时还会填充此文件系统的函数指针表。当file-> f_op->读取调用发生时,实际调用来自文件系统的注册函数。您可以参考http://www.science.unitn.it/~fiorella/guidelinux/tlk/node102.html

中的文字