设备文件是由Linux中的特定文件系统还是虚拟文件系统实现的?

在Tanenbaum的“现代操作系统”一书中,对于Linux文件系统,有两个草图:

在这里输入图像描述

在这里输入图像描述

在这两个草图中,“虚拟文件系统”下列出了特定文件系统(例如,ext4types)(第一个草图中的“文件系统”和第二个草图中的“文件系统1”)。

不同之处在于

  • 在第一个草图中,“文件系统”被列在与“terminal”和“套接字”相同的级别,并且不包括后两者,
  • 在第二个草图中,“文件系统1”包括“常规文件”,“块特殊文件”,“文件特殊文件”和“networking套接字”。

我的理解是这两个草图显示的是同样的东西,所以它们应该是一致的。

我的问题是

  • 特定的文件系统(例如ext4)是否实现设备文件并使其像普通文件一样对待,还是“虚拟文件系统”的工作?

  • 我怎么理解上面提到的“文件系统”和“networking套接字”,“块/字符特殊文件”之间关系的两个草图之间的区别?

文件系统有inode ,它知道char设备和块设备(并返回它们,例如通过stat(2)系统调用)。

当你的程序(和进程)打开一个字符设备(在一些文件系统中)时,内核将使用一些设备驱动程序,通常与设备主号码有关。

Ext2 wikipage有一个很好的图片(显示inodes和数据),这是非常适用于Ext4 (但当然,许多细节已经改变)。

VFS是内核中的一个抽象层。 查看VFS浏览并查看内核源代码。

一个普通的文件系统(例如一个Ext3文件系统)可能包含char设备inode(在某些目录中可见,例如char设备文件),但是许多新的Linux系统通常使用devfs伪文件系统(挂载在/dev/ ) (与udev & systemd有关 )。