Linux kernel 为什么ARM SMP Linux内核强制cachepolicy写入LOC?

Linux kernel 为什么ARM SMP Linux内核强制cachepolicy写入LOC?,linux-kernel,arm,Linux Kernel,Arm,在ARM SMP Linux内核中使用writealloc缓存策略是否有架构上的原因?我们可以将其更改为写回缓存策略吗 内核启动日志: [0.000000]强制SMP的写分配缓存策略 [0.000000]内存策略:数据缓存writealloc 在ARM SMP Linux内核中使用writealloc缓存策略是否有架构上的原因 首先,对于大多数工作负载来说,它要快得多。其次,spin_锁和其他Linux同步原语使用LDREX和STREX,可能需要一个写分配策略,或者至少会使用独占访问使代码复杂化

在ARM SMP Linux内核中使用writealloc缓存策略是否有架构上的原因?我们可以将其更改为写回缓存策略吗

内核启动日志:

[0.000000]强制SMP的写分配缓存策略
[0.000000]内存策略:数据缓存writealloc

在ARM SMP Linux内核中使用writealloc缓存策略是否有架构上的原因

首先,对于大多数工作负载来说,它要快得多。其次,spin_锁和其他Linux同步原语使用LDREX和STREX,可能需要一个写分配策略,或者至少会使用独占访问使代码复杂化,这对SMP系统是一个很大的好处

写分配意味着写回缓存;无写分配意味着直写缓存(或者基本上没有写缓存)。使用直写缓存可能更难获得exlusive锁(因为必须复制回写缓存才能实现排他锁)

我们可以将其更改为写回缓存策略吗

看起来没有。至少在不修改源代码的情况下没有,这就是我想你的意思。内核参数可以是:

  • 未缓存
  • 缓冲
  • 书写
  • 写回
  • writealloc
强制为SMP系统“写入分配”。至少您需要更改此代码。然而,如果你天真地删除它,它将产生后果。例如,请参见


资料来源:

有两种基本的缓存写入方法:

  • 直写
    :同步写入缓存和备份存储
  • 写回
    (也称为写回):最初,只对缓存进行写操作。对备份存储的写入被推迟,直到修改的内容即将被另一个缓存块替换

因为在写操作中没有数据返回给请求者,所以需要对写未命中做出决定,不管数据是否加载到缓存中。这由以下两种方法定义:

  • Write allocate
    (也称为写入时提取):丢失写入位置的数据加载到缓存,然后执行写入命中操作。在这种方法中,写入未命中与读取未命中类似
  • 无写入分配
    (也称为写入无分配或回写):丢失写入位置的数据不会加载到缓存,而是直接写入备份存储。在这种方法中,数据仅在读未命中时加载到缓存中

  • 回写缓存使用write allocate,希望后续写入(甚至读取)到现在缓存的同一位置
  • 直写缓存不使用写分配。在这里,后续写入没有任何优势,因为它们仍然需要直接写入备份存储
缓存以外的实体可能会更改备份存储中的数据,在这种情况下,缓存中的副本可能会过期或过时。或者,当客户端更新缓存中的数据时,其他缓存中这些数据的副本将变得过时。保持数据一致性的缓存管理器之间的通信协议称为一致性协议



ARM CPU通常有一个写缓冲区,因此多个写操作(比如32位)将组合成128位(AXI总线大小)甚至更大的SDRAM设备。

为什么要“写回”?你有硬件问题吗?有一些参数(CP15配置)可以使大型连续写入绕过缓存。例如,一个大的
memset()
。这是您唯一不希望写入分配的工作负载;除非你有一些硬件错误。。。所以,仅仅说你的欲望似乎被误导了,因为你没有解释你为什么要这样做。即使可以,这似乎是个坏主意。与写回缓存策略相比,使用writealloc时,memcpy速度较慢。这可能会导致执行内存操作的速度比SMP快。但是SMP应该更强大。。。这不是出乎意料吗?
memcpy
就像
memset
,这就是我提到的。见:来自。差异并没有那么大(最坏情况下为10-15%),因此您必须永远不要使用复制的目标。写入分配将受益于其他工作负载。我相信,如果你愿意,你仍然可以要求拥有无法储存的记忆。你不能告诉内核使用它。参考SMP系统和snoop控制单元或SCU,其中提供了有关为什么需要缓存的一些详细信息。LDREX/STREX仅使用本地监视器将更高效。多核通常只需要一个具有回写功能的本地监视器。如果有GPU或替代DSP,即实时CPU,则需要一个全局监视器。如果支持全局监视器,则可以在不回写的情况下使用LDREX/STREX。