内存 = 物理内存 = 真正的内存 = 真实插在板子的内存多大
虚拟内存 = 为满足内存容量不足需求 -> 在外存(硬盘)开辟空间
一个程序想要运行,必须运行在真实的物理内存之上。
所以必须在虚拟内存地址和物理内存地址之间建立一种映射关系。
虚拟内存的意义:
32位CPU(控制器),有32根地址线,那么它的寻址空间就是4GB(2的32次方)。也就是说,如果没有其它的限制,我们的主板上最大可以安装4GB的物理内存。
但是一般的机器是不会装那么多物理内存。
而且,有时软件应用时所需内存确大大超过了物理内存,这怎么办?
总不能不用那些程序了吧。
于是乎,
OS就提出了一个虚拟内存的概念--------就是进程、用户、不必考虑实际上物理内存的限制,而直接对 4GB的进程空间进行寻址。如果所寻址的数据实际上不在物理内存中,那就从“虚拟内存”中来获取。 一般情况下,虚拟内存的大小,各个OS也进行了限制(比如linux的swap分区的大小,win下也可以调整虚拟内存文件的大小和位置)。 所以,我们程序所能使用的存储空间大小就是:物理内存+虚拟内存
虚拟地址空间:
1、每个进程拥有独立的进程地址空间,这个每个进程相互独立,不同进程不能访问其他进程的地址空间。一个进程的错误操作,也只会影响这个进程,不会导致其他进程的奔溃。
2、实模式下的寻址方式,可以直接操作物理内存地址,但是不安全。任何进程都可以修改物理内存
3、每个进程的独立的地址空间,能够使得每个进程拥有独立的4g虚拟内存地址。共享一个物理内存。
4、虚拟内存,在磁盘中存在交换区,以解决虚拟内存地址大于物理内存的情况,通过换页机制,达到进程层面的内存扩容。
5、每个进程的虚拟地址空间是一样大的,这样方便我们在载入可执行文件的时候,分配的是虚拟内存,而不用管物理内存的分配
6、方便共享内存代码的实现,通过虚拟内存到物理内存的映射
7、虚拟内存的连续,可以导致物理内存的不连续,通过映射完成
虚拟地址空间的映射关系:
虚拟内存地址:通过页表,分页目录,
最简单的地址转换:一级目录:cr是页表的起始地址
cr+虚拟地址空间地址的前一部分 =页表的页表项,该页表项指向的是物理内存块的起始地址,物理内存的起始地址+偏移量=物理内存地址