当前位置: 首页 > news >正文

【CPU】页,帧,页表,页表项,三级页表

目录

页和帧

页表

页偏移

页表项

页面属性

RISC-V SV39标准

三级页表

索引方式

物理地址

玄铁C906内存管理流程(参考) 

页和帧

虚拟内存采用一种分页机制,即将虚拟内存空间以一定的大小分割成一个一个的内存块,并且将物理内存空间以同样的大小分块。虚拟内存块称为(page),物理内存块称为(frame),两者大小相同,内存块的大小也被称为页偏移(page offset),需要运行的程序就被划分为一个一个页,当需要用到某页的代码或数据时,操作系统通知硬件将该页从外存中读入内存,并占用物理内存中的一个页帧。这样,每一个程序都能够根据需要合理地分配在物理内存中。每个虚拟页有自己的虚拟页号VPN(Virtual Page Number),代表该虚拟页处在虚拟内存中哪一个内存块,对于物理页也一样。

页表

页表(Page Table)是由操作系统维护的数据结构,页表记录了虚拟页与物理页(即页帧)之间的映射关系,以及该页的属性(可读、可执行等等),通常页表是一个很大的数据结构,所以也放在内存

页偏移

指示虚拟内存被分割成的块大小,一般为4KB

页表项

每个页表项占用64 bits的空间,每个页表项由物理页号PPN和页面属性两部分组成。

页表中的一个条目就对应着一个页表项(页表由页表项组成)

页面属性

RISC-V SV39标准

标准规定了虚拟地址通过三级页表转换为物理地址。支持39位虚拟内存空间与40位物理地址空间。

39 位的虚拟地址空间决定了如何索引三级页表。具体来说,39 位虚拟地址被划分为三个 9 位的部分(VPN[2]、VPN[1] 和 VPN[0]),分别用于索引顶级页表、二级页表和三级页表。

三级页表

多级页表类似于将一个大的页表分割为了很多小的页表,将虚拟页号按高位分类,以虚拟页号的高9位、中间9位以及低9位对页进行划分,将不同的页放在页表中,不同的页表放在页目录中,由页指针指向这些页目录的首地址。

  • VPN[2](9 位):用于索引顶级页表/页目录指针(PDPTR:page directory PTR)。
  • VPN[1](9 位):用于索引二级页表/页目录(PD:page directory)。
  • VPN[0](9 位):用于索引三级页表/页表(PT:page table)。

在三级页表中,每一级页表都有可能存在叶子页表项(PTE)。但也包含着非叶子页表项,非叶子页表项中储存的物理地址为指向下一级页表的指针。

页目录指针的索引由SATP寄存器中提供的物理页号与虚拟页号的高9位拼接而成,由于页表项为64位,所以处于所有级页表的页表项低三位为0(八字节对齐)。也即一级页表访存地址为 {SATP.PPN, VPN[2], 3’b0},使用该地址去访问顶级页表/页目录指针,得到页表项,通过页表项中的属性判断是否为叶子页表项,如是,则访问页表结束,虚拟地址与物理地址之间的转换完成;如果不是,当页面属性的X、W、R均为0时表明该表项为指向下一级页表的指针,将表项中的物理地址与虚拟地址的中间9位拼接作为下一级页表的索引。

玄铁C910支持4KB,2MB,1GB三种页面大小,虚拟页号(VPN)低9位加上虚拟地址低12位作为大小为2MB页面的页偏移,VPN低18位加上虚拟地址低12位作为大小为1GB页面的页偏移。

在三级页表中,每一级页表都有可能存在叶子页表项,在页目录指针中可能存在1GB页的叶子页表项,在页目录中可能存在2MB页的叶子页表项。

索引方式

软件提供39bit的物理地址,39位的虚拟地址空间指示了三级页表中的索引方式,通过 VPN 找到页表中的目标叶子表项,而页内偏移用于确定页内的具体位置。得到页表项后,通过它包含的物理帧号以及判断页面属性是否正确,来获取最终转换过后的物理地址。

  • 39 位虚拟地址空间 决定了如何索引三级页表。虚拟地址被划分为三个 9 位的 虚拟页面号(VPN),分别用于索引顶级页表、二级页表和三级页表。
  • VPN 用于逐级查找页表,最终找到 叶子表项,而 页内偏移(Offset) 只用于确定页内的具体位置。
  • 叶子表项 包含 物理帧号(PFN) 和 页面属性。MMU 会检查页面属性,确保访问权限正确,然后将 PFN 与 Offset 组合,生成最终的 物理地址。

物理地址

最终的物理地址 = 叶子页表项中的物理页号PPN + 虚拟地址中的12bit偏移量


玄铁C906内存管理流程(参考) 


要看不懂页字了……

参考链接:玄铁C910微架构学习(13)——内存管理单元 - 知乎


http://www.mrgr.cn/news/82962.html

相关文章:

  • Java(day5)
  • Three.js 基础概念:构建3D世界的核心要素
  • java项目之网上租贸系统源码(springboot+mysql+vue)
  • arr.length 和 string.length()
  • 什么是 ERP?
  • 智能体框架——lagent初探
  • 前端开发 vue 中如何实现 u-form 多个form表单同时校验
  • JavaScript 实现支持过期时间的数据缓存功能
  • vue2新增删除
  • FPGA 20 ,FPGA按键消抖功能解析与实现
  • centOS7
  • Android Studio创建新项目并引入第三方jar、aar库驱动NFC读写器读写IC卡
  • 【Qt】C++11 Lambda表达式
  • 【线性代数】通俗理解特征向量与特征值
  • Java Spring Boot实现基于URL + IP访问频率限制
  • 《Python趣味编程》专栏介绍与专栏目录
  • 虚表 —— 隐藏行(简单版)
  • 协作式 Saga 模式
  • MP4 与Fragmented MP4 (fMP4)的区别
  • Docker: 教程07 - ( 如何对 Docker 进行降级和升级)
  • STM32学习(十)
  • 嵌入式系统 (1.绪论)
  • GCC使用说明
  • .NET体系架构
  • 编排式 Saga 模式
  • 通过gradle发布aar或jar携带sources-jar到maven nexus