Has*_*ell 19 linux vfs linux-kernel
可以总结一下当我尝试执行read()/ write()系统调用时发生的事件/步骤.内核如何知道发出这些命令的文件系统.
让我们说一个进程调用write().然后它将调用sys_write().
现在可能,因为sys_write()是代表当前进程执行的,所以它可以访问struct task_struct,因此它可以访问包含文件系统信息的struct files_struct和struct fs_struct.
但之后我没有看到,这个fs_struct如何帮助识别文件系统.
编辑:既然Alex已经描述了流程......我仍然怀疑读/写如何被路由到FS,因为VFS没有这样做,那么它必须在其他地方发生,另外底层是怎么回事设备然后最终硬件协议PCI/USB附加.
涉及实际数据结构的简单流程图会很有帮助
请帮忙.
Ale*_*x D 13
这个答案基于内核版本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_readat fs/read_write.c:478.vfs_read电话__vfs_read,电话file->f_op->read.从这里开始,您将使用特定于文件系统的代码.所以VFS并没有真正打扰"识别"文件所在的文件系统; 它只是使用存储在其中的"文件操作"函数指针表struct file.当struct file初始化时,它被赋予了正确的f_op它实现了所有的文件系统的文件系统特定的操作函数指针表.