可以总结一下我尝试执行read((/write((系统调用时发生的事件/步骤。内核如何知道要发出这些命令的文件系统。
假设一个进程调用 write((。然后它将调用 sys_write((。
现在可能,由于 sys_write(( 是代表当前进程执行的,它可以访问结构task_struct,因此它可以访问包含文件系统信息的结构files_struct和结构fs_struct。
但在那之后,我没有看到这个fs_struct如何帮助识别文件系统。
编辑:现在亚历克斯已经描述了流程...我仍然怀疑读/写是如何路由到 FS 的,因为 VFS 不这样做,那么它一定发生在其他地方,还有底层块设备,最后是硬件协议 PCI/USB 被连接。
涉及实际数据结构的简单流程图会有所帮助
请帮忙。
这个答案是基于内核版本4.0。我找出了一些处理read
系统调用的代码。我建议您克隆 Linux 源代码存储库并按照源代码进行操作。
read
的系统调用处理程序,在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
,file->f_op->read
调用。从这里开始,您将处于特定于文件系统的代码中。
因此,VFS并没有真正费心"识别"文件所在的文件系统;它只是使用存储在其struct file
中的"文件操作"函数指针表。初始化该struct file
时,会为其提供正确的f_op
函数指针表,该表为其文件系统实现所有特定于文件系统的操作。
每个文件系统将自己注册到 VFS。挂载文件系统时,将读取其超级块,并使用此信息填充 VFS 超级块。此时还会填充此文件系统的函数指针表。当发生文件>f_op>读取调用时,实际上会调用文件系统中的注册函数。您可以引用 http://www.science.unitn.it/~fiorella/guidelinux/tlk/node102.html 中的文本