为了支持二级页表,我们需要对虚拟地址的 VPN 部分进行细分

为了支持分段,MMU 中现在不止一对基址加界限寄存器,而是需要三组。这种分段方法带来了一个问题:给定一个虚拟地址,如何判断该地址所属的段 如果我们不知道所属的段,就无法访问正确的基址寄存器和界限寄存器。一种可行的判断方法,是对虚拟地址进行切分,比如虚拟地址 4200,它处于堆中,我们将地址的高二位解释为地址所属段的编号,剩下的位就是在段内的字节偏移量: 分段虚拟地址   为了支持二级页表,我们需要对虚拟地址的 VPN 部分进行细分 热门话题 分段方法比较好地解决了内部碎片的问题,却又带来了一个新问题:每个进程的各个段大小可以不同,随着物理内存的不断切分,可能会出现许多较小的空闲空间,这些空间太小以至于无法被别的段所使用,即使所有空闲空间的总和大于段大小,也无法被利用,这种问题称为外部碎片。 分段中外部碎片的起因就是各个段的大小不一,如果我们同样对地址空间进行分割,分割出来的每个页固定大小,比如 4KB,这样就不会有外部碎片的问题了。然后我们在虚拟内存页和物理内存页之间建立一个映射关系,比如下图中,,和,我们将每个进程的这种映射关系保存在一个数据结构中,称为页表。 分页示例   为了支持二级页表,我们需要对虚拟地址的 VPN 部分进行细分 热门话题 有了页表之后,每次要想知道虚拟内存在哪,只要去内存中查下表就行了,听起来貌似很简单,但是和分段类似,为了知道虚拟页对应的物理帧的编号记录在页表的哪个条目上,我们需要对虚拟地址进行切分。 如下图所示,虚拟内存大小为 64B,物理内存大小为 128B,每个虚拟页的大小为 16B,所以我们可以将虚拟内存分为 4 页,对每个虚拟页进行编号需要 2位,每个页 16B 需要 4 位的偏移量来描述,加起来正好 6 位。所以我们将虚拟地址的高二位解释为虚拟页号,剩下 4 位解释为页内偏移量。 地址转换过程   为了支持二级页表,我们需要对虚拟地址的 VPN 部分进行细分 热门话题 现在假设我们的页表只是一个线性数组,我们使用 VPN 对该数组进行索引,得到一个页表条目,一个 32 位 x86 页表条目结构如下图所示: x86 页表条目   为了支持二级页表,我们需要对虚拟地址的 VPN 部分进行细分 热门话题 分页机制虽然好用,但是也存在着一些问题。 第一个问题就是页表大小。假设我们虚拟地址 32 位,页大小为 4KB,我们就需要将虚拟内存切为 个虚拟页,为了保存这些页的映射关系,我们的页表的长度也得是 ,如果每个 PTE 的大小是 4B,光是保存一个进程的页表就得占用 字节,如果有 100 个进程就得占用 400MB 的物理内存,这显然是无法接受的。 第二个问题就是翻译速度。由于页表保存在内存中,每次对虚拟地址的转换都得进行一次内存访问,程序执行速度变成了原来的一半。

先来解决第二个问题,参考缓存的思想,我们可以将经常访问的映射关系放在一个特殊的缓存硬件中,每次进行地址转换的时候都先去查询 VPN 对应的 PFN 在不在缓存硬件里面,在的话就皆大欢喜,不在就得老老实实去找页表要了。 这样的一个硬件称为地址转换旁路缓冲存储器,简称 TLB。TLB 中保存的每个条目结构为 ,其他位中可以包括有效位,保护位,脏位和地址空间标识符,各个位的含义这里不再赘述。 接着解决第一个问题,页表太大的原因,在于我们将所有映射关系保存在一个页表中,即使有的映射关系并不存在,也得在页表中占一个位置。如果我们能对一个页表进行拆分,拆成一个页目录和多个实际保存映射关系的页表,页目录中的每一个条目指向一个页表,不存在实际映射关系的页表可以不被分配内存,这样就能节省很多空间,如下图右侧所示。 线性和二级页表   为了支持二级页表,我们需要对虚拟地址的 VPN 部分进行细分 热门话题 为了支持二级页表,我们需要对虚拟地址的 VPN 部分进行细分。假设我们的虚拟地址空间为 16KB,页大小为 64B,PTE 大小为 4B,为了完成映射,线性页表中需要有 个 PTE,共占用 1KB 空间。现在每个页可以容纳 个 PTE,如果将页表拆成 个小页表,对这些小页表进行编号需要 4 位,每个小页表中保存的 PTE 编号也需要 4 位,剩下 6 位作为页内偏移量。 二级页表虚拟地址拆分   为了支持二级页表,我们需要对虚拟地址的 VPN 部分进行细分 热门话题 现在来思考一个问题:如果系统有许多个进程,他们把物理内存给榨干了,这时候又来了一个新的进程,它要求系统给它分配几个页来保存代码,但是现在内存满了,该怎么办 解决这个问题的思路,就是在硬盘上开辟一部分空间,称为交换空间,用于物理页的移入和移出。需要从物理页中挑出一个受害者,把它暂时保存到交换空间中,这样才能腾出空间给新进程。等到进程要用到这个被换出的页时,就从硬盘中重新加载它。挑选受害者的方法有很多,比如先入先出,随机挑选和 LRU 算法,由于 LRU 算法需要维护的信息比较多,所以可以采用时钟替换算法来近似,这里不再赘述。 虚拟内存还有许多知识点这里没有写到,大家可以阅读《操作系统导论》中的相关章节来自行学习。《操作系统导论》采用循序渐进的写法,由易到难,将虚拟内存的面纱一层层解开,比起《深入理解计算机系统》中直接抛出一大堆虚拟内存概念而言,《操作系统导论》的写法更符合人类的认知过程,因此墙裂推荐这本书,以上~~


发表评论

Copyright 2002-2022 by 五一安防系统网(琼ICP备2022001899号-3).All Rights Reserved.