news 2026/3/27 22:56:45

虚拟地址到物理地址与FEAT_VIPT

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
虚拟地址到物理地址与FEAT_VIPT

文是我读ARM手册时根据自己的理解做的一些记录

虚拟地址(VA)到物理地址(PA)的转换是由 MMU(内存管理单元) 和 页表机制完成的。具体过程如何我举例分享一下我的理解

ARM64 虚拟地址结构(假设 4KB 页大小)

介绍转换过程之前先来介绍虚拟地址构成

虚拟地址一般使用四级页表结构,通常是 48 位,分段如下:

VA[47:39] VA[38:30] VA[29:21] VA[20:12] VA[11:0]

PGD(Page Global Directory)一级页表 PUD(Page Upper Directory)二级页表 PMD(Page Middle Directory):三级页表 PTE(Page Table Entry):四级页表/物理页 Offset 页内偏移/页内具体地址

比如地址 0x01234567

VA[47:39] = 0x0 → PGD 索引

VA[38:30] = 0x0 → PUD 索引

VA[29:21] = 0x91 → PMD 索引

VA[20:12] = 0x1A → PTE 索引

VA[11:0] = 0x567 → 页内偏移

MMU(Memory Management Unit)介绍

MMU是处理器中的一个硬件模块,主要负责:

虚拟地址 → 物理地址转换

访问权限检查(如只读、用户/内核态)

缓存控制(决定哪些地址可缓存)

触发异常(如页错误、权限错误)

本文其实就是在讲它的一部分工作过程。

TLB(Translation Lookaside Buffer)介绍

介绍转换过程之前先来介绍TLB,TLB是一个硬件缓存,缓存最近的 VA→PA 映射,用来加速地址转换,物理上在 MMU 内部或旁边。

TLB 存储的内容包括

键(Key):虚拟页号(VPN)即虚拟地址高位

值(Value):物理页帧地址(PPN)+ 权限等信息

转换过程

比如CPU 触发指令访问请求,使用虚拟地址 0x01234567,以linux为例

MMU 会自动查询TLB,它问TLB有没有现成的转换好的物理地址?具体是指用地址的高位(如 47–12位)作为键去查找是否有对应的物理页帧地址

如果TLB 命中则返回物理地址结果,否则触发下面将要提及的页表遍历。

MMU 启动页表遍历:

从 TTBR(Translation Table Base Register)获取页表基地址

使用 VA 的各段索引依次访问 PGD → PUD → PMD → PTE

PTE 中记录了物理页的起始地址

将页内偏移加到物理页地址上,即物理页帧地址 + 页内偏移,得到最终物理地址

权限检查:MMU 检查该页是否允许读/写, 如果如果允许访问,继续执行并更新TLB,否则触发异常。

VIPT拓展

如果是要获取这个地址对应的指令内容,则需要提及ARM 架构中的 FEAT_VIPT(Virtually Indexed, Physically Tagged)指令缓存策略,

从ARM8.0开始是强制性要求,指的是用虚拟地址索引+物理地址标记来加速访问。

ARM 兼容处理器为了兼顾性能与灵活性,在指令缓存中采用 VIPT 策略,我们以一个指令访问为例,

假设虚拟地址为 VA = 0x12345678,页大小为 4KB,缓存大小为 32KB,采用 VIPT 策略。

步骤 1:使用虚拟地址索引缓存集合(Cache Set)

页大小为 4KB → 页内偏移为 12 位(VA[11:0])

假设缓存有 64 个集合(sets),需要 6 位索引 → 通常从 VA[11:6] 提取

CPU 立即用 VA 的这部分位定位到某个缓存集合,这一步不需要地址转换,速度快!

步骤 2:并行启动 TLB 查询

同时,MMU 使用虚拟地址启动页表查询或 TLB 查询

如果 TLB 命中,直接返回物理地址(PA)

如果 TLB 未命中,走页表遍历流程

这一步可能慢,但可以与索引并行进行.

步骤 3:查询缓存集合

缓存集合中一般有多个缓存行,每个缓存行都有一个 tag代表物理地址的高位,

