ARM体系结构中虚拟地址和修改后的虚拟地址之间的区别

difference between Virtual address and Modified virtual address in ARM architecture

我是 arm 和 arm 指令集的新手。在 ARM-Cortex A8 的文档中,我看到了一些命令,如缓存刷新接受输入地址作为 MVA(修改后的虚拟地址)。 "Modified Virtual Address" 和 "Virtual Address" 之间有任何区别,如果是,如何将 32 位长的虚拟地址转换为 MVA。

修改的虚拟地址是使用快速上下文切换扩展的结果。修改后的虚拟地址在 32 位地址的上部包含一个 7 位进程 ID,要求虚拟地址的这些位为零。这允许 TLB 标记和缓存虚拟标记使用未使用进程 ID(地址 space ID)扩展(标记)的 32 位地址。

有关更多信息,请参阅波士顿大学博客 post“Tagged TLBs and Context Switching" or Gilles Chanteperdrix and Richard Cochran's paper "The ARM Fast Context Switch Extension for Linux" (PDF”。

TL;DR - MVA 是一个较旧的 ARM 技术术语,大多数现代 OS 不会使用它。即使使用,也仅适用于用户 space 代码,设备驱动程序可以忽略带有 'VA == MVA'.

的术语

MVA 是使用某些 ID 标记缓存数据的结果。目的是 OS 中的用户 space 代码可以通过上下文切换保留在缓存中。在 ARMv5 中引入了 FSCE(快速上下文切换扩展)。这在集成到 Linux 中不是很成功,但被用于 OKL4 hypervisor.

等产品中

许多 OSs 被构造为在低位置启动用户 space,例如 0x8000,从而更容易防止 NULL 写入。所以这个FSCE允许多个物理地址映射到低地址space。这意味着不需要在 OS 上下文切换时刷新缓存。

Armv6 引入了另外三个概念来替代 FSCE。首先 TTBR0 和 TTBR1 允许拆分 OS/user 页 tables。第二 分区库或逻辑内存组。第三页条目可以是非全局的,并通过 CONTEXTIDR cp15 寄存器和页面 table 条目的 GD 位分配一个 ASID(地址 space id)。这里的 flush/invalidate 将仅适用于活动的 ASID。因此,即使缓存已标记,也没有 'MVA'.

因此 MVA 可能仅适用于用户 space 代码,具体取决于 OS 是否使用 FSCE。对于内核和 DMA/device 内存,您应该在任何 ARM 系统上始终使用 VA=MVA。通常你需要它,这样你的 OS 就不需要刷新用户内存,因为这是这些机制的全部意义所在。

例子

CP15 C7缓存维护
c5 1 ICIMVAU 通过指向 PoU 的地址使指令高速缓存行无效。 Rt=地址

此 CP15 寄存器使用 'MVA' 使 L1 无效。使用 FSCE,您可以将 PID 添加到基地址。使用 ASID,您必须在调用之前设置该寄存器以使此无效。同样,大多数 OS 只会为用户 space 执行此操作。在任何正常情况下,设备和内核内存不会使用此机制。


FSCE 的一个主要限制是您最多有 128 个进程,并且每个进程的大小限制为 2^25 或 32MB 以利用它。它还消耗了大量的虚拟地址space。这就是为什么它从未被纳入 Linux 主线的原因。尽管许多嵌入式 Linux 设备可能会受益,但它不像 ASID 那样通用,后者支持 256 个进程,没有大小限制并且不消耗虚拟地址 space.

  • ARMv5 第一个支持 FSCE/PID/MVA.
  • 的架构
  • 弃用 FSCE;始终存在,但不应使用。
  • 使 FSCE 可选; cortex-A8 可能只有硅存根。
  • 没有 FSCE;从不存在,只是存根或 RZ/WI 寄存器。