Android Authority上的链接可能会为我们赢得佣金。了解更多
安卓智能手机的核心是Linux内核,这是一种现代多任务操作系统。它的工作是管理手机上的计算资源,包括CPU、GPU、显示器、存储器、网络等等。它还负责随机存取存储器(RAM)。应用程序、后台服务,甚至安卓本身都需要访问RAM。Linux如何划分和分配内存对智能手机的平稳运行至关重要。这就是虚拟内存的用武之地
作为一种快速复习,程序(应用程序)由代码和数据组成。启动应用程序时,代码会加载到内存中。代码从给定的点开始,一次执行一条指令。然后,数据要么从存储器中读取,要么通过网络检索,要么生成,或者三者的组合。内存中存储代码或数据的每个位置都由其地址决定。就像唯一标识一栋建筑的邮政地址一样,内存地址唯一标识RAM中的一个位置
问题是,应用程序不知道将在哪里加载到RAM中。因此,如果程序希望地址12048用作计数器,那么它必须是那个确切的地址。但该应用程序可以加载到内存中的其他地方,地址12048可能会被另一个应用程序使用
解决方案是为所有应用程序提供虚拟地址,这些地址从0开始,最高可达4GB(在某些情况下甚至更高)。然后每个应用都可以使用它需要的任何地址,包括12048。每个应用都有自己独特但虚拟的地址空间,它不需要担心其他应用在做什么。这些虚拟地址映射到RAM中某个位置的实际物理地址。Linux内核的工作是管理虚拟地址到物理地址的所有映射
虚拟内存是物理内存的数字表示,每个应用程序都有自己的专用地址空间。这意味着应用程序可以彼此独立管理和运行,因为每个应用程序都是内存自给自足的
这是包括Android在内的所有多任务操作系统的基本构建块。由于应用程序在自己的地址空间中运行,Android可以开始运行一个应用程序,暂停它,切换到另一个应用程序,运行它,等等。如果没有虚拟内存,我们一次只能运行一个应用程序
它还允许Android使用交换空间或zRAM,从而增加在被删除之前可以留在内存中的应用程序数量,为新应用程序腾出空间。你可以在下面的链接上阅读更多关于zRAM如何影响智能手机多任务处理的信息
这是虚拟内存的基础知识,所以让我们深入了解它在引擎盖下是如何工作的
为了帮助从虚拟到物理的映射,两个地址空间都被划分为称为页面的部分。虚拟空间和物理空间中的页面大小必须相同,长度通常为4K。为了区分虚拟页面和物理页面,后者被称为页面框架,而不仅仅是页面。下面是一个简化图,显示了64K虚拟空间到32K物理RAM的映射
虚拟内存(VM)中的零页(从0到4095)被映射到物理内存中的第二页帧(8192到12287)。VM中的第一页(4096到8191)映射到第1页框架(也是4096到8191),第二页映射到第五页框架,依此类推
需要注意的一点是,并非所有虚拟页面都需要映射。由于每个应用程序都有足够的地址空间,因此会有不需要映射的间隙。有时这些间隙的大小可能是千兆字节
如果应用程序想要访问虚拟地址3101(即第0页),它将被转换为第2页物理内存中的地址,具体地说是物理地址11293
现代处理器有一个专用的硬件来处理虚拟机和物理内存之间的映射。它被称为内存管理单元(MMU)。MMU拥有一个表,可以将页面映射到页面框架。这意味着操作系统不需要进行转换,它会在CPU中自动进行,速度更快,效率更高。CPU知道应用程序正在尝试访问虚拟地址,并自动将其转换为物理地址。操作系统的工作是管理MMU使用的表
MMU使用操作系统设置的页表将虚拟地址转换为物理地址。按照我们的地址3101示例,即二进制的0000 1100 0001 1101,MMU将其转换为11293(或0010 1100 0001 1101)。它是这样做的:
3101和11293之间唯一的区别是,前四位被更改为表示物理内存中的页面,而不是虚拟内存中的页面。使用页面的优点是,下一个地址3102使用与3101相同的页面框架。只有偏移量会改变,所以当地址停留在4K页面内时,MMU可以轻松地进行翻译。事实上,MMU使用一个名为Translation Lookaside Buffer(TLB)的缓存来加速翻译
翻译查找缓冲区(TLB)是MMU最近执行的翻译的缓存。在翻译地址之前,MMU会检查页到页帧的翻译是否已经缓存在TLB中。如果请求的页面查找可用(点击),则地址的翻译立即可用
每个TLB条目通常不仅包含页面和页面框架,还包含诸如内存类型、缓存策略、访问权限等属性。如果TLB不包含虚拟地址的有效条目(未命中),则MMU将被迫在页表中查找页框。由于页表本身在内存中,这意味着MMU需要再次访问内存以解决问题
2023-03-22 10:04:52