在准备网易笔试时,看到上一批有同学被面试官问:有人说操作系统将一切资源当作文件来表示,你了解原理吗?这样做有什么好处?
概念
所谓
一切皆文件
就是指计算机操作系统将一切计算机的可用资源都映射成文件形式向使用者提供统一的操作方式
。普通文件、目录、键盘、鼠标、打印机、显示器、内存页、字符设备、块设备、操作系统调度状态、网络设备(套接字)等等,在Unix/Linux都被当做文件来对待。
虽然他们的类型不同,但是Linux系统为它们提供了 “一套统一的文件操作接口。”
原理
这里引入一个叫VFC
的概念。
虚拟文件系统
(Virtual File System
,简称VFS
)
Jerry找了一张图,看看VFS
处于什么的地位。
Linux支持多种文件系统
(如vfat
、ext2
、ext3
等),为了方便管理,在所有这些文件系统上面提供了一层抽象,即 虚拟文件系统 VFS
。
虚拟文件系统 VFS
为各类文件系统提供了统一
的操作界面
和应用编程接口
也就是说,不论是什么类型的文件系统,都必须提供符合VFS标准的接口。
因此在虚拟文件系统 VFS
中的文件,定义了这样6个通用的操作,这6个函数是目前操作系统中对文件操作中最常见、最有代表性的文件操作函数:
open()
:打开文件close()
:关闭文件read()
:读取文件内容write()
:写入文件内容ioctl()
:输入输出控制poll()
:尝试获取资源
应用程序通过
文件操作函数
(open()
、close()
、read()
、write()
、ioctl()
等),调用对应VFS
提供的系统调用函数接口
(sys_open()
、sys_close()
、sys_read()
、sys_write()
、sys_ioctl()
等)同VFS
进行交互,VFS
通过驱动程序
提供的file_operation
接口同设备驱动进行交互。`
Linux下每一类设备在驱动层
都定义了对应的操作方法,
例如:
字符设备的操作方法为def_chr_fops
,
块设备为def_blk_fops
,
网络设备为bad_sock_fops
并且不同类型的设备底层操作方法是不一样的,但是驱动层
通过file_operations
接口把不同类型设备的差异屏蔽
了,这就使得VFS
可以通过统一
的file_operations
接口来访问不同类型的设备。这就是Linux能将所有设备都理解为文件的原因。
设计人员视角的“文件”
这里我拿一个简单的硬件来简单比喻,就拿LED灯来举例,现在有个需求是设计一个会跟随环境自动改变亮度的LED灯。
设计人员:
不希望编写较为复杂的、直接操作硬件的代码,而是希望操作系统为用户提供一个通用的操作接口函数,于是就编写一个驱动程序,并向操作系统注册一个"/dev/led"
设备节点,而"/dev/led"
这个文件就是一个设备文件,LED灯的内部由驱动开发人员完成与硬件交互的功能,对使用人员(即用户)提供open()
、close()
、read()
、write()
、ioctl()
、poll()
等操作函数。
- 设计人员只需要将硬件相关的程序和操作封装到驱动程序内部即可,无需暴露给用户。
用户视角的“文件”
对于普通文件的操作通常只有“打开”、“关闭”、“读取”、“写入”等这几个操作,对于较为特殊的文件,通常还需要加入“输入输出控制”、“尝试获取数据”这两个操作。
用户:
操作这个硬件LED灯就与操作普通文件一样,通过open()
函数打开这个文件,通过ioctl()
函数对这个文件进行相关的控制,使用完毕后再通过close()
函数来关闭此文件。
- 如此一来,硬件与用户之间就减少了很多特定的功能操作,用户也不必关心硬件设备的具体实现细节,只需要对这个设备文件进行通用操作即可。
全部评论
(0) 回帖