unix操作系统 关于虚拟内存映射

来源:互联网 发布:em算法与混合高斯模型 编辑:程序博客网 时间:2024/05/17 06:37

理解这个概念以前需要理解几个问题

1.      程序是以文件的形式存在于磁盘上的

2.      程序必须装入内存才能被运行

3.      磁盘是由一个个大小固定的块组成的,文件在磁盘上并不一定占据连续的块

4.      内存也是被划为一个个大小固定的页,程序装入内存后也不是占据连续的页,并且程序也不是完全加载进内存当中

5.      操作系统是多任务的,每个任务都是在执行一定时间后,让其他任务使用cpu资源,因为这段时间很短,用户感觉每个任务都是同时在运行

6.      程序运行的时候由操作系统来管理,每一个运行的实体称为进程,当然进程和程序是两个不同的概念,进程是动态的,程序是静态的,操作系统管理进程是通过一些数据结构来管理的,主要的两个数据结构是进程表和u区

假设页和块大小是相同的,大小都是1k

 

一个exe文件生成之后,其格式是固定的,一般有正文段,数据段,正文段含有指令,数据段含有执行时需要的数据,他们都存在于exe文件中,exe文件经编译之后其内部地址是连续的虚拟地址(假设从0开始,一直到文件大小为止),当然这个exe文件是位于磁盘上

要执行这个文件,操作系统是以创建进程的方式,将这个exe文件的内容加载到内存当中,关键问题是如何加载进内存,既然程序在内存中不是连续的存在,那么是如何进行内存管理的以及是如何执行程序的

操作系统以进程的方式来管理运行的程序,当然需要一些数据结构,其中最重要的是进程表,操作系统维护一个进程表,当进程创建的时候就会在进程表中占据一个表项,这个表很复杂,这里只需要知道进程表里的每一项都唯一标识一个进程

在进程表的表项里有一项被称为本进程区表,这个本进程区表里有三个关键的项,每一项分别表示正文,数据和栈,以及在虚拟空间中的地址和他们的大小:



创建进程后,进程表项里的本进程区表就已经存在了,其文本区大小,数据区大小,栈区大小从exe文件中获得

然后为进程加载文件,首先为进程加载区,操作系统管理了一个区表,这个区的作用很重要,它其中有指向索引节点的指针,通过索引节点操作系统可以存取位于磁盘上的文件,索引节点和磁盘上的一个文件是一一对应的。操作系统管理磁盘文件是通过索引节点来进行管理的,索引节点中含有文件的布局和大小等一切必要信息,所谓布局就是文件在磁盘上位于那些块上,当然其中涉及相当复杂的关系,这里不讨论这些关系,只要知道通过索引节点就可以找到磁盘文件,进行读写。

区中还有一个指针指向页表,页表中的每一项保存了物理存储器中一页的首地址,知道这些就可以了

下面解释下虚拟映射

当操作系统给本进程区表项分配一个区后,假设这个表项代表文本,首先他得知文本区在虚拟空间是从0到4k,于是通过索引节点从磁盘读入4k字节进入物理内存当中,4k字节也就占据内存中的四个页,然后建立页表,在其中保存这四个物理页的地址,必须注意的是,它是按虚拟地址的顺序依次进行保存的,举个例子,0-1k这1k字节读到物理内存可能位于16k-17k这个物理页,1k-2k的字节读入物理内存可能占据13k-14k这个物理页,那么在页表中,它首先保存的是16k的地址,第二项保存13k的地址,依次类推

然后操作系统会以同样的方式为本进程区其他表项分配区

当然实际更加复杂,它并非将整个程序都装入内存,很可能只是装入一部分,但是必须清楚的是,页表的大小和与之相关的本进程表项所代表的文本/数据/栈的大小是对应的

程序执行是在虚拟空间中执行的,假设刚开始pc指向虚拟地址0,然后会通过页表的第一项去物理存储器的地址16k处取出指令然后执行,假设当pc指向3566字节处时,通过页表的第四项也就是去物理内存首地址为15k的页中,偏移量为3566-1012*3=530字节处取出指令来执行。

虚拟内存映射的机制是很容易理解的,但是其中涉及了很多细节问题楼主并没有提到,楼主在看书的过程中觉得搅进那些东西就把原本简单的道理搞的复杂化了

操作系统出于效率和安全的考虑在设计上就不得不采取必要的措施,诸如进程隔离,数据缓存,处理器模式,进程调度等一些设计都是基于这两大要素的

进程可也说是最重要的概念,操作系统几乎都是围绕进程来进行文件,内存,进程,io管理的,文件是程序在磁盘上的表示,程序运行起来就称为了进程,进程加载进内存就需要管理内存,进程需要读写文件和设备就涉及到IO,进程互相使用CPU和内存资源就涉及到进程管理,当然实际当中是非常复杂的,不过整体框架应该是清晰的


0 0
原创粉丝点击