Zynq-7000 SoC,APU - 更新转换条目以移动页面映射可能会错误地导致意外的转换错误

描述

在特定于Cortex-A9微体系结构的某些条件下,更新可缓存的转换表条目的写入操作可能导致旧的和新的转换条目对转换表行走暂时不可见,从而错误地导致转换错误。

以下是发生此问题的要求:


  1. 处理器启用了数据缓存和MMU。
  2. TTB寄存器设置为可在Cacheable描述符内存区域上工作。
  3. 处理器正在更新现有的可缓存转换表条目,并且该写入操作在L1数据缓存中命中。
  4. 尝试硬件转换表行走。硬件转换表行走可能是由于取指令,或者是由于需要地址转换的任何其他指令执行,包括任何加载或存储操作。
    此硬件转换步骤必须尝试访问条件2中正在更新的条目,并且该访问必须在L1数据高速缓存中命中。


实际上,当OS正在改变物理页面的映射时,可能会出现问题。操作系统可能具有到物理页面(旧映射)的现有映射,但是希望将映射移动到新页面(新映射)。为此,操作系统可能:


  1. 写一个新的翻译条目,而不取消旧的翻译条目。此时,可以使用旧映射或新映射访问物理页面。
  2. 执行DSB指令后跟ISB指令对,以确保新的转换条目完全可见。
  3. 删除旧条目。


但是,由于此问题,在写入新条目后,新旧映射都不可见,从而导致转换错误。

影响:
次要。此问题导致转换错误。有一个解决问题的办法。
解决方法:
执行干净且无效的操作,请参阅“变通方法详细信息”。
受影响的配置:
使用CPU的系统。
受影响的器件版本: 所有。没有计划修复。请参阅(Xilinx答复47916) - Zynq-7000 SoC芯片版本差异答复记录。


解决方法细节:

建议的解决方法是在更新条目之前对包含转换条目的缓存行执行清除和无效操作,以确保写入操作在数据高速缓存中未命中。

此解决方法可防止问题所需的微架构条件发生。必须暂时禁用中断,以便在维护操作和转换条目更新之间不会产生中断。

这避免了中断服务程序将高速缓存行带回高速缓存的可能性。


另一种可能的解决方法是将转换表条目放在不可缓存的内存区域中,但是这种解决方法可能会有明显的性能损失。

请注意,在写入新的转换表条目后立即插入DSB指令会显着降低命中错误的可能性,但不是完整的解决方法。

修订记录
2013年3月新。

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2018-07-31 13:11:02 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它