可以总结一下我尝试执行read()/ write()系统调用时发生的事件/步骤。内核如何知道发出这些命令的文件系统。
让我们说一个进程调用write()。 然后它将调用sys_write()。
现在可能,因为sys_write()代表当前进程执行,它可以访问 struct task_struct ,因此它可以访问 struct files_struct 和 struct fs_struct ,其中包含文件系统信息。
但之后我没有看到, fs_struct 如何帮助识别文件系统。
编辑:既然Alex已经描述了流程......我仍然怀疑读/写如何被路由到FS,因为VFS没有这样做,那么它必须在其他地方发生,也是如何底层块设备,然后最终硬件协议PCI / USB连接。
涉及实际数据结构的简单流程图会很有帮助
请帮忙。
答案 0 :(得分:13)
此答案基于内核版本4.0。我找出了一些处理read
系统调用的代码。我建议您克隆Linux源代码库,然后在源代码中进行操作。
read
的{{1}}的Syscall处理程序。它接收文件描述符(整数)作为参数,并调用fs/read_write.c:620
将其转换为fdget_pos
。struct fd
致电fdget_pos
来电__fdget_pos
来电__fdget
。 __fget_light
使用__fget_light
(当前进程的文件描述符表)来查找与传递的文件描述符编号对应的current->files
。struct file
,vfs_read
。fs/read_write.c:478
调用vfs_read
,调用__vfs_read
。从此处开始,您将使用特定于文件系统的代码。所以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
中的文字