虚拟内存及虚拟文件系统概论

摘要:虚拟内存,虚拟文件系统,顾名思义两者都是由操作系统提供的一种抽象,本文不是介绍操作系统的具体实现细节,而是对操作系统提供的虚拟内存机制和虚拟文件系统机制的一种概述及设计思想的描述(由于个人的局限性,不足之处在所难免)。本文通过对相关版本linux操作系统关于虚拟内存和虚拟文件系统的主要数据结构的研究,宏观上把握此两种机制的实现原理。

0 引言
操作系统把计算机中的各种资源提供了一个很友好的界面给用户,其中虚拟内存是对实际物理内存的一个抽象,而虚拟文件系统是对文件系统(此处指进行了格式化后的磁盘)的一个抽象。

1 虚拟内存
这部分内容建议大家从计算机(内存管理)发展的角度来理解.以Intel系列为例:8086机是实模式,也就是发出的地址会直接加载到内存进行寻址;现代intel 系列机成为i386系列,是因为从80386型号的CPU开始,已经提供了保护机制,即分页机制(由于虚拟内存是由于分页机制实现的,所以略去分段机制的发展过程。实际上,由于分页机制的出现分段机制已近被束之高阁,但为了保持向上的兼容性,仍然保留着这种机制,只是没有使用)。
以下以分页机制为核心来讨论虚拟内存。
由于此部分内容在《程序员的自我修养》第六章中讲的非常详细,在此只给出逻辑结构图:
!虚拟内存寻址逻辑图

注:虚拟内存机制,需要硬件MMU的支持

2 虚拟文件系统

一、 名词解释
(1) 文件系统:这个词有不同的含义:
a. 指一定的文件格式。例如,我们说linux的文件系统是Ext2,MSDOS的文件系统是FAT16,而WindowsNT的文件系统是NTFS或FAT32,就是这个意思。
b. 指按特定格式进行了“格式化”的一块存储介质。我们说“安装”或“卸载”一个文件系统时,指的就是这个意思。
c. 指操作系统中(内核)用来管理文件系统(即a所指的意思)及对文件进行操作的机制及其实现。

(2) 文件:就是按一定的组织形式存储在介质上的信息,所以一个“文件”其实包含了两方面的信息,一是存储的数据本身,还有一部分就是有关该文件的组织和管理的信息. 对于磁盘文件来说,这两种信息必定全部都存储在“文件系统”(此处的“文件系统”指的是按特定格式(注意不同的文件系统有不同的对文件组织的格式)进行了“格式化”的一块存储介质)中,也就是磁盘上。

(3) 驱动程序:(device driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假设如某设备的驱动程序未能正确安装,便不能正确工作。
驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。

(4) 格式化:这是因为每种操作系统所设置的文件属性/权限并不相同,以及对文件组织管理方式的不同(体现为具体的文件系统),为了存放这些文件所需要的数据,因此需要将分区进行格式化,以成为操作系统能够利用(识别)的文件系统格式。所以对磁盘的格式化的过程也是将某一个文件系统(不同的文件系统对数据的管理方式是不同的)写入到磁盘的过程。

二、从内核的角度看VFS:

文件系统,概括的讲应该是对磁盘(外设)上存储的数据的一种组织管理方案。关于虚拟文件系统和具体的文件系统的关系,很多书中也做了介绍,简单的说就是虚拟内存文件系统屏蔽掉了不同文件系统之间的差异,提供给用户一个统一的接口。如果感觉这样有些抽象的话,可以首先看一下假如所有的内核只使用一种文件系统的情况(此处只是为了便于理解):

!单文件系统

此时由于只有EXT2一种文件系统(即唯一一种可行的对文件进行管理的方案),

按EXT2格式经过格式化的磁盘(或逻辑盘)存储介质都相应地被划分成至少4个部分(见下图),其中引导块永远是介质上的第一个记录块(可参考鸟哥私房菜系统的启动),超级块永远是介质上的第二个记录块,其它两部分的大小则取决于磁盘大小等参数,这些参数都存储在超级块中。
!ext2文件系统逻辑组织结构

注:这部分内容属于具体的文件系统对文件管理的实现,在格式化的过程中会由系统将这些数据填入磁盘的相应位置,以供后期查找文件使用。(读者如果想对具体信息进行了解的话,极力推荐一位CSDN博主“AllenHuai”,他关于文件系统的原理写的深入浅出,堪称经典。本文由于重点是虚拟文件系统,所以在此略过此部分的内容)。

当系统内同时存在多个文件系统时(这是现实情况),由于每种文件系统对磁盘数据的管理(即文件格式)不尽相同,此时也有各自的系统调用,这就给用户带来了极大的不便,因为在使用不同文件系统对文件进行操作时,都要选择不同的系统调用,为了给用户提供一套统一的系统调用接口,操作系统在实际的文件系统和内核之间加了一个虚拟层,即虚拟文件系统,这时通过虚拟文件系统就能给用户提供统一的对文件进行操作的系统调用。如下图:
!虚拟文件系统

以上介绍的是虚拟文件系统存在的原因。接下来看一看内核如何来组织实现虚拟文件系统的这种机制。

虚拟文件系统中的4个主要对象,具体每个对象的含义参见如下的详细介绍。

超级块:(super_block) 记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等。超级对象块用来存储一个已安装的文件系统的控制信息,代表一个已安装的文件系统;每次一个实际的文件系统被安装时, 内核会从磁盘的特定位置读取一些控制信息来填充内存中的超级块对象。一个安装实例和一个超级块对象一一对应。

索引节点:(inode)是VFS中的核心概念,它包含内核在操作文件或目录时需要的全部信息。一个索引节点代表文件系统中的一个文件(这里的文件不仅是指我们平时所认为的普通的文件,还包括目录,特殊设备文件等等)。索引节点和超级块一样是实际存储在磁盘上的,当被应用程序访问到时才会在内存中创建。一个索引节点就包含了一个文件的所有信息如数据在磁盘上的地址,大小,文件类型,修改,创建日期,数据块,目录块等等(但是不包含文件名)。

目录项: (dentry: directory entry)和超级块和索引节点不同,目录项并不是实际存在于磁盘上的。在使用的时候在内存中创建目录项对象,其实通过索引节点已经可以定位到指定的文件,但是索引节点对象的属性非常多,在查找,比较文件时,直接用索引节点效率不高,所以引入了目录项的概念。

文件对象:(file)表示进程已打开的文件,从用户角度来看,我们在代码中操作的就是一个文件对象。文件对象反过来指向一个目录项对象(目录项反过来指向一个索引节点)其实只有目录项对象才表示一个已打开的实际文件,虽然一个文件对应的文件对象不是唯一的,但其对应的索引节点和目录项对象却是唯一的。

虚拟内存及虚拟文件系统概论_第1张图片
上面三段话是从某资料上贴下来的,由于当时没有做记录,最终没能确定其来源,但自认为比较重要,这三段话给出了,在VFS的数据结构填写过程中,用到的是在磁盘上记录的实际的文件系统的数据,这样,在内核对VFS的Inode进行文件定位时(通过驱动程序实现),才能和磁盘文件位置保持一致。这也不难理解,即每当打开一个文件时,就为其建立一个Inode数据结构,然后从磁盘将相应数据填入该结构。(在深入linux内核架构P418中给出详细的结构间的关系)

三、从进程的角度看VFS
以上是从内核的角度来理解的VFS,下面从进程的角度来看一看VFS:
虚拟内存及虚拟文件系统概论_第2张图片

虚拟内存及虚拟文件系统概论_第3张图片

你可能感兴趣的:(操作系统,操作系统)