赞
踩
回顾:
保护模式是用来保护内存段的,在X86系列的处理器中内置了保护模式,开启保护模式后,某段内存的访问就是受限的,即受保护。而这里所说的某段内存 就是内存段,就是一段连续的内存空间,即保护模式用来保护一段连续的内存空间。我们将这 一段连续的内存空间 简称为段。
X86系列的处理器最典型的特色就是 段式内存管理。不论访问哪一段内存空间,不论是实模式下 还是保护模式下,终究都是需要 段寄存器中的值 加上 一个段内偏移地址 才能得到具体的内存地址。
C语言里面的数组就是 段式内存管理的纯软件实现。
初步解决方案:
程序是逻辑上分开的不同的段所组成的,数据段,代码段。既然逻辑上这些段是独立的,那么运行的时候,就没必要将他们一股脑的全部放到内存里面去。可以用到哪个段 就加载哪个段,不用的段就移除掉。就是根据程序运行的局部性原理,该原理指的是:在一个很短的时间范围内,程序总是在某个很小的部分内运行。
更进一步的解决方案: 在段的基础上再分页,与前面的按段加载不同,新方案是以页为单位加载程序。
如下 每个段是由页组成,如下 数据段 代码段 堆栈段 分别由多个页组成,根据程序运行的局部性原理,我们可以知道 在某个短时间范围内,程序真正运行的部分在下图 粉色部分 代码段的第2页,此部分代码 依赖数据段的第2页 以及 堆栈段的第1页,这就意味着,在一个小的时间范围内,只需要加载这3页 到内存里面去就可以了,程序就能够运行了,不管这个应用程序规模有多大,在某个较短的时间范围内,只需要这3页就可以了。
问题1 实模式下使用的是 物理地址空间,指哪儿打哪儿
问题2 保护模式下使用的是 也是物理地址空间,只是使用 段地址+段内偏移地址 来表示
问题3 关于如何分离不同应用程序所用的内存空间。分页技术。
回顾:我们之前了解过LDT 局部段描述符表,LDT是X86处理中实现多任务的关键要素。
问题4 按页加载即可
虚拟内存空间:应用程序所使用的内存空间是相互隔离的,A程序 B程序 有各自的虚拟内存空间,这两个虚拟内存空间相互独立 互不干扰, 如A程序要访问0xFF地址的数据,B程序也要访问0xFF的数据,此时对然两个程序访问的地址值是一样的,但是实际地址是不同的,因为A 和 B 两个程序的虚拟内存空间是独立的,虽然访问的地址值相同,但是分别处于两个不同的空间。
物理内存空间:物理地址。虚拟内存空间中的逻辑地址 最终肯定是需要转换成响应的 物理地址的,如A程序 虚拟内存空间中的 0xFF这个逻辑地址 最终肯定是要转换为 物理内存空间中的某个物理地址的
页请求:当访问一个逻辑地址,但是该逻辑地址对应的页不在物理内存中的时候。
当访问 虚拟内存空间当中的一个逻辑地址,那就需要通过MMU来查表,最终得到一个物理地址,但是如果此时MMU去查表,发现这个逻辑地址的页号 不在表中,这就意味着对应的页并没有加载到物理内存当中,于是将所需要的页 从外存中加载到物理内存中,然后更新页表即可,即将该 逻辑地址页号 与 物理地址页号的 对应关系 更新的页表中,最后将通过页表中对应的映射关系 拿到对应的物理内存页号 再加上偏移地址 就能得到物理地址了。
页交换:页请求时发现物理内存空间不足,需要暂时将不用的页移除
当应用程序想要访问一个 虚拟内存空间中的逻辑地址,然而这个逻辑地址所对应的页号并不在页表中,此时就需要页请求,当进行也请求的时候,发现物理内存空间不足,没有多余的空间,此时就需要将暂时不用的页 从内存中移除,空出多余的空间,来进行页请求。
页是固定大小的内存片,页的概念引入后,我们在使用内存时,就以页为单位了,页的引入 直接引申出了 虚拟内存空间的概念。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。