内存管理——页表、页表项、页目录、多级页表

一、背景

固定分区会产生内部碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低,我们希望内存的使用能尽量避免碎片的产生。并且我们如果直接使用物理内存,在编写程序时,就需要时刻关心分配的物理内存地址是多少、内存空间够不够等问题。

二、分页机制

为了解决以上问题,设计人员对内存进行了抽象,把进程使用的内存抽象成进程地址空间或虚拟内存。进程就不用再关心分配的内存在哪个物理地址上,它只管使用。而由处理器来处理进程对内存的请求,经过某种转换,把进程请求的虚拟地址(virtual address)转换成物理地址(physical adress),这个转换过程称为地址转换(address translation)。

我们在处理器里对进程地址空间做了抽象,让进程感觉到自己可以拥有全部的物理内存。进程
可以发出地址访问请求,至于这些请求能不能完全满足, 那就是处理器的事情了。总之,进程
地址空间是对内存的重要抽象, 让内存虚拟化得到了实现。

分页机制的核心思想是让程序中一部分不使用的内存可以存放到交换磁盘中, 而程序正在使用的内存继续保留在物理内存中。在使能了分页机制的系统中,处理器直接寻址虚拟地址,这个地址不会直接发给内存控制器, 而是先发送给内存管理单元(Memory Management Unit, MMU)。 MMU负责虚拟地址到物理地址的转换和翻译工作。

三、页面

在虚拟地址空间里可按照固定大小来分页,典型的页面粒度为 4 KB,8KB或16KB等,而在物理内存中, 空间也分成和虚拟地址空间大小相同的块, 称为页帧(page frame)。程序可以在虚拟地址空间里任意分配虚拟内存,但只有当程序需要访问或修改虚拟内存时,操作系统才会为其分配物理页面, 这个过程叫作请求调页(demand page)或者缺页异常(page fault)。

四、页表

虚拟地址 VA[31:0]可以分成两部分: 一部分是虚拟页面内的偏移量, 以 4 KB 页为例,VA[11:0]是虚拟页面偏移量;另一部分用来寻找属于哪个页,这称为虚拟页帧号(Virtual Page Frame Number, VPN)。

物理地址中, PA[11:0]表示物理页帧的偏移量, 剩余部分表示物理页帧号(Physical Frame Number, PFN)。 MMU 的工作内容就是把虚拟页帧号转换成物理页帧号。
处理器通常使用一张表来存储 VPN 到 PFN 的映射关系,这张表称为页表(Page Table, PT)。
页表中的每一项称为页表项(Page Table Entry, PTE)。

若将整张页表存放在寄存器中,则会占用很多硬件资源,因此通常的做法是把页表放在主内存里,通过页表基地址寄存器来指向这种页表的起始地址。 如图 所示, 处理器发出的地址是虚拟地址, 通过 MMU 查询页表, 处理器便得到了物理地址,最后把物理地址发送给内存控制器。
 

下面以最简单的一级页表为例, 如图 所示, 处理器采用一级页表, 虚拟地址空间的位
宽是 32 位,寻址范围是 0~4 GB,物理地址空间的位宽也是 32 位,最多支持 4 GB 物理内存。
另外,页面的大小是 4 KB。为了能映射整个 4 GB 地址空间,需要 4 GB/4 KB = _{2}^{20}个页表项,
每个页表项占用 4 字节,需要 4 MB 大小的物理内存来存放这张页表。

VA[11:0]是页面偏移量,VA[31:12]是 VPN,可作为索引值在页表中查询页表项。页表类似于数组, VPN 类似于数组的下标,用于查找数组中对应的成员。页表项包含两部分: 一部分是 PFN,它代表页面在物理内存中的帧号(即页帧号), 页帧号加上 VA[11:0]页内偏移量就组成了最终物理地址(PA);另一部分是页表项的属性,比如图 中的 V 表示有效位。

若有效位为 1, 表示这个页表项对应的物理页面在物理内存中,处理器可以访问这个页面的内容; 若有效位为 0,表示这个页表项对应的物理页面不在内存中, 可能在交换磁盘中。 如果访问该页面, 那么操作系统会触发缺页异常,可在缺页异常中处理这种情况。当然,实际的处理器中还有很多其他的属性位,比如描述这个页面是否为脏页、是否可读写等


 

 

 五、多级页表

因为页表一定要覆盖全部虚拟地址空间,所以在 32 位的环境下,虚拟地址空间共有 4GB,假设一个页的大小是 4KB(2^12),那么就需要大约 100 万 (2^20) 个页,每个「页表项」需要 4 个字节大小来存储,那么整个 4GB 空间的映射就需要有 4MB 的内存来存储页表。每个进程都需要使用 4MB 的内存来存储页表,所以会占据比较大的内存空间。

对于一级页表来说总大小是4M,我们将它分为1024个4K页,而不是统一放到一个页表中(1M个PTE),因为我们都是以4K为单位。这样每个二级页表就被分为1024个页表项,也表示4G的内存空间。然后我们增加一层页表目录,来管理这1K个4K页,就叫二级页表。这个目录叫做一级页表,也叫PDE,PDE大小为4K。这时,二级页表有1024个4K,所以我们只用一个页目录4K就可以表示4G的物理内存他是常驻内存的。当我们申请物理内存时,我们就可以动态创建一个4K二级页表,对应4M的物理内存。我们想申请8M内存,我们就创建2个4K的二级页表。非常节省空间。

因为二级页表项只有在需要的时候才会被创建。所以可以通过多级页表的方式解决空间问题,比如使用二级页表的方式,原本需要 100多万个页表项才能表示所有虚拟地址,现在就只需要 1024 个页表项了。

 

六、处理器的实现

ARM64 处理器内核的 MMU 包括 TLB(Translation Lookaside Buffer) 和页表遍历单元(Table Walk Unit,TWU) 两个部件。 TLB 是一个高速缓存,用于加速虚拟地址到物理地址转换过程, 缓存页表转换的结果, 从而缩短页表查询的时间。

一个完整的页表翻译和查找的过程叫作页表查询,页表查询的过程由硬件自动完成,但是页表
的维护需要软件来完成。 页表查询是一个较耗时的过程。 理想的状态下, TLB 里应有页表的相
关信息。

当 TLB 未命中时, MMU 才会查询页表, 从而得到翻译后的物理地址。 页表通常存储在内存中。得到物理地址之后,首先需要查询该物理地址的内容是否在高速缓存中有最新的副本。如果没有,则说明高速缓存未命中,需要访问内存。

MMU 的工作职责就是把输入的虚拟地址翻译成对应的物理地址以及相应的页表属性和内存访问权限等信息。另外,如果地址访问失败,那么会触发一个与 MMU 相关的缺页异常。

参考:

页表、物理地址、逻辑地址、页面置换算法 - 廿陆 - 博客园

分页内存管理-CSDN博客 

一级页表与二级页表-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值