我们用 TLB 返回的物理地址与缓存行的 tag 做比较,只有 tag 匹配才命中缓存。

tag 必须用物理地址?因为虚拟地址可能存在别名(aliasing)问题 - 两个不同的虚拟地址可能映射到同一个物理地址。

一个 64B 的缓存行大概是长这样

Tag Valid Dirty LRU bits Data[0..63]

物理地址的高 20 位 该行无/有效 数据被修改后是否已写回主存 决定哪个缓存行最久未使用 实际存储的数据块

步骤 4:命中则读取,未命中则访问主存

如果 tag 匹配 → 命中 → 直接读取缓存数据

如果 tag 不匹配 → 未命中 → 访问主存并更新缓存

VIPT总结与说明

性能优化:使用虚拟地址索引可以在地址转换完成前就开始缓存查找,提升速度。

索引使用虚拟地址:用于定位缓存行(Cache Line)

标记Tag使用物理地址:用于验证缓存行是否匹配

CPU 可以立刻用虚拟地址的部分位(通常是页内偏移)来定位缓存集合(Cache Set),不需要等待(本文第一部分提到)的MMU完成地址转换(VA → PA)

这就允许缓存查找和 TLB 查询并行进行,节省时间

硬件简化:VIPT 可以减少 TLB(Translation Lookaside Buffer)访问延迟。

如果缓存查找必须等 TLB 返回结果(如 PIPT 策略),就会引入延迟。而 VIPT 策略允许:

先用虚拟地址索引缓存

同时启动 TLB 查询以获取物理地址用于标签匹配

如果缓存命中,TLB 查询结果可以用于验证

如果缓存未命中,TLB 结果用于访问主存

这种并行机制显著减少了等待 TLB 的时间,从而提升了指令访问速度。

兼容性考虑:ARM 架构支持多种内存管理单元(MMU)配置,VIPT 更适合嵌入式系统或高性能场景。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 14:02:39

全球股市估值与太空采矿技术的经济可行性

全球股市估值与太空采矿技术的经济可行性关键词:全球股市估值、太空采矿技术、经济可行性、市场分析、投资潜力摘要:本文深入探讨了全球股市估值与太空采矿技术经济可行性之间的关联。首先介绍了研究的背景、目的、预期读者和文档结构,对相关…

作者头像 李华
网站建设 2026/3/27 9:05:37

PMSM负载估计:文献复现之旅

PMSM负载估计 负载转矩预测文献复现 永磁同步电机负载转矩估计、PMSM负载转矩测量、负载预测、转矩预测的MATLAB/simulink仿真模型,模型包可运行,配套9页的英文文献,部分章节已截图。 负载估计方法包括卡尔曼滤波、离散卡尔曼滤波、Luenberge…

作者头像 李华
网站建设 2026/3/27 10:25:33

打造三菱PLC自动售货机系统:从搭建到实现

三菱PLC自动售货机系统,系统才用三菱GXworks2软件,GTdesigner3触摸屏软件编写,包含plc触摸屏,io表,原理图,流程图,接线图,报告等在自动化控制领域,三菱PLC以其稳定性和强…

作者头像 李华
网站建设 2026/3/21 11:52:46

通达信共振指标成功率80%

{}月K:"KDJ.K"(89,3,3),COLOR00FF00; 月D:"KDJ.D"(89,3,3),COLOR00FF00,LINETHICK2; 周K:"KDJ.K"(27,3,3),COLORRED; 周D:"KDJ.D"(27,3,3),COLORRED,LINETHICK2; 日K:"KD.K"(5,3,3),COLORWHITE; 日D:"KD.D"(5,3,3…

作者头像 李华
网站建设 2026/3/26 15:39:04

Thinkphp和Laravel教室租赁自习室预约vue

目录具体实现截图项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理具体实现截图 本系统(程序源码数据库调试部署讲解)带文档1万字以上 同行可拿货,招校园代理 Thinkphp和Laravel教室租赁自习室预约vue 项目开发技术介…

作者头像 李华
网站建设 2026/3/15 1:20:51

计算机Java毕设实战-基于springboot的闲置资产管理系统的设计与实现基于SpringBoot的闲置固定资产管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华