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

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

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

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

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

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

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

请帮忙。

最佳答案
这个答案是基于内核版本4.0。我追踪了处理读系统调用的一些代码。我建议您克隆Linux源代码,并遵循源代码。

>用于读取的Syscall处理程序,在fs / read_write.c:620被调用。它接收一个文件描述符(integer)作为参数,并调用fdget_pos将其转换为一个struct fd。
> fdget_pos调用__fdget_pos调用__fdget调用__fget_light。 __fget_light使用current->文件(当前进程的文件描述符表)来查找与传递的文件描述符号相对应的结构文件。
>回到syscall处理程序,文件结构传递给vfs_read,位于fs / read_write.c:478。
> vfs_read调用__vfs_read,它调用file-> f_op->读取。从这里开始,您处于文件系统特定的代码中。

所以VFS并没有真正打扰“识别”文件所在的文件系统;它只是使用存储在其结构文件中的“文件操作”函数指针表。当该结构文件被初始化时,它被给予正确的f_op函数指针表,其实现其文件系统的所有特定于文件系统的操作。

转载注明原文:linux如何识别特定的文件系统来执行系统调用 - 代码日志