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

ARMv8 MMU页表格式及地址转换过程分析

1.简介

CPU发出的虚拟地址经过MMU转换后得到物理地址,然后使用物理地址访问真实的硬件。虚拟地址和物理地址的映射关系保存在页表中,MMU需要遍历页表,才能将虚拟地址转换成物理地址。ARM64现在有两种大小的页表描述符,分别是ARMv8的64-bit描述符(一个页表描述符8字节),ARMv9的128-bit描述符(一个页表描述符16字节)。本文只介绍ARMv8的64-bit描述符。

2.页表类型

如下图所示,页表描述符的bit[1:0]表示类型。ARMv8的页表有四种类型,分别是Invalid descriptor、Block descriptor、Table descriptor和Page descriptor,具体如下:

  1. bit[1:0] == 0b0x:表示Invalid descriptor,此时MMU若使用该页表描述符进行地址转换,会触发Translation Fault。
  2. bit[1:0] == 0b10:如果不是第三级页表,则为Block descriptor。如果是第三级页表,则保留,可以看作是无效的页表描述符。Block descriptor和Page descriptor类型一样,定义了访问物理内存的属性和地址,并且没有下一级页表。Block descriptor专门应用于HugePage的映射,有的情况下只需要一个页表描述符即可完成地址映射,无需多级页表,这样可以加快MMU地址转换速度。比使用48位虚拟地址和4级页表的情况下,当映射1GB内存时,只需要一个level1 Block descriptor即可.
  3. bit[1:0] == 0b11:如果不是第三级页表,则为Table descriptor,如果是第三级页表,则为Page descriptor。Table descriptor为中间页表,用于指向下一级页表。Page descriptor为最后一级页表,定义了访问物理内存的属性和地址。

页表类型

3.页表格式

下面介绍Block descriptor、Table descriptor和Page descriptor三种页表描述符的格式。

3.1.Table descriptor

下图是不同地址宽度和不同页表大小情况下,Table descriptor的格式。我们主要关注48-bit地址位宽和4KB页表大小时Table descriptor的格式,在这种情况下m==12,下一级页表的基地址保存在bit[47:12],下一级页表属性保存在bit[63:59]。
Table_descriptor
页表属性如下图所示。

Table_descriptor页表属性

3.2.Block descriptor

下图是不同地址宽度和不同页表大小情况下,Block descriptor的格式。当地址位宽为48-bit,页表大小为4KB时,Block descriptor只能是level1或者level2的页表,level1页表n==30,level2页表n==21,转换后的物理内存基地址保存在bit[47:n]。当地址位宽为52-bit,页表大小为4KB时,Block descriptor只能是level0、level1或者level2的页表,level0页表n==39,level1页表n==30,level2页表n==21,转换后的物理内存基地址OA[51:48]保存在bit[15:12],其他地址保存在bit[47:n]。

Block_descriptor

Block descriptor转换的物理内存的访问属性如下图所示。

Block_descriptor内存属性

3.3.Page descriptor

下图是不同地址宽度和不同页表大小情况下,Page descriptor的格式。当地址位宽为48-bit,页表大小为4KB时,bit[47:12]定义了访问物理内存的基地址,Upper attributes和Lower attributes定义了物理内存的访问属性。

Page_descriptor

4.地址转换过程

下图展示了MMU将虚拟地址转换成物理地址的过程。

4.1.39bit-3Level-4KB

39bit-3Level-4KB

4.2.48bit-4Level-4KB

48bit-4Level-4KB

4.3.48bit-3Level-16KB

48bit-3Level-16KB

参考资料

  1. Arm ® Architecture Reference Manual for A-profile architecture。
  2. ARM® Cortex ® -A Series Programmer’s Guide for ARMv8-A。
http://www.xdnf.cn/news/17498.html

相关文章:

  • 当配置项只支持传入数字,即无法指定单位为rem,需要rem转px
  • js零基础入门
  • java之父-新特性
  • 如何搭建ELK
  • 李宏毅深度学习教程 第16-18章 终身学习+网络压缩+可解释性人工智能
  • LeetCode 刷题【36. 有效的数独】
  • 【Datawhale AI夏令营第三期】多模态RAG
  • c++ 容器vector基础
  • 【递归、搜索和回溯】FloodFill 算法介绍及相关例题
  • Zread:把 GitHub 仓库“一键变说明书”的体验与实战指南
  • AutoML 的下半场——从“模型选择”到“端到端业务闭环”
  • Redhat Linux 9.6 配置本地 yum 源
  • Java类和对象课上练习题目设计
  • 计算机网络:CIDR地址块如何划分子网
  • 24SpringCloud黑马商城微服务整合Seata重启服务报错的解决办法
  • Day 36: 复习
  • 【机器学习深度学习】模型选型:如何根据模型的参数算出合适的设备匹配?
  • 05.【数据结构-C语言】栈(先进后出,栈的实现:进栈、出栈、获取栈顶元素,栈实现代码,括号匹配问题)
  • [Oracle] SUBSTR()函数
  • [CUDA] CUTLASS | `CuTe DSL` 创新
  • 化工安防误报率↓82%!陌讯多模态融合算法实战解析
  • ARM CPU 安全更新:Training Solo(关于 Spectre-v2 攻击中域隔离机制的局限性)
  • 在ubuntu服务器下安装cuda和cudnn(笔记)
  • 基于Prometheus、Grafana、Loki与Tempo的统一监控平台故障排查与解决方案
  • 3款强力的Windows系统软件卸载工具
  • STM32的中断系统
  • 大数据与财务管理:未来就业的黄金赛道
  • 第4章 程序段的反复执行4.2while语句P128练习题(题及答案)
  • Mistral Small 3.1 架构深度解析:高效小型模型的巅峰之作
  • 直接插入排序算法:可视化讲解与C语言实现