![Linux TCP/IP 内核堆栈和 VFS 交互](https://linux22.com/image/219055/Linux%20TCP%2FIP%20%E5%86%85%E6%A0%B8%E5%A0%86%E6%A0%88%E5%92%8C%20VFS%20%E4%BA%A4%E4%BA%92.png)
我正在阅读 TCP/IP 堆栈的 Linux 内核实现。一切都很好,直到我
在阅读时遇到这个数字TCP/IP体系结构、设计与Linux下的实现
正如您可能看到的那样,作者试图描述 Linux 上 VFS 和套接字层之间的交互。这让我产生了很多疑问:
在图像上,它显示了一个套接字作为特定索引节点下文件结构的一部分,事情是:这种关系不再存在! (说实话,这并没有多大意义,因为只有 netlink 和 unix 域套接字可能有相关的 inode,但 inet 套接字却没有,不是吗?)。看结构文件定义; f_dentry 消失了,在 grep 中你可以找到
Documentation/filesystems/porting.rst 570:f_dentry 消失了;使用 f_path.dentry,或者更好的是,看看是否可以避免它
现在,上面的相同结构确实有一个可到达的目录项(如文档中提到的)f_路径场但是目录项被描述为一个有两个用途的结构,第一用于描述目录条目,第二作为文件系统目录缓存,所以即使关系没有消失(如图所示),这对我来说没有多大意义,为什么要将套接字放在一个短暂的对象中,请参阅数据缓存(也许我误解了 dentry/dcache?)。
继续查看代码可以看到套接字结构体定义。我们可以看到它仍然保留着旧的文件struct as field(由于上述原因,清除 VFS -> TCP/IP 关系但在这些方向上保留 TCP/IP -> VFS 关系更有意义),但是问题是,它真的消失了吗?我没有看到任何东西停下来FD创建在任何类型的插座上,请参阅sock_map_fd-袜子分配文件-分配文件伪以及。还有这个特别的索引节点对象套接字->文件->索引节点)应该只存在于内存中,因为不属于任何设备文件系统,但是,谁是它的超级块?,请参阅吲哚.sb。
这并不完全是 TCP/IP-VFS 交互,但是,我可以从以下位置获取 inode:文件->f_inode或通过文件->f_path->d_inode,两个 inode 之间的关系是什么?
如果有人可以帮助我理解,那就太好了,提前致谢。