Mark Asked: 2019-03-16 00:29:05 +0800 CST2019-03-16 00:29:05 +0800 CST 2019-03-16 00:29:05 +0800 CST 如果某些文件是伪文件,为什么 open() 函数仍然可以访问它? 772 我们知道有很多文件是伪文件,即不是真正的文件。 前任: /sys/xxx /proc/xxx /dev/xxxx 在我的理解中,open()会调用 x86 ASM 代码,ASM 代码会做硬件中断来访问磁盘。 问题是如果open()最终会访问磁盘,伪文件如何仍然可以访问open()? linux kernel 2 个回答 Voted Fox 2019-03-16T00:38:08+08:002019-03-16T00:38:08+08:00 open()系统调用不像你描述的那样工作。相反,它要求内核打开一个文件。内核知道该文件在哪个文件系统上以及它与哪个设备相关联。这可能是物理硬盘驱动器、内存块等。如果关联的设备只是内存块,则不会执行磁盘访问。 Best Answer Sergiy Kolodyazhnyy 2019-03-16T01:40:25+08:002019-03-16T01:40:25+08:00 正如Fox在他们的回答中指出的那样,内核处理open()系统调用,同时,文件系统以自己的方式实现文件操作。另一方面,文件系统实现了它们的系统调用版本,这就是内核应该使用的。 例如,考虑在 procfs 中对打开目录或文件操作的 ext4 调用(特别是在任何地方都没有提及),以及 处理命名和未命名管道的pipefs 。但总体思路是,系统调用不一定是汇编,也不保证特定于特定架构。.openopen() 并引用用户Warren Young的回答,他在这个问题出现之前就指出了这一点, 没有 mkdir() 存在的单个文件。Linux 支持许多不同的文件系统,每个文件系统都有自己的“mkdir”操作实现。让内核将所有内容隐藏在单个系统调用后面的抽象层称为 VFS。因此,您可能想开始使用 vfs_mkdir() 挖掘 fs/namei.c。低级文件系统修改代码的实际实现在别处。例如,ext4 实现称为 ext4_mkdir(),定义在 fs/ext4/namei.c 中。 至于为什么open()会这样工作,这也是由于Unix 的设计理念,即一切皆文件。如果您使用 API,您希望处理一致的接口,而不是为现有的每个文件系统重新发明轮子(除非某人是内核开发人员,在这种情况下,他们会得到我们的感激和尊重)。
open()
系统调用不像你描述的那样工作。相反,它要求内核打开一个文件。内核知道该文件在哪个文件系统上以及它与哪个设备相关联。这可能是物理硬盘驱动器、内存块等。如果关联的设备只是内存块,则不会执行磁盘访问。正如Fox在他们的回答中指出的那样,内核处理
open()
系统调用,同时,文件系统以自己的方式实现文件操作。另一方面,文件系统实现了它们的系统调用版本,这就是内核应该使用的。例如,考虑在 procfs 中对打开目录或文件操作的 ext4 调用(特别是在任何地方都没有提及),以及 处理命名和未命名管道的pipefs 。但总体思路是,系统调用不一定是汇编,也不保证特定于特定架构。
.open
open()
并引用用户Warren Young的回答,他在这个问题出现之前就指出了这一点,
至于为什么
open()
会这样工作,这也是由于Unix 的设计理念,即一切皆文件。如果您使用 API,您希望处理一致的接口,而不是为现有的每个文件系统重新发明轮子(除非某人是内核开发人员,在这种情况下,他们会得到我们的感激和尊重)。