Linux kernel 为什么ARM SMP Linux内核强制cachepolicy写入LOC?
在ARM SMP Linux内核中使用writealloc缓存策略是否有架构上的原因?我们可以将其更改为写回缓存策略吗 内核启动日志: [0.000000]强制SMP的写分配缓存策略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,可能需要一个写分配策略,或者至少会使用独占访问使代码复杂化
[0.000000]内存策略:数据缓存writealloc 在ARM SMP Linux内核中使用writealloc缓存策略是否有架构上的原因 首先,对于大多数工作负载来说,它要快得多。其次,spin_锁和其他Linux同步原语使用LDREX和STREX,可能需要一个写分配策略,或者至少会使用独占访问使代码复杂化,这对SMP系统是一个很大的好处 写分配意味着写回缓存;无写分配意味着直写缓存(或者基本上没有写缓存)。使用直写缓存可能更难获得exlusive锁(因为必须复制回写缓存才能实现排他锁) 我们可以将其更改为写回缓存策略吗 看起来没有。至少在不修改源代码的情况下没有,这就是我想你的意思。内核参数可以是:
- 未缓存
- 缓冲
- 书写
- 写回
- writealloc
资料来源: 有两种基本的缓存写入方法:
:同步写入缓存和备份存储直写
(也称为写回):最初,只对缓存进行写操作。对备份存储的写入被推迟,直到修改的内容即将被另一个缓存块替换写回
(也称为写入时提取):丢失写入位置的数据加载到缓存,然后执行写入命中操作。在这种方法中,写入未命中与读取未命中类似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。