linux如何识别特定的文件系统来执行系统调用
How linux identify a particular file system to execute system call
能否总结一下当我尝试执行 read()/write() 系统调用时发生的 events/steps。内核如何知道哪个文件系统发出这些命令。
假设一个进程调用 write()。
然后它将调用 sys_write()。
现在可能,因为 sys_write() 代表当前进程执行,它可以访问 结构 task_struct 因此它可以访问结构 files_struct 和 结构 fs_struct 包含文件系统信息。
但在那之后我没看到 fs_struct 如何帮助识别文件系统。
编辑:既然 Alex 已经描述了流程......我仍然怀疑 read/write 是如何被路由到 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
,当前进程的文件描述符 table,查找与传递的文件描述符编号对应的 struct file
。
- 回到系统调用处理程序,文件结构被传递给
vfs_read
,位于 fs/read_write.c:478
。
vfs_read
调用 __vfs_read
,后者调用 file->f_op->read
。从这里开始,您将使用特定于文件系统的代码。
所以 VFS 并没有真正打扰 "identifying" 文件所在的文件系统;它只是使用存储在其 struct file
中的 "file operation" 函数指针中的 table。当 struct file
被初始化时,它被赋予正确的 f_op
函数指针 table,它为其文件系统实现所有特定于文件系统的操作。
每个文件系统都将自己注册到 VFS。当一个文件系统被挂载时,它的超级块被读取并且 VFS 超级块被填充这个信息。这个文件系统的函数指针 table 此时也被填充。当 file->f_op->read 调用发生时,实际上调用了文件系统中的注册函数。您可以参考http://www.science.unitn.it/~fiorella/guidelinux/tlk/node102.html
中的文字
能否总结一下当我尝试执行 read()/write() 系统调用时发生的 events/steps。内核如何知道哪个文件系统发出这些命令。
假设一个进程调用 write()。 然后它将调用 sys_write()。
现在可能,因为 sys_write() 代表当前进程执行,它可以访问 结构 task_struct 因此它可以访问结构 files_struct 和 结构 fs_struct 包含文件系统信息。
但在那之后我没看到 fs_struct 如何帮助识别文件系统。
编辑:既然 Alex 已经描述了流程......我仍然怀疑 read/write 是如何被路由到 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
,当前进程的文件描述符 table,查找与传递的文件描述符编号对应的struct file
。- 回到系统调用处理程序,文件结构被传递给
vfs_read
,位于fs/read_write.c:478
。 vfs_read
调用__vfs_read
,后者调用file->f_op->read
。从这里开始,您将使用特定于文件系统的代码。
所以 VFS 并没有真正打扰 "identifying" 文件所在的文件系统;它只是使用存储在其 struct file
中的 "file operation" 函数指针中的 table。当 struct file
被初始化时,它被赋予正确的 f_op
函数指针 table,它为其文件系统实现所有特定于文件系统的操作。
每个文件系统都将自己注册到 VFS。当一个文件系统被挂载时,它的超级块被读取并且 VFS 超级块被填充这个信息。这个文件系统的函数指针 table 此时也被填充。当 file->f_op->read 调用发生时,实际上调用了文件系统中的注册函数。您可以参考http://www.science.unitn.it/~fiorella/guidelinux/tlk/node102.html
中的文字