虚拟内存的呈现

  • 虚拟内存是由物理内存开展得来,在前期操作体系运用的是物理内存,便是直接把程序直接加载到物理内存里边,便是内存的地址和它真是的地址是如出一辙,当加载太多程序的 时分就会呈现内存不足的状况,这个时分需求关掉一些程序才干翻开现在要翻开的程序,而且软件的开展速度远远快于硬件的升级速度,这样直接运用物理内存的缺点十分明显;
  • 同时因为程序上拜访的内存地址是实在的地址,这样能够经过内存指针偏移去拜访到其他的数据,这样就存在必定的安全危险;
  • 别的程序加载后,有许多的内容并不是立刻需求用到,只需求加载所需的内容,所以就把内存分为一块一块,加载需求的数据进内存,就设计出了懒加载,当你需求运用的时分才加载进内存里边, 这样就节省了内存,可是这样就衍生出一个新的问题,用户切换不同程序的时分,用户运用这个程序需求把这个程序加载到内存,用另一个程序又需求把程序加到内存,这样就会形成一种现象,一个程序的地址在内存里边是不接连的,这又呈现了一个新的状况,体系每次分配空闲内存是随机的,并不知道哪块内存必定对应哪个程序,这样程序运转功率很低,因为体系需求大量计算来确定内存属于哪个程序,体系就会显示出卡顿的现象

因为物理内存存在如此多的缺点,因此虚拟内存诞生:

二进制重排(二)

虚拟内存的呈现,让程序就不直接和物理内存直接关联。计算机范畴有一种设计思想,便是计算机科学范畴的许多问题都能够经过增加一层中间层来处理。虚拟内存就相当于一层中间层。

二进制重排(二)

如上图所示,体系会为每个程序创立一张虚拟内存地址表,程序创立的时分就不需求考虑物理的内存地址,它都交给CPU新增的硬件来处理,这个硬件就叫MMU,也叫内存管理单元。MMU的任务只要一个,就便是翻译地址。程序履行的时分只会去找虚拟地址,这个时分程序拜访的虚拟地址是接连的,而虚拟地址和物理地址的翻译统统交给MMU去处理,把虚拟地址翻译成物理地址,再去物理地址找对应的数据。

一、虚拟地址和物理地址数据如何对应

它们之间的对应联系并不是按每个字节去翻译,而是按一块的数据去翻译,一个块具体有多大,能够翻开终端输入:

jonytang@Mac ~ % PAGESIZE

得到

4096

注:也有些人的电脑可能是16384

4096表明在当前操作体系,每个块的巨细是4KB (16384便是16KB,这里默认4KB为标准),这个4096便是内存中的一页,计算机用page来表明,内存的分页便是这么来的,每4KB为一页。

二、分页技能

  1. 这个分页为了处理程序分段存在的问题,页的巨细是固定的,而段是不固定的,由程序本身的巨细决议 。
  2. 假设内存巨细是100M,现在有3个程序ABC,别离有30M40M50M的巨细,假设先加载了AB,那么C50M巨细超过了内存的余量30M,这样内存就不足以加载C程序,形成了30M的糟蹋,内存运用率过低,假如要处理该问题,就需求先把最不活跃的程序在内存开释掉,假设是A最不活跃,那就先写进硬盘,然后开释A内存去加载C,可是因为A有几十M,而且是操作硬盘的写入,所以速度会很慢。
  3. 而分页尽管也存在着内存不足的状况,可是每一页只要4KB,这个读写进硬盘的速度远高于几十M的程序写进内存;别的因为一页只要4KB,每次依照4KB去取内存写入,这样也不存在一次性有几十M内存糟蹋的状况。

二进制重排(二)

运用虚拟内存处理了物理内存的一次性加载大块内存的问题,同时也处理了安全问题,假如外部拜访了虚拟内存的数据,因为每个进程虚拟内存的数据是独立的,因此是无法经过当前进程的地址去拜访其他进程的数据,而进程和进程之间的通信,只能经过体系的接口去拜访。

三、缺页中止

二进制重排(二)

假设进程一启动的时分 咱们需求加载它的P1P3P5 这三页,现在运用P2这一页,而这个时分P2还没有被加载进内存,这个时分就会呈现缺页异常也叫缺页中止,这个时分体系会将P2加载到内存里边

二进制重排(二)

四、内存分配原则

内存的分配原则是哪里有空余内存就分配到哪里,假如体系运转了一段时间,内存被运用到占满,这时体系会将不活跃的给开释掉,然后把现在需求用这个的这一页将其加载进内存,这个过程被称为页面置换。这便是手机开启多个程序一段时间后,再点开好久没有翻开的运用,会看到该软件的启动界面,便是该进程不活跃,其在内存中的数据被新的运用给掩盖,这便是运用了计算机虚拟内存处理多个进程呈现的现象。

五、rebase

接下来是关于rebaserebase的呈现是虚拟内存也存在一个问题,前期运用程序被加载到内存的时分,它的地址是随机的,便是可履行文件数据拜访的拜访,每次都是随机的。在运用物理地址每次地址随机,它的好处是便是比较安全,能够防止攻击者能够经过有规律的地址来获取一些数据,可是运用虚拟内存每次都是从0开端,虚拟内存的安全性就相对不高,针对这个问题,操作体系运用了一种新的方式来处理,便是ASLR(地址空间随机化)。ASLR让虚拟地址不是从0开端,而是一个随机的值开端,这样程序每次启动的虚拟地址都是随机的。

偏移能够经过一个可履行文件来查看

二进制重排(二)

MachOView翻开,随意挑选一个Section64,能够看到偏移Offest

二进制重排(二)

Offest的地址是偏移后的地址,所以需求加ASLR之后才干找到真正的地址,而Offest + ASLR 这个操作就叫rebase