L2毒药在CPU中是什么意思?

What does L2 poison mean in CPU?

提问人:Frontier_Setter 提问时间:10/7/2023 最后编辑:Peter CordesFrontier_Setter 更新时间:10/9/2023 访问量:73

问:

我遇到了与相同的问题。 L2 poison 是什么意思?

我使用的是 AMD CPU。

缓存 cpu-architecture cpu-cache amd-processor

评论

0赞 Garlic Bread Express 10/7/2023
这是由您编写的代码触发的吗?
1赞 Peter Cordes 10/7/2023
微架构标签似乎是关于某种带有微服务器的软件架构。请停止在有关 CPU 微架构的问题上标记它;为此,我们有 [CPU-Architecture]。(在我意识到其中的大多数旧问题都是关于其他事情之前,我曾经在这样的问题上标记它)。我以为它曾经有一个带有一些指导的标签 wiki,但也许不是。

答:

0赞 Peter Cordes 10/7/2023 #1

我猜“L2 毒药”意味着将 L2 缓存条目设置为具有错误的 ECC 值,因此缓存命中(甚至未命中?)会导致无法纠正的 ECC 错误。(另请参阅 https://lwn.net/Articles/348886/,其中谈到了“内存中毒”和 Linux 2009 年的 HWPOISON 补丁)。

一般来说,编程中的“中毒”是指您将某些内容初始化为使用时会出现故障的状态,或者至少具有可识别的模式,因此您可以检测到读取未初始化等错误。例如,MSVC 调试使用字节生成“毒”堆栈内存,这会形成一个无效的指针,如果取消引用,该指针将出错,并且在异常的故障地址中易于识别。它是用于调试断点的 x86 机器代码,以防您以某种方式意外跳转到堆栈地址。(这并不能强化代码注入,但可以想象,它可能会捕捉到一种情况,即错误的内联 asm 使 ESP 指向指向堆栈内存的指针而不是返回地址。0xccint3

如果当前的 CPU 实际上有一种软件毒害 L2 缓存的机制,则 IDK,无论是整个缓存还是特定缓存行的条目。

在任何情况下,您链接的问题中错误的实际原因似乎是 DRAM 中无法纠正的 ECC 错误,或者从 DRAM 传输到内存控制器的数据传输中。显然,机器检查异常或引发的任何异常都没有区分缓存ECC故障与DRAM故障?或者只是 Linux 的驱动程序没有?

(如果大多数缓存级别是回写的,则受 ECC 保护是正常的。据称,英特尔 L1d 缓存仅使用奇偶校验来保持较低的开销,同时支持字节存储和更宽的未对齐存储,只要它们不跨越缓存线边界即可发挥全部性能。是否有任何现代 CPU 的缓存字节存储实际上比字存储慢?- 是的,显然是大多数非 x86!我还没有看到关于 AMD 的讨论,但我认为 AMD CPU 确实在所有情况下都支持全性能未对齐存储,在这些情况下,相同的未对齐负载不会有任何损失。我之所以这样说,是因为某些 AMD CPU 会因跨越 32 字节边界而受到惩罚(并且缺乏原子性),而不仅仅是 64 字节的缓存行边界。


半相关:https://en.wikipedia.org/wiki/Cache_poisoning - 维基百科只提到DNS缓存或ARP缓存中毒之类的东西,在攻击者通过漏洞创建一些无效条目后,实际上使用了无效条目。