Linux 如何识别要执行系统调用的特定文件系统



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

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

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

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

编辑:现在亚历克斯已经描述了流程...我仍然怀疑读/写是如何路由到 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来查找与传递的文件描述符编号对应的struct file
  3. 回到系统调用处理程序中,文件结构被传递给vfs_readfs/read_write.c:478
  4. vfs_read调用__vfs_readfile->f_op->read 调用。从这里开始,您将处于特定于文件系统的代码中。

因此,VFS并没有真正费心"识别"文件所在的文件系统;它只是使用存储在其struct file中的"文件操作"函数指针表。初始化该struct file时,会为其提供正确的f_op函数指针表,该表为其文件系统实现所有特定于文件系统的操作。

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

相关内容

最新更新