《CSAPP》虚拟存储器

前言:

虚拟存储器这一部分也是我一直以来没有理解的,这一章对于整体理解计算机系统非常的重要,需要彻底弄明白。

我的github:

我实现的代码全部贴在我的github中,欢迎大家去参观。

https://github.com/YinWenAtBIT

第九章:虚拟存储器

虚拟存储器的作用:

一、虚拟存储器的能力:

1. 为每个进程提供一个大的一致的和私有的地址空间:

虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互。

2. 它将主存看做是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并更局需要在磁盘和主存中来回传送数据。

这种方式,高效的使用了主存。

3. 为每个进程提供了一致的地址空间,从而简化了 存储器管理

4. 保护了每个进程的地址空间不受其他进程破坏

二、为什么需要理解虚拟存储器:

1.虚拟存储器是中心:

它编辑计算机系统的所有层面,从硬件异常,汇编器,链接器,加载器,共享对象,文件和进程的设计中扮演着重要的角色

2. 虚拟存储器是强大的:

它给与应用程序强大的能力。可以创建和销毁存储器片,将存储器片映射到磁盘文件的某个部分,以及与其他进程共享存储器。

3. 虚拟存储器是危险的:

每次应用程序引用一个变量,间接引用一个指针,或者调用如malloc这样的动态分配程序时,它就会和虚拟存储器发生交互。

页与页表:

一、虚拟存储器被分割成虚拟页:

每个虚拟页的大小为P =2 ^p,类似的,物理存储器也被分割成物理页,大小也为P字节。物理页称为页帧

二、页表用来索引物理页:

页表将虚拟页映射到物理页,每次地址翻译,硬件将一个虚拟地址转换为物理地址的时候都会读取页表。

页表就是一个页表条目组成的数组(PTE),每个PTE都由一个有效位和一个地址组成。

二、页命中与缺页:

1. 读取已经缓存的虚拟页,将会调用地址翻译硬件,将虚拟地址用来定义对应的PTE,然后找到对应的物理地址。

2. 缺页就是访问的虚拟页未有DRAM缓存,会触发缺页处理程序,系统选择牺牲一个页,然后将该虚拟页缓存。

虚拟存储器管理存储器:

一、操作系统为每一个进程提供了一个独立的页表:

1. 简化链接:

独立的地址空间允许每个进程的存储器映像使用相同的基本格式,而不用管代码和数据实际存放在物理存储器的何处。

2. 简化加载:

3. 简化共享:

可以通过虚拟页指向同一个物理页来完成共享。

4. 简化存储器分配:

当用户使用malloc等函数时,可以分配连续的虚拟页,但是可以不用分配连续的物理页

二、虚拟页作为存储器保护工具:

在PTE中添加保护标志位,就可以控制对虚拟页面上内容的访问权限。

存储器映射:

一、定义:

通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器的内容,这个过程称为储存器映射,可以映射到两种对象:

1. Unix文件系统中的普通文件。

2. 匿名文件。

二、共享对象与私有对象:

1. 一个对象可以被映射到虚拟存储器的一个区域作为共享对象:

如果一个进程将一个共享对象映射到它的虚拟地址空间内,那么这个进程对这个区域的任何写操作,对于其他那些也把共享对象映射到他们虚拟储存器区域内的进程也是可见的。

2. 私有对象与上相反,其他进程是不可见对私有对象的修改的。

二、共享对象与私有对象:

如果两个进程将一个私有对象映射到他们的虚拟储存器中,但是共享这个对象的一个物理拷贝,对于每一个映射私有对象的进程,相应的私有对象的页条目表都被标记为只读,并且区域结构被标记为私有的写时拷贝。只要有一个进程试图写它自己的私有区域,就会引起一个保护故障,故障处理程序会在物理储存器中创建一个新的拷贝,然后恢复这个页面的可写权限。此时进程就指向各自的独立的物理内存区域了。

总结:

虚拟储存器理解了之后,就能知道为什么汇编中,代码段总是在0x8048000开始了。也明白了进程中的内存到底是如何组织的。现在对已操作系统中的进程运行流程,已经有了一个非常全面的理解了。对于以后的编程会有非常大的帮助。



你可能感兴趣的:(《CSAPP》虚拟存储器)