内存管理技术一:页表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存管理技术一:页表相关的知识,希望对你有一定的参考价值。

参考技术A 操作系统分为用户模式和内核模式,riscv架构也分为特权架构和非特权架构。特权架构指的是因为定时器中断,异常和系统调用等情况,进程从用户模式切换到内核模式时,对一些特权架构的寄存器进行一系列的操作,也是用户态和内核态可以进行分离的实现原理。

Satp(Supervisor Address Translation and Protection Register) 寄存器是虚拟地址转换的一个非常重要的寄存器,下图展示了stap寄存器的内容。

如果直接将虚拟地址一一对应映射到物理地址,那么对于页表机制的空间需求太大了。
比如全中国14亿人,如果每个人的信息都是中国浙江嘉兴海宁奕斯伟xxx,那么14亿人占据的信息大小就会非常大。而如果对信息进行分类,比如同属中国,保留34个省,再保留下面的县,那么需要保存的数据量将会变得非常小(类似于填写快递收货地址)。页表的分页机制就是类似这种原理。

先来看虚拟地址的组成:

再来看转换后的物理地址:

页表项(page table entry)是页表中存储的内容,是寻址的媒介与核心。sv32中,页表包含了2^10个PTEs,每个页表项为4个字节。下图展示了PTE的组成。

V位表示PTE是否有效,如果V=0,则PTE中的其他位是无效的。R,W,X分别表示页的可读,可写,可执行权限。当这三位都为0时,PTE中的PPN表示的是指向下一级页表的物理页号。下图表示的是,XWR在不同的权限位时,PTE的含义。

RSW保留供supervisor模式下使用,此处可以暂时忽略。
每个lead PTE(即表示虚拟地址对应物理页号的PTE)都包含A(access)和D(dirty)位。其中A位表示虚拟页在上次A被清零之后是否被读/写/执行过。D位表示虚拟页在D位上次被清零之后是否被写过。正常情况下将A和D位置1来提高效率。对于non-leaf PTE,D,A,U位被保留用作未来的标准使用,并且必须被软件清零。

Sv32虚拟地址va被转化成物理地址pa的过程如下:

32位操作系统的页表转换只有sv32一种,已经在2.3.4中详细讲述。64位操作系统根据satp寄存器的MODE位可以分为sv39和sv48等多种页表转换方式,但原理其实和sv32差不多。sv39采用的是三级页表,sv48为四级页表,下图分别展示了在sv39和sv48时的虚拟地址,物理地址和页表项pte。

下图来自MIT的xv6操作系统课程对sv39三级页表映射方案从虚拟地址到物理地址地址转换的总结。

产生page fault的情况有很多种,比如因为懒加载机制,并没有给当前虚拟地址分配物理地址;根据地址转换的安全性检查,也会产生page fault;或者pte因为物理存储机制被存放至磁盘空间,也需要page fault进行swap等等。本章节将会讲述产生page fault的原因,后续章节中会讲述xvisor是如何具体处理page fault的。下图展示了在地址转换的过程中出现page fault的情形:

内核空间的处理比较简单,也不容易出现page fault的情况,只要处理vmalloc即可。对于用户空间来说,page fault的处理要考虑的情况比较多。首先要对虚拟地址的合法性进行检查。如果一个地址不在合法的VMA区间内,就判定为bad area,并处罚segmentation fault。如果在地址合法的情况下,首先考虑是否是因为用户控件的malloc懒加载机制。
因为malloc是动态分配内存机制,并且为了节省内存,内核并不会立刻为其分配物理内存,而是只是对vma进行信息记录。当地址真正被使用到的时候,处罚page fault,通过mmap建立对应的heap和stack内存区域的映射。在x86的实现机制中,还有一种情况(riscv的linux需要考证),就是在pte页表项的P位为0时,表明该页表项是存在的。只是从内存空间拷贝至了外部磁盘空间,需要调用swap_page将页面的内容拷贝回内存。

MIT操作系统课程
兰新宇:linux内核和虚拟化博客
riscv特权架构文档
微信读书:qemu/kvm源码解析与应用
《系统虚拟化》

Linux 内核 内存管理内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

文章目录





一、Linux 内核中的内存管理模块



Linux 内核还需要处理如下内容 :

① 页错误异常处理

② 页表管理

③ 引导内存分配器 : 页分配器 , 块分配器 , 不连续页分配器 , 连续内存分配器 , 每处理器内存分配器 ;

  • " 页分配器 " 负责分配 内存物理页 , 使用的是 " 伙伴分配器 " ;
  • " 不连续页分配器 " 提供了 vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请的 " 不连续物理页 “ 可以 映射到 ” 连续的虚拟页 " ;

④ 内存碎片整理

⑤ 内存耗尽处理

⑥ 内存控制组 : 控制管理 被 进程 占用的 内存 ;

  • 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理页 , 需要通过 整理内存碎片 并迁移数据 得到 连续的 物理页 ;
  • 内存回收 : 内存不足时 , 回收内存 ;

⑦ 页回收处理





二、硬件设备内存管理



硬件设备内存管理 :

① CPU 处理器 中的 " 内存管理单元 " ( MMU ) 高速缓存 ;

② 物理内存


" 内存管理单元 " ( MMU ) 中 , 还有一个 " 页表缓存 " ;

页表缓存 中缓存了 最近使用的 " 页表映射 “ , 该映射的作用是 将 ” 物理地址 " 映射为 " 虚拟地址 " ;


CPU 处理器 与 内存 访问速度不匹配 , 增加了 " 高速缓存 " 机制 ;

  • 一级缓存 : 数据缓存 , 指令缓存 ;
  • 二级缓存 : 协调 内存 与 一级缓存 ;

以上是关于内存管理技术一:页表的主要内容,如果未能解决你的问题,请参考以下文章

Linux 操作系统原理 — 虚拟内存管理

arm-linux内存管理学习笔记-内存页表的硬件原理

Linux 内核 内存管理内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

Linux 内核 内存管理内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

arm-linux内存管理学习笔记-内存页表的硬件原理

arm-linux内存管理学习笔记-内存页表的硬件原理