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

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.dtcms.com/a/322294.html

相关文章:

  • [CUDA] CUTLASS | C++ GEMM内核--高度模板化的类
  • 快速使用selenium+java案例
  • 系统开发 Day1
  • PyLS简介
  • NumPy性能飞跃秘籍:向量化计算如何提升400倍运算效率?
  • 【C++详解】AVL树深度剖析与模拟实现(单旋、双旋、平衡因⼦更新、平衡检测)
  • 云服务器--阿里云OSS(2)【Springboot使用阿里云OSS】
  • Datawhale AI夏令营-记录2
  • Kotlin初体验
  • 【linux基础】Linux 文本处理核心命令指南
  • 代码随想录day59图论9
  • NY151NY152美光固态闪存NY153NY154
  • 利用whisper api实现若无字幕则自动下载音频并用 whisper 转写,再用 LLM 总结。
  • JVM相关(AI回答)
  • 等保测评-RabbitMQ中间件
  • 【Java EE初阶 --- 网络原理】JVM
  • 从零玩转Linux云主机:免费申请、连接终端、命令速查表
  • 分析报告:基于字节连续匹配技术的KV缓存共享实施可能性及其扩展
  • ✨ 基于 JsonSerialize 实现接口返回数据的智能枚举转换(优雅告别前端硬编码!)
  • 【Linux】Socket编程——UDP版
  • (nice!!!)(LeetCode 面试经典 150 题) 146. LRU 缓存 (哈希表+双向链表)
  • Go语言实战案例:文件上传服务
  • 香橙派 RK3588 部署千问大模型 Qwen2-VL-2B 推理视频
  • 在Docker中下载RabbitMQ(详细讲解参数)
  • BGP 笔记
  • C语言gdb调试
  • 母线电压采样芯片的四大类——汽车级选型对比表
  • 101和201复制卡技术难点与解决方案
  • Express中间件和路由及响应方法
  • 软件定义车辆加速推进汽车电子技术