一款操作系统要管理各种各样不同的硬件,因为硬件的不同所以它们使用的文件系统也不同。但是按道理来说,文件系统的不同对于用户来说可不是一件好事,操作不同的硬件就要使用不同的方法。
但是Linux有一切皆文件。
简单来说,Linux把所有不同的文件系统都抽象成同一个"对象",用户使用这一个"对象"就可以对底层不同的文件系统进行操作。
所以Linux中的一切皆文件,从面向对象的角度来说就是多态。但是Linux是用C写的,所以说它是多态是不准确的(因为C不是一门面向对象的语言),但是作为Linux的使用者确实感受到了多态这一特性。
多态是什么?多态就是同一种操作方法放在不同的对象上,这些对象有不同的响应行为。即,使用统一的接口来处理不同的对象。
所以理解一切皆文件的本质就是搞清楚Linux对文件系统的管理是怎么做到"多态"的?
Linux管理的硬件可能有键盘、网卡、显示器、磁盘等等,这些硬件呢会有配套的驱动程序,这些驱动程序当中会有让硬件执行某个操作的方法。所以使用者想使用这些硬件的时候,实际上是在"向Linux求助",让Linux去调用这些硬件的驱动程序当中用户指定的操作方法。
因为硬件五花八门,所以驱动程序各不相同。所以Linux想出了一个办法:
你们这些硬件不是有驱动程序么?驱动程序不是有控制硬件行为的方法么?那我就把你们这些操作方法全都给汇聚起来,然后再添加一些东西,封装成一个struct_file结构体。
至此Linux内核当中,就存在了一个汇聚所有文件系统的操作信息("汇聚"一词是不准确的,应该是抽象)。画一张图想必就明白了:
这幅图描述了Linux管理文件系统的大概过程。
Linux在内核当中创建struct_file结构体,该结构体里面有众多字段,例如文件的类型、状态以及对应文件系统的操作方法的函数指针(如果没有则为空指针)等等字段。
那么用户在使用read()、write()等系统调用时,Linux会根据用户传入的信息去确认使用哪个struct_file,从而操作正确的硬件。
因为一切硬件、文件系统,在Linux当中都是struct_file结构体对象, 所以在Linux下一切皆文件。
因为Linux做出了抽象,那么这个抽象层有一个专属的名词,叫做VFS(虚拟文件系统),VFS使得用户可以直接使用read()、write()等系统调用而无需考虑具体的文件系统和实际的物理介质。
本篇文章只是对这些知识一个简单的理解,实际上Linux做的工作比这复杂的多得多。