我们知道有很多文件是伪文件,即不是真实的文件。
前任:
/sys/xxx
/proc/xxx
/dev/xxxx
按照我的理解,open()
会调用x86 ASM代码,ASM代码会做硬件中断来访问磁盘。
问题是如果open()
最终会访问磁盘,伪文件如何仍然可以访问open()
?
答案1
系统open()
调用不像您所描述的那样工作。相反,它要求内核打开一个文件。内核知道该文件位于哪个文件系统以及它与哪个设备关联。这可以是物理硬盘驱动器、内存块等。如果关联设备只是内存块,则不执行磁盘访问。
答案2
作为狐狸在他们的回答,内核处理open()
系统调用,同时文件系统以自己的方式实现文件操作。另一方面,文件系统实现它们的系统调用版本,这就是内核应该使用的。
例如,考虑一下,ext4 调用打开目录或者procfs中的文件操作(特别是在任何地方都没有.open
提到),并且 管道它处理命名和未命名管道。但一般的想法是open()
系统调用不一定是汇编,也不保证它特定于特定的体系结构。
并引用一个答案由用户沃伦·杨在这个问题出现之前谁注意到了这一点,
没有 mkdir() 存在的单个文件。 Linux 支持许多不同的文件系统,每个文件系统都有自己的“mkdir”操作实现。让内核隐藏单个系统调用背后的所有内容的抽象层称为 VFS。因此,您可能想使用 vfs_mkdir() 开始挖掘 fs/namei.c。低级文件系统修改代码的实际实现在其他地方。例如,ext4 实现称为 ext4_mkdir(),在 fs/ext4/namei.c 中定义。
至于为什么open()
会这样,这也是因为Unix设计理念:一切皆文件。如果您使用 API,您希望处理一致的接口,而不是为现有的每个文件系统重新发明轮子(除非一个人是内核开发人员,在这种情况下他们得到我们的感激和尊重)。