如果商店缓冲区已经存在以跟踪出库请求,为什么我们需要行填充缓冲区?
我正在阅读MDS攻击文件RIDL: Rogue In-Flight Data Load。他们讨论了行填充缓冲区如何导致数据泄漏。 About the RIDL vulnerabilities and the "replaying" of loads问题讨论了漏洞利用的微体系结构细节。
阅读了这个问题后,我不清楚的一件事是,如果我们已经有一个存储缓冲区,为什么我们需要一个行填充缓冲区。
[约翰·麦卡宾(John McCalpin)在英特尔论坛上的 How does WC-buffer relate to LFB?中讨论了存储缓冲区和行填充缓冲区的连接方式,但这对我来说并没有使事情变得更清楚。
对于到WB空间的商店,商店数据将保留在商店缓冲区中,直到商店退役之后。退役后,数据可以写入L1数据高速缓存(如果该行存在并且具有写许可权),否则将为存储未命中分配一个LFB。 LFB最终将接收高速缓存行的“当前”副本,以便可以将其安装在L1数据高速缓存中,并且可以将存储数据写入高速缓存。合并,缓冲,排序和“快捷方式”的详细信息尚不清楚....与上述情况相当吻合的一种解释是,LFB用作高速缓存行大小的缓冲区,存储数据在发送之前被合并到其中L1数据缓存。至少我认为这是有道理的,但我可能会忘记一些东西。
我最近才开始阅读乱序执行记录,请原谅我的无知。这是我对存储如何通过存储缓冲区和行填充缓冲区的想法。
- 存储指令在前端被调度。
我正在阅读MDS攻击论文RIDL:Rogue飞行中数据加载。他们讨论了行填充缓冲区如何导致数据泄漏。有“关于RIDL”漏洞和“正在重放...”>
如果商店缓冲区已经存在以跟踪出库请求,为什么我们需要行填充缓冲区?
存储缓冲区用于按顺序跟踪它们退出的[[before
,并且在它们退出后但在提交到L1高速缓存之前)。从概念上讲,存储缓冲区是一个完全本地的东西,实际上并不关心高速缓存未命中。存储缓冲区以各种大小的单个存储的“单位”进行交易。像Intel Skylake这样的芯片都有store buffers of 50+ entries。both
加载并将该miss丢失存储在L1高速缓存中。本质上,它是从L1高速缓存到其余内存子系统的路径,并以高速缓存行大小的单位进行交易。如果加载或存储命中L1缓存1,我们不希望LFB参与其中。诸如Skylake之类的英特尔芯片的LFB条目要少得多,可能为10到12。事件的顺序在我的描述中是否正确?
非常接近。这是我要更改您的列表的方式:
作为一个示例,以上述顺序,直到商店到达商店队列的开头才获取商店未命中行。实际上,商店子系统可以实现一种
RFO prefetch
作为另一个示例,步骤6描述了从内存层次结构返回并被委托给L1的行,然后存储提交。实际上,挂起的存储实际上可能与返回的数据合并,然后将其写入L1。即使在未命中的情况下,存储也有可能离开存储缓冲区,而只是在LFB中等待,从而释放了一些存储缓冲区条目。
1
对于在L1缓存中命中的存储,有一个[[suggestion实际涉及LFB:每个存储实际上都进入一个合并缓冲区(可能只是一个LFB)在提交给高速缓存之前,将针对同一高速缓存行的一系列存储合并到高速缓存中,只需要访问一次L1。这还没有得到证明,但是无论如何,它实际上并不是LFB主要用途的一部分(从我们甚至无法真正确定它是否正在发生的事实中可以明显看出)。如果商店缓冲区已经存在以跟踪出库请求,为什么我们需要行填充缓冲区?