责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权、多任务多进程操作系统。
注意:学习一个知识点
很重要的一步是了解其为什么而存在?
它的存在是为了解决什么问题?
最后,在学习的过程中带着这些问题去理解、去思考
Android–Linux
内存 应用层
在许多年以前,还是使用DOS或一些古老的操作系统时,内存很小,同时,应用程序也很小,将程
序存储在内存中基本能够满足需要。随着科技的发展,图形界面及一些其他更复杂的应用出现,内存已
经无法存储这些应用程序了,通常的解决办法是将程序分割成很多个覆盖块,覆盖块0最先运行,运行结
束之后,就调用另一个覆盖块,虽然这些操作由OS来完成,但是,需要程序员对程序进行分割,这非常不高效;因此,人们想出了一个虚拟存储器(virtual memory)的方法。
虚拟存储器的基本思想是:程序、数据、堆栈的总大小可以超过内存空间的大小,操作系统将当前运行的部分保存在内存中,未使用的部分保存在磁盘中。
比如一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择可以决定哪部分4MB的程序内
容保存在内存中,并在需要时,在内存与磁盘中交换程序代码,这样16MB的代码就可以运行在4MB的机器中了
1.2.1 相关概念
地址范围、虚拟地址映射成物理地址以及分页机制
- 地址范围: 指处理器能够产生的地址集合,如一个32bit的处理器,其能产生的地址集合是**0x0000
0000 ~ 0xffff ffff(4G),这个地址范围也称为虚拟地址空间**,其中对应的地址为虚拟地址。
- 虚拟地址与物理地址: 与虚拟地址空间和虚拟地址相对应的是物理地址空间和物理地址;物理地址
空间只是虚拟地址空间的一个子集。如一台内存为256MB的32bit主机,其虚拟地址空间是0 ~
0xffffffff(4GB),
- 物理地址空间范围是0 ~ 0x0fff ffff(256M)
1.3分页机制
- 如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引
脚上,被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(**Physical
Address,以下简称PA**),如下图3-1-1所示;
如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟,而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将VA映射成PA,,如下图3-1-2。
linux使用MMU的机器都采用分页机制。虚拟地址空间以页为单位进行划分,而相应的物理地址空间也被划分,其使用的单位称为页帧,页帧和页必须保持相同,因为内存与外部存储器之间的传输是以页为单位进行传输的。
例如,MMU可以通过一个映射项将VA的一页0xb70010000xb7001fff映射到PA的一页0x20000x2fff,如果CPU执行单元要访问虚拟地址0xb7001008,则实际访问到的物理地址是0x2008。
虚拟内存的哪个页面映射到物理内存的哪个页帧是通过页表(Page Table)来描述的,页表保存在物理内存中,MMU会查找页表来确定一个VA应该映射到什么PA。
1.4.1 CPU在执行指令与数据时,获得的是虚拟内存的地址。
但是CPU只能去物理内存寻址。此时,MMU就派上用场了。MMU负责,将虚拟地址,翻译成,真
正运行时的物理地址。
MMU是如何将虚拟地址翻译成物理地址的,这个后面讲。现在先要了解一下交换区的概念。
交换区: 实际上就是一块磁盘空间(硬盘空间)。虚拟内存与物理内存映射的时候,是将虚拟内
存的代码放到交换区中,以后在CPU想要执行相关的指令或者数据时,如果内存中没有,先去交换
区将需要的指令与数据映射到物理内存,然后CPU再执行
虚拟内存与交换取的这种概念,实现了大内存需求量的(多个)进程,能够(同时)运行在较小的
物理内存中。如下图所示:
上图中,说的是进程的局部代码在物理内存中运行。是因为程序具有局部性原则,所以在某一段很
小的时间段内,只有很少一部分代码会被CPU执行。
到这里,我们应该大致明白了虚拟内存的作用与简单机制。还剩下MMU如何翻译虚拟地址为物理地址的,这放到最后讲解。现在先总结一下虚拟内存机制:
虚拟内存需要重新映射到物理内存虚拟地址映射到物理地址中的实际地址
每次只有进程的少部分代码会在物理内存中运行
大部分代码依然位于磁盘中(存储器硬盘)
1.4.2、 页式内存管理
上一节笼统的介绍了虚拟内存的概念。接下来学习内存管理中的一种方式:页式内存管理。
页式内存管理中我们需要了解:
- 页的概念
- 页表的概念
- 缺页的概念与页命中的概念
- 分配页面
- 程序的局部性原则
1.4.2 页的概念
我们知道了交换区。我们知道交换区里面存放的是大部分的可执行代码与数据。而物理内存中,执行的是少部分的可执行代码与数据。
那么此时就需要从交换区获取程序的代码,将它拿到物理内存执行。**那么一次拿多少代码过来呢?这是
一个问题!**
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
一键领取:【Android超硬核面试资料】
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全 包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。 2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图,大家可以点击这里自行获取。