gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:08:30 35 4
gpt4 key购买 nike

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

该问题九次提到辅助/辅助负载,但我仍然无法理解这种负载的作用或触发方式。这与 TLB 相关,并且“导致需要微码辅助的页面浏览”。

有人可以解释一下辅助/辅助负载是什么,最好用一个已解决的例子吗?

最佳答案

您在该引文中省略了句子的其余部分,这解释了为什么页面遍历可能需要微码辅助:“...导致需要微码辅助的页面遍历(在页表条目中设置访问位)

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

填充 TLB 条目的页面遍历是纯专用硬件,但使用存储更新那些 PTE 位非常罕见,可以留给微码处理; CPU基本上会陷入内部微码并在恢复之前运行它。

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

有关的:

  • https://wiki.osdev.org/Paging#Page_Directory记录 PDE/PTE 中的位,包括已访问。
  • When accessing memory, will the page table accessed/dirty bit be set under a cache hit situation?
  • https://www.kernel.org/doc/gorman/html/understand/understand006.html - 在 3.2 描述页表条目中,请注意有 Accessed 和 Dirty 位,HW 分别在读/写和写时更新。
  • How prompt is x86 at setting the page dirty bit?


  • 性能计数器 在 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)在文件支持的映射上应清除脏位。 IDK 如果它会清除访问位。大概是一个新的文件支持 mmap使用 MAP_POPULATE 将清除其访问位,但连接到页表中,因此不需要 #PF页面错误异常。也许也适用于 MAP_ANONYMOUS .

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

    在 Linux 内核 4.12 及更高版本上,我怀疑 madvise(MADV_FREE)在私有(private)匿名页面上清除脏位,基于 the man page 的方式描述它。它还可能清除 Accessed 位,因此负载可能还需要辅助 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 它应该已经连接到 HW 页表(首次访问时不需要软页错误)。脏位应该是清楚的,也许还有访问位。

    一个 vpmaskmovd使用 mask=0 存储(没有实际存储)将触发写保护页面上的帮助,例如一个懒惰分配的 mmap(PROT_READ|PROT_WRITE)只读过的页面,没有写过的页面。所以它仍然是 CoW 映射到零的共享物理页面。

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

    这与您想要的 Accessed/Dirty page-table 帮助略有不同。我认为此辅助用于故障抑制,因为它不需要 #PF页面错误。 (该页面实际上是写保护的,而不仅仅是干净的。)

    IDK 如果这对 MDS/RIDL 目的有用。

    我没有使用新分配的 mmap(MAP_POPULATE) 中的掩码负载进行测试缓冲区以查看他们是否接受协助,但未设置已访问位。

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

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com