更新ARM TTBR(转换表基址寄存器)的缺点是什么?

3
1个回答

4

在使用MMU启用时更新TTBR(翻译表基址寄存器)Note1存在许多风险。需要考虑中断、页故障、TLB(MMU缓存)以及L1和L2缓存。在不同系统上,缓存可能是PIPT或VIVT(物理或虚拟标记),可能不存在L1或L2缓存。

人们似乎过于关注MMU和TLB的效率。在性能考虑中,它们总是被主要的L1/L2缓存所压倒。更新MMU表并执行TLB刷新的影响要小于从L1/L2代码和数据缓存中进行不必要的逐出。至少一个TLB值得1/4KB或超过1/100个缓存行(重新填充的成本)。在某些情况下,TLB条目可能为1MB。

在上下文切换时,L1/L2用户空间中的某些数据/代码可能需要被清除。但是,对于非常频繁的小工作负载,用户上下文切换可能会使代码和数据保留在L1/L2中。例如,媒体播放器执行大量CPU密集型解码以及检查服务器上是否有新电子邮件的cron任务。切换到“cron”任务并返回可能导致代码仍然在L2缓存中供视频解码使用。
更新ARM TTBR的缺点是什么?
除非源表和目标表相同,否则您必须在更新期间保持系统内存视图一致。这自然会导致IRQ延迟和实现复杂性,因为您需要同步许多子系统。此外,Linux MM(内存管理)代码是架构无关的。它处理各种MMU子系统。目标永远不是在本地优化(在架构级别),而是在通用层面全局优化。
注1:TTBR是指向物理16k对齐内存区域的指针,该区域是ARM MMU的第一级。每个条目为1MB(在32位系统上),可能指向另一个表;通常称为L2。
注意2:您可能会在引导加载程序或将系统级代码迁移至内存设备的地方执行此操作。也就是说,仅更新具有相同表的TTBR本身并不重要。只有当表不同时,才会发生奇怪的事情。

1
ARM的特性,如ASID(armv6+)和pid(armv5),有助于减轻刷新的需求;但是对于强健的代码来说,最坏情况仍然存在。即使是Linux ARM mm代码也有很多条件语句和/或备用函数来处理不同的ARM变体。 - artless noise
1
由于内核映射始终保持一致,因此从不需要刷新内核TLB条目或任何缓存。这意味着中断延迟等将得到改善。在上下文切换期间发生的中断仍然可以被处理。只有监管堆栈和“thread_info”设置为新任务,才能完成完整的内存管理转换以更改内存的用户空间视图。只有在switch_to()finish_task_switch()都完成后,用户空间才能真正活动起来。只有在CPU模式切换之前需要switch_to()部分是原子/被锁定的。 - artless noise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接