Binder面试系列——内存管理单元

空间只是虚拟地址空间的一个子集。如一台内存为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.4.1 CPU在执行指令与数据时,获得的是虚拟内存的地址。

但是CPU只能去物理内存寻址。此时,MMU就派上用场了。MMU负责,将虚拟地址,翻译成,真

正运行时的物理地址。

MMU是如何将虚拟地址翻译成物理地址的,这个后面讲。现在先要了解一下交换区的概念。

交换区: 实际上就是一块磁盘空间(硬盘空间)。虚拟内存与物理内存映射的时候,是将虚拟内

存的代码放到交换区中,以后在CPU想要执行相关的指令或者数据时,如果内存中没有,先去交换

区将需要的指令与数据映射到物理内存,然后CPU再执行

虚拟内存与交换取的这种概念,实现了大内存需求量的(多个)进程,能够(同时)运行在较小的

物理内存中。如下图所示:

上图中,说的是进程的局部代码在物理内存中运行。是因为程序具有局部性原则,所以在某一段很

小的时间段内,只有很少一部分代码会被CPU执行。

到这里,我们应该大致明白了虚拟内存的作用与简单机制。还剩下MMU如何翻译虚拟地址为物理地址的,这放到最后讲解。现在先总结一下虚拟内存机制:

虚拟内存需要重新映射到物理内存虚拟地址映射到物理地址中的实际地址

每次只有进程的少部分代码会在物理内存中运行

大部分代码依然位于磁盘中(存储器硬盘)

1.4.2、 页式内存管理

上一节笼统的介绍了虚拟内存的概念。接下来学习内存管理中的一种方式:页式内存管理。

页式内存管理中我们需要了解:

  • 页的概念
  • 页表的概念
  • 缺页的概念与页命中的概念
  • 分配页面
  • 程序的局部性原则

1.4.2 页的概念

我们知道了交换区。我们知道交换区里面存放的是大部分的可执行代码与数据。而物理内存中,执行的是少部分的可执行代码与数据。

那么此时就需要从交换区获取程序的代码,将它拿到物理内存执行。**那么一次拿多少代码过来呢?这是

一个问题!**

为了CPU的高效执行以及方便的内存管理,每次需要拿一个页的代码。这个页,指的是一段连续的存储空间(常见的是4Kb),也叫作块。

假设页的大小为P。在虚拟内存中,叫做虚拟页(VP)。从虚拟内存拿了一个页的代码要放到物理内存,那么自然物理内存也得有一个刚好一般大小的页才能存放虚拟页的代码。物理内存中的页叫做物理页(PP)

在任何时刻,虚拟页都是以下三种状态中的一种:

  • 未分配的:VM系统还未分配的页(或者未创建)。未分配的页还没有任何数据与代码与他们
  • 相关联,因此也就不占用任何磁盘。
  • 缓存的: 当前已缓存在物理内存中的已分配页
  • 未缓存的:未缓存在物理内存中的已分配页

下图展示了一个8个虚拟页的小虚拟内存。其中:虚拟页0和3还没有被分配,因此在磁盘上还不存

在。虚拟页1、4、 6被缓存在物理内存中。虚拟页2、 5、 7已经被分配,但是还没有缓存到物理内存中

去执行。

1.4.3 页表的概念

虚拟内存中的一些虚拟页是缓存在物理内存中被执行的。理所应当,应该有一种机制,来判断虚拟页,是否被缓存在了物理内存中的某个物理页上。如果不命中(需要一个页的代码,但是这个页未缓存在物理内存中),系统还必须知道这个虚拟页存放在磁盘上的哪个位置,从而在物理内存中选择一个空闲页或者替换一个牺牲页,并将需要的虚拟页从磁盘复制到物理内存中。

这些功能,是由软硬件结合完成的。 包括操作系统软件,MMU中的地址翻译硬件,和一个存放在物理内存中的页表的数据结构。

上一节说将虚拟页映射到物理页,实际上就是MMU地址翻译硬件将一个虚拟地址翻译成物理地址时,都会去读取页表的内容。操作系统负责维护页表的内容,以及在磁盘与物理内存之间来回传送页。

下图是一个页表的基本组织结构

如上图所示:

页表实际上就是一个数组。这个数组存放的是一个称为页表条目(PTE)的结构。虚拟地址空间的每一个页在页表中,都有一个对应的页表条目(PTE)。虚拟页地址(首地址)翻译的时候就是查询的各个虚拟页在页表中的PTE,从而进行地址翻译的。

现在假设每一个PTE都有一个有效位和一个n位字段的地址。其中

  • 有效位:表示对应的虚拟页是否缓存在了物理内存中。0表示未缓存。1表示已缓存。
  • n位地址字段:如果未缓存(有效字段为0),n位地址字段不为空的话,这个n位地址字段就表示该虚拟页在磁盘上的起始的位置。如果这个n位字段为空,那么就说明该虚拟页未分配。如果已缓存(有效字段为1),n位地址字段肯定不为空,它表示该虚拟页在物理内存中的起始地址。

综上分析,就得知,上图中:四个虚拟页VP1 , VP2, VP4 , VP7 是被缓存在物理内存中。 两个虚拟页VP0, VP5还未被分配。但是剩下的虚拟页VP3 ,VP6已经被分配了,但是还没有缓存到物理内存中去执行。

注意:任意的物理页,都可以缓存任意的虚拟页。(因为物理内存是全相联的)

1.4.3 页命中

考虑下图的情形:

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值