虚拟内存的呈现
- 虚拟内存是由物理内存开展得来,在前期操作体系运用的是物理内存,便是直接把程序直接加载到物理内存里边,便是内存的地址和它真是的地址是如出一辙,当加载太多程序的 时分就会呈现内存不足的状况,这个时分需求关掉一些程序才干翻开现在要翻开的程序,而且软件的开展速度远远快于硬件的升级速度,这样直接运用物理内存的缺点十分明显;
- 同时因为程序上拜访的内存地址是实在的地址,这样能够经过内存指针偏移去拜访到其他的数据,这样就存在必定的安全危险;
- 别的程序加载后,有许多的内容并不是立刻需求用到,只需求加载所需的内容,所以就把内存分为一块一块,加载需求的数据进内存,就设计出了懒加载,当你需求运用的时分才加载进内存里边, 这样就节省了内存,可是这样就衍生出一个新的问题,用户切换不同程序的时分,用户运用这个程序需求把这个程序加载到内存,用另一个程序又需求把程序加到内存,这样就会形成一种现象,一个程序的地址在内存里边是不接连的,这又呈现了一个新的状况,体系每次分配空闲内存是随机的,并不知道哪块内存必定对应哪个程序,这样程序运转功率很低,因为体系需求大量计算来确定内存属于哪个程序,体系就会显示出卡顿的现象
因为物理内存存在如此多的缺点,因此虚拟内存诞生:
虚拟内存的呈现,让程序就不直接和物理内存直接关联。计算机范畴有一种设计思想,便是计算机科学范畴的许多问题都能够经过增加一层中间层来处理。虚拟内存就相当于一层中间层。
如上图所示,体系会为每个程序创立一张虚拟内存地址表,程序创立的时分就不需求考虑物理的内存地址,它都交给CPU新增的硬件来处理,这个硬件就叫MMU
,也叫内存管理单元。MMU
的任务只要一个,就便是翻译地址。程序履行的时分只会去找虚拟地址,这个时分程序拜访的虚拟地址是接连的,而虚拟地址和物理地址的翻译统统交给MMU
去处理,把虚拟地址翻译成物理地址,再去物理地址找对应的数据。
一、虚拟地址和物理地址数据如何对应
它们之间的对应联系并不是按每个字节去翻译,而是按一块的数据去翻译,一个块具体有多大,能够翻开终端输入:
jonytang@Mac ~ % PAGESIZE
得到
4096
注:也有些人的电脑可能是
16384
4096
表明在当前操作体系,每个块的巨细是4KB
(16384
便是16KB
,这里默认4KB
为标准),这个4096
便是内存中的一页,计算机用page
来表明,内存的分页便是这么来的,每4KB
为一页。
二、分页技能
- 这个分页为了处理程序分段存在的问题,页的巨细是固定的,而段是不固定的,由程序本身的巨细决议 。
- 假设内存巨细是
100M
,现在有3
个程序A
、B
和C
,别离有30M
、40M
和50M
的巨细,假设先加载了A
和B
,那么C
的50M
巨细超过了内存的余量30M
,这样内存就不足以加载C
程序,形成了30M
的糟蹋,内存运用率过低,假如要处理该问题,就需求先把最不活跃的程序在内存开释掉,假设是A
最不活跃,那就先写进硬盘,然后开释A内存去加载C
,可是因为A
有几十M,而且是操作硬盘的写入,所以速度会很慢。 - 而分页尽管也存在着内存不足的状况,可是每一页只要
4KB
,这个读写进硬盘的速度远高于几十M的程序写进内存;别的因为一页只要4KB
,每次依照4KB
去取内存写入,这样也不存在一次性有几十M内存糟蹋的状况。
运用虚拟内存处理了物理内存的一次性加载大块内存的问题,同时也处理了安全问题,假如外部拜访了虚拟内存的数据,因为每个进程虚拟内存的数据是独立的,因此是无法经过当前进程的地址去拜访其他进程的数据,而进程和进程之间的通信,只能经过体系的接口去拜访。
三、缺页中止
假设进程一启动的时分 咱们需求加载它的P1
、P3
和P5
这三页,现在运用P2
这一页,而这个时分P2
还没有被加载进内存,这个时分就会呈现缺页异常也叫缺页中止,这个时分体系会将P2
加载到内存里边
四、内存分配原则
内存的分配原则是哪里有空余内存就分配到哪里,假如体系运转了一段时间,内存被运用到占满,这时体系会将不活跃的给开释掉,然后把现在需求用这个的这一页将其加载进内存,这个过程被称为页面置换。这便是手机开启多个程序一段时间后,再点开好久没有翻开的运用,会看到该软件的启动界面,便是该进程不活跃,其在内存中的数据被新的运用给掩盖,这便是运用了计算机虚拟内存处理多个进程呈现的现象。
五、rebase
接下来是关于rebase
,rebase
的呈现是虚拟内存也存在一个问题,前期运用程序被加载到内存的时分,它的地址是随机的,便是可履行文件数据拜访的拜访,每次都是随机的。在运用物理地址每次地址随机,它的好处是便是比较安全,能够防止攻击者能够经过有规律的地址来获取一些数据,可是运用虚拟内存每次都是从0
开端,虚拟内存的安全性就相对不高,针对这个问题,操作体系运用了一种新的方式来处理,便是ASLR
(地址空间随机化)。ASLR
让虚拟地址不是从0
开端,而是一个随机的值开端,这样程序每次启动的虚拟地址都是随机的。
偏移能够经过一个可履行文件来查看
用MachOView
翻开,随意挑选一个Section64
,能够看到偏移Offest
Offest
的地址是偏移后的地址,所以需求加ASLR
之后才干找到真正的地址,而Offest + ASLR
这个操作就叫rebase
。