Operating system 为什么ASID仅在ARMv8-A的TLB中?如何避免对表中存在但从TLB弹出的内存进行未经授权的访问?

Operating system 为什么ASID仅在ARMv8-A的TLB中?如何避免对表中存在但从TLB弹出的内存进行未经授权的访问?,operating-system,arm,tlb,mmu,armv8,Operating System,Arm,Tlb,Mmu,Armv8,我有一个关于ARMv8-a中TLB和ASID的快速问题。 据我所知(来自ARM的程序员指南和架构参考手册): -页面/块描述符(叶MMU表项)不包含ASID标识符,仅包含nG(非全局)位,表示此页面应使用ASID。 -与寄存器值匹配的实际ASID值位于TLB中。它是在发生页面漫游并将相应条目添加到TLB时设置的(使用当前ASID,以便后续TLB查找将检查新ASID是否匹配) 假设我想使用ASID来避免在切换上下文时更新表。每个进程都有一个常驻ASID值。在vaddra1处理1部分数据,在vadd

我有一个关于ARMv8-a中TLB和ASID的快速问题。
据我所知(来自ARM的程序员指南和架构参考手册):
-页面/块描述符(叶MMU表项)不包含ASID标识符,仅包含nG(非全局)位,表示此页面应使用ASID。
-与寄存器值匹配的实际ASID值位于TLB中。它是在发生页面漫游并将相应条目添加到TLB时设置的(使用当前ASID,以便后续TLB查找将检查新ASID是否匹配)

假设我想使用ASID来避免在切换上下文时更新表。每个进程都有一个常驻ASID值。在vaddr
a1
处理1部分数据,在vaddr
a2
处理2部分数据。我将上下文从1切换到2。在执行过程中,与
a1
对应的TLB条目被弹出(出于某种原因)。进程2访问
a1
,发生TLB未命中,发生页面漫游,成功并使用ASID2值存储进程1的条目,允许进程2访问进程1的数据

我不明白什么?ASID机制不应该在避免更新表的同时提供进程1和进程2之间的安全性吗

可选问题:如果我的所有程序在同一虚拟地址上都有
.text
节(至少,所有程序都有相同的入口点地址),我是否需要在每次切换上下文时更新表,或者我是否可以使用不同的ASID让多个条目匹配相同的vaddr

在vaddr a1处理1部分数据,在vaddr a2处理2部分数据。我了解上下文 从1切换到2。在执行过程中,对应于a1的TLB条目 被弹出(出于某种原因)。进程2访问a1,TLB未命中 发生,并且页面漫游发生,成功并存储进程1的条目 使用ASID2值,允许进程2访问进程1的数据

当进程1想要访问vaddr a1时,它实际上是一个用asid P1标记为vaddr_a1_的地址。 当进程2想要访问vaddr a1时,它实际上是一个用asid P2标记为vaddr_a1_的地址。 因此,在TLB中,每个TLB条目都包含vaddr和进程ASID信息

然后,“进程2访问a1,发生TLB未命中,发生页面漫游,成功并使用ASID2值存储进程2的条目”将不会发生

即使对于相同的vaddr a1,两个不同的进程access a1也将生成两个不同的TLB条目。一个标记为ASID P1,另一个标记为ASID P2

可选问题:如果我的所有程序都同时具有.text节 虚拟地址(至少,所有程序都有相同的入口点 地址),是否每次切换上下文或 我可以有几个条目匹配相同的vaddr,使用不同的 亚洲

实际上,操作系统会注意这一点。例如,Linux操作系统将为进程分配唯一的ASID。对于8位或16位ASID寄存器,总ASID范围是有限的


因此,当所有ASID用完时,Linux操作系统将使整个TLB失效,并从0开始重新分配ASID号,作为第二个循环的开始。

似乎我对ASID有一个误解。多亏@artlessnoise的评论,我才得到了答案

在我描述的案例中,我忽略了一个事实,即我们必须在某个点映射流程2的页面

所以我们实际上做的是:
-更新表:添加进程2的页面,并删除进程2不能看到的任何页面(在我的示例中,包括地址为
a1的页面)
-更改ASID,使任何带有旧ASID的缓存值都不能在TLB中使用
-启动流程2。如果进程1的对应页面仍缓存在TLB中,则会忽略它(因为ASID不匹配)。在这两种情况下,都会发生页面漫游,更新的表只包含进程2可访问的页面

因此(主)安全性是由处理时出现的表提供的 2正在运行。而仅TLB中的附加安全性由 ASID机制,使我们不必在任何情况下刷新TLB 开关

编辑:另一个(牵强的)解决方案是禁用非缓存页面的页面漫游(改为触发MMU故障),并在每次进程访问非缓存页面时手动检查(从内核)进程权限。就性能而言(以及设计而言),这似乎很糟糕。

通过使用上述机制可以避免TLB刷新,但是缓存刷新又如何呢。缓存不会在上下文开关上刷新(当ASID位更改时)。缓存都不包含ASID位。 例如

  • 过程1和过程2在那里
  • 首先,进程1正在执行,TLB具有与进程1相关的ASID位
  • 这导致缓存中填充了进程1的数据(假设进程1按照页表用pa1和pa2条目填充了缓存)
  • 现在有一个上下文切换
  • 进程2的core的va在TLB中将有不同的ASID位,因此这将是TLB未命中,并且将有页表漫游
  • 与进程2相关的新PTE进入TLB,因此现在它是TLB命中
  • TLB命中导致在缓存中搜索数据(其中包含与未失效或刷新的进程1相关的数据)
  • 因此,可能存在这样一种情况,即过程1的pa可能与过程2的pa重叠,因此过程之间似乎存在数据保护,即使存在TLB保护

  • --我是否在某个地方错了,或者我没有考虑一些基本的事情,请告诉我……

    VIPT
    缓存中会有PA比较,对于带有
    VA1
    映射到带有asid\u proc2的
    PA进程2\u的Process2,该比较将失败

    因此,这将是
    Process2
    ac的缓存未命中