【问题标题】:How to perform write back of dirty L1-L2 cache lines in ARMv8如何在 ARMv8 中执行脏 L1-L2 缓存线的回写
【发布时间】:2019-02-15 21:32:32
【问题描述】:

我正在寻找一种使用内核模块刷新 L1-L2 缓存的方法。 有没有办法完全刷新整个集群缓存(4 核配置),甚至更好,将脏缓存行写回主内存?

【问题讨论】:

    标签: caching linux-kernel arm kernel-module armv8


    【解决方案1】:

    您想从内核模块中刷新缓存听起来很奇怪。这应该由核心内核部分完成,作为驱动程序,您不必担心这一点。

    您是否有任何特定原因需要在驱动程序中执行此操作?

    【讨论】:

    • 我想实现 SoC 和外部设备之间的数据一致性。因此,如果分配页面中的数据被 X 修改,我想确保更改对 Y 可见,这超出了 X 的缓存一致性
    • 那么为什么不直接使用 volatile 关键字 (see here) 呢?它首先防止将数据写入缓存
    • @jonnyx volatile 关键字告诉编译器重新读取数据值,而不是假设它保持不变。这不是我想要的。
    【解决方案2】:

    我想你想看看 Mel Gorman 的“了解 Linux 虚拟内存管理器”[1] 的 3.9。我认为您正在寻找的是 flush_cache_page(...)

    [1]https://www.kernel.org/doc/gorman/

    【讨论】:

    • 不错,但我找不到 Arm64 架构的实现,只能用于较旧的 arm。不过非常感谢。由于 Armv8 中存在更复杂的 L2 缓存控制器,事情变得复杂
    • 还不错,但是还有其他针对 arm64 实现的方法,你有没有看过 __flush_dcache_area(kaddr, size)?
    • 是的,我做了,根据我的阅读,它从一级缓存中刷新页面或区域,并将其发送到二级缓存。
    【解决方案3】:

    好吧,看起来在不同架构中刷新缓存的方式实际上是不同的。不过,我没有找到可行的实现。但是,我所做的是找到要刷新的特定页面的页表条目(PTE),并将内存属性更改为不可缓存。然后,数据直接进入DRAM。 (ARMv8) 干杯

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 2013-01-20
      • 1970-01-01
      • 2020-05-19
      • 2015-06-29
      • 2014-07-04
      • 2017-09-24
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多