虚拟存储器
每个程序都拥有自己的地址空间,这个地址空间被分成大小相等的页,这些页被映射到物理内存;但不需要所有的页都在物理内存中,当程序引用到不在物理内存中的页时,由操作系统将缺失的部分装入物理内存。这样,对于程序来说,逻辑上似乎有很大的内存空间,但实际上是有一部分是存储在磁盘上,因此叫做虚拟内存。
虚拟内存的优点是让程序可以获得更多的可用内存。
虚拟存储器的特征
- 多次性
- 对换性
- 虚拟性(本质)
段式内存管理中的“段”和进程地址空间中的“代码段,数据段,bss段,堆栈段”不是同一个东西
理由:段式内存管理中的段是一个处理器概念,由处理器来将段地址例如CS:EIP等映射成线性地址,这个过程程序感知不到,因为这是一个硬件过程,操作系统也控制不了。而程序地址空间中的段是一个与程序装载有关的概念,将进程空间划分成只读代码段、只读数据段、可读写数据段等等是为了便于管理和提高安全性,比如C语言程序中的全局变量就在可读写数据段,而代码就在只读代码段,const变量则被放在只读数据段,这种划分是有操作系统控制的
处理器的两种工作方式:实模式、保护模式
8086就只有实模式。而现在的windows操作系统则是运行在保护模式下。
实模式下:段寄存器存放段基址
保护模式下:段寄存器存放段选择子
段选择子就是一个索引,索引段描述符,段描述符长度为64位,存于GDT(全局描述符表)
其中有32位用来存放段基址,剩下32位存放着段界限等信息。
虚拟存储器和Cache存储器的异同
-
相同点
- 都是基于程序局部性原理,把程序中最近常用的部分驻留在高速存储器中,一旦这部分程序不常用,把它们送回到低速存储器中。
-
不同点
- cache是用硬件实现的,是一个物理存储器;虚拟存储用操作系统与硬件结合的方式实现,是一个逻辑存储器。
- 在虚拟存储未命中的性能损失要大于cache系统未命中的损失。
在 Intel 32 位平台下保护模式
代码段:(不讲 64 位是因为在 64位 下的分段直接被禁用了,内存平坦)
一、逻辑地址
逻辑地址是 selector:offset 这种形式。
selector (段选择子)是 CS 寄存器的值,
offset (段内偏移)是 EIP 寄存器的值。 (16位)
二、线性地址 (20位)
如果用 selector 去 GDT( 全局描述符表 ) 里拿到 段基址
, 然后加上 offset(段内偏移),这就得到了 线性地址。我们把这个过程称作段式内存管理。
三、物理地址 (20位)
如果再把 线性地址 切成四段,用前三段分别作为索引去页表中查找,就会得到一个页表项(Page Table Entry),那里面的值就是一页物理内存的起始地址,把它加上 第四段的内容(段内偏移)就得到了最终的 物理地址。我们把这个过程称作页式内存管理。
四、虚拟地址
对于虚拟地址,他和线性地址在本质上就是相同的。(线性地址与逻辑地址数值相同,但本质不同)
总结:
保护模式下:线性地址 = 段基址 << 4 + 段内偏移
实模式下: 物理地址 = 段基址 << 4 + 段内偏移
程序中直接用的是逻辑地址,先经过分段变为线性地址,再经过分页最后转变为物理地址。
对软件就讲逻辑地址,针对cpu就讲线性地址,针对硬件就讲物理地址
物理地址总是一一对应于实际物理内存空间的位置;但可以有多个线性地址对应到一个物理地址上。 因为线性地址的值是由二元组相加的。即5=1+4,也有5=2+3.