x86 - 什么是辅助/辅助负载?

标签 x86 cpu-architecture page-tables micro-architecture cpu-mds

RIDL 漏洞要求攻击者触发页面错误才能从行填充缓冲区读取陈旧数据。但根据About the RIDL vulnerabilities and the "replaying" of loads ,也可以使用辅助负载。

这个问题提到了辅助/辅助负载九次,但我仍然无法理解这样的负载的作用或它是如何触发的。它与 TLB 相关,并且“导致需要微代码辅助的页面遍历”。

有人可以解释什么是辅助/辅助负载吗?最好能提供一个示例吗?

最佳答案

您遗漏了该引用中的其余句子,这解释了为什么页面遍历可能需要微代码辅助:“...导致需要微代码辅助的页面遍历(设置页表条目)

x86 ISA 表示,如果尚未设置该位,则读取或写入页面将设置该映射的页表条目 (PTE) 中的“已访问”位。操作系统可以使用它来查看哪些页面实际上被定期访问(通过清除访问位并让硬件再次设置它),以便它们可以决定在需要释放某些物理页面时调出哪些页面。 “脏”位也是如此,它让操作系统知道页面是否需要同步回文件或其他后备存储(如果有)。 (例如,操作系统如何实现 mmap(MAP_SHARED,PROT_WRITE))

用于填充 TLB 条目的页面遍历是纯粹的专用硬件,但使用存储更新这些 PTE 位的情况很少见,因此可以将其留给微代码; CPU 基本上捕获内部微代码并在恢复之前运行它。

某些 CPU 使用类似的机制来处理硬连线 FPU 无​​法处理的非正规浮点结果。这使得常见情况(标准化 float )的延迟更低。

相关:


Intel 上的性能计数器(至少在 Skylake 上):perf stat -e other_assists.any

[Number of times a microcode assist is invoked by HW other than FP-assist. Examples include AD (page Access Dirty) and AVX* related assists]


触发辅助从用户空间加载:我不确定哪种方法更好。

文件支持映射上的

msync(MS_SYNC) 应清除脏位。我不知道它是否会清除访问位。据推测,带有 MAP_POPULATE 的新文件支持 mmap 的 Accessed 位会被清除,但会被连接到页表中,这样就不会出现 #PF 页面错误异常。也许也适用于 MAP_ANONYMOUS

如果您有多个页面,并且其访问位已清除,您可以循环访问它们,以便能够执行多个辅助加载,而无需在其间进行昂贵的系统调用。


在 Linux 内核 4.12 及更高版本上,我怀疑私有(private)匿名页面上的 madvise(MADV_FREE) 会根据 the man page 的方式清除脏位。描述它。它还可能清除访问位,因此负载可能还需要协助,IDK。

MADV_FREE (since Linux 4.5)
The application no longer requires the pages in the range specified by addr and len. The kernel can thus free these pages, but the freeing could be delayed until memory pressure occurs. For each of the pages that has been marked to be freed but has not yet been freed, the free operation will be canceled if the caller writes into the page. After a successful MADV_FREE operation, any stale data (i.e., dirty, unwritten pages) will be lost when the kernel frees the pages. However, subsequent writes to pages in the range will succeed and then kernel cannot free those dirtied pages, so that the caller can always see just written data. If there is no subsequent write, the kernel can free the pages at any time. Once pages in the range have been freed, the caller will see zero-fill-on-demand pages upon subsequent page references.

The MADV_FREE operation can be applied only to private anonymous pages (see mmap(2)). In Linux before version 4.12, when freeing pages on a swapless system, the pages in the given range are freed instantly, regardless of memory pressure.

或者可能是mprotect,或者可能是mmap(MAP_FIXED|MAP_POPULATE)一个新的匿名页面来替换当前页面。使用 MAP_POPULATE,它应该已经连接到硬件页表中(首次访问时不需要软页错误)。脏位应该被清除,也许访问位也应该被清除。


掩码=0(无实际存储)的vpmaskmovd存储将在写保护页面上触发协助,例如一个延迟分配的 mmap(PROT_READ|PROT_WRITE) 页,仅被读取,未被写入。因此它仍然是 CoW 映射到零的共享物理页。

它使页面保持干净,因此如果每个存储都具有 mask=0 来不替换任何元素,则每次在数组循环中都会发生这种情况。

这与您想要的访问/脏页表帮助略有不同。我认为这个辅助是为了抑制错误,因为它不需要发生#PF页面错误。 (该页面实际上是写保护的,而不仅仅是干净的。)

不知道这对于 MDS/RIDL 目的是否有用。

我还没有使用来自新分配的 mmap(MAP_POPULATE) 缓冲区的屏蔽负载进行测试,以查看它们是否接受协助但未设置 Accessed 位。

关于x86 - 什么是辅助/辅助负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61452899/

相关文章:

assembly - JS 在 Assembly x86 中做什么?

assembly - 分支预测器如何知道它是否不正确?

x86-64 - x86_64 是否与指令中的 aarch64 等效?

assembly - assembly 中的进位标志、辅助标志和溢流标志

c++ - ecx 寄存器是否用于传递静态函数调用中的参数之一?

assembly - 如果距开始位置 <128 字节,则访问结构成员会更快?

x86 - 与 CPU 微架构相关的奇怪现象

cpu-architecture - 为什么在 Write Allocate 缓存策略中从主内存获取数据

c - 当 2 个程序映射同一个文件时,mmap 如何工作