我发现Linux内核尝试通过将交换器页表的内容复制到函数pgd_alloc
中每个新创建的页表中来避免在用户域和内核之间切换时更新TTBR。
问题是:更新ARM TTBR有什么缺点?
答案 0 :(得分:3)
使用MMU enable更新TTBR
(转换表基址寄存器) Note1 有很多危险。有中断,页面错误,TLB(MMU缓存)以及L1和L2缓存都要考虑。在不同的系统上,the caches maybe PIPT or VIVT(物理或虚拟标记),可能存在也可能不存在L1或L2缓存。
人们似乎过分关注MMU和TLB的效率。在性能考虑方面,它们总是被主L1 / L2高速缓存相形见绌。与从L1 / L2代码和数据缓存中进行不需要的驱逐相比,更新MMU表和执行TLB刷新的影响较小。 TLB至少值4KB或超过100个缓存行。在某些情况下,TLB条目可能是1MB。
可能需要在上下文切换中逐出L1 / L2用户空间中的某些数据/代码。但是,对于非常频繁的小工作负载,用户上下文切换可以将代码和数据保持在L1 / L2中。例如,进行大量CPU密集解码的媒体播放器和一些cron任务检查,以查看服务器上没有新的电子邮件。切换到' cron'任务可能导致代码保留在L2缓存中以供视频解码使用。
更新ARM TTBR有什么缺点?
除非from / to表相同,否则你必须在更新期间保持系统内存视图的一致性。 Note2 这自然会导致IRQ延迟和实现的复杂性,因为你需要同步许多子系统。此外,Linux MM(内存管理)代码与架构无关。它处理各种各样的MMU子系统。目标永远不是在本地进行优化(在架构层面),而是在通用层进行全局优化。
注1:TTBR
是指向物理16k对齐内存区域的指针,该内存区域是ARM MMU的第一级。每个条目是1MB(在32位系统上)并且可以指向另一个表;通常称为L2。
注意2:您可以在引导加载程序中或在内存设备之间迁移系统级代码的位置执行此操作。即,使用相同的表更新TTBR本身并不重要。当表格不同时,会发生奇怪的事情。