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