有效地址不需要
prefetch / prefetchw 和 nop 如其他答案所述。
任何带有全零掩码的 AVX512 掩码加载或存储,例如 vmovaps [rdi]{k1}, zmm1。或 AVX vmaskmovps / vpmaskmovd。 AVX2 gather / AVX512 gather 或使用全零掩码散布。这些都对无效地址进行故障抑制。 (慢,但没有实际的内存访问。)
invlpg m8 采用 ModRM 指定虚拟地址。 (特权指令)。它不是从该地址加载,而是使该地址的 TLB 条目以及缓存在 page walker 中的更高级别的页面目录条目无效。
verr / verw — 验证段以进行读取或写入:他们采用 ModRM 寻址模式并根据段限制检查地址,设置 FLAGS。 (以及最近的微码更新。verw also clears internal CPU buffers so OSes can use it to mitigate L1TF / MDS vulnerabilities)。
rep cmpsb 或其他 RCX = 0 的字符串指令执行零迭代,不访问 [RDI] 或 [RSI] 隐式内存操作数。我认为这意味着即使地址错误也不会出错。微码肯定够慢
cldemote(Intel 中的新功能Tremont)——与预取相反;将数据推送到共享 L3 以加快从另一个内核的首次访问的性能提示。它在没有该功能的情况下解码为硬件上的 NOP。预取不会在无效地址上出错(尽管它们在使用微码辅助来抑制故障时可能会很慢);对于cldemote,该手册不是 100% 清楚的,但确实称其为推测性提示。
在某些处理器实现中,CLDEMOTE 指令可以设置页表中的A 位,但不能设置D 位。
如果在缓存中没有找到该行,则该指令将被视为 NOP。
MPX bndcl bnd, r/m64 / bndcu / bndcn / bndmk - 内存源表单有一个内置的 LEA:操作部分的伪代码甚至是 TEMP ← LEA(mem);。寄存器源形式只是直接使用寄存器值作为地址。正如手册所说,此指令不会导致任何内存访问,也不会读取或写入任何标志。(它会在越界时引发#BR 异常)。请注意,不推荐使用 MPX。
需要有效地址,但本身不是加载或存储。
clflush / clflushopt / clwb 都采用内存操作数来指定要刷新或写回 DRAM 的高速缓存行,可用于非易失性 DIMM 以确保提交到 NV 存储(与cldemote 不同,这些不是只是暗示如果忙或找不到地址,CPU 可能会下降)。它们确实需要一个有效的虚拟地址,并且确实会影响相应高速缓存行的 MESI 状态。但是如果缓存行不存在于 L1d 缓存中,它不会被引入然后再次刷新。我认为它会从所有内核的缓存中逐出,因此一个内核在一行上发送垃圾邮件clflush 会影响另一个内核读/写它。
The CLFLUSHOPT instruction 可以在所有特权级别使用,并且受到所有权限检查和与字节加载相关的错误(此外,允许 CLFLUSHOPT 指令刷新线性地址只执行段)。与加载一样,CLFLUSHOPT 指令设置页表中的 A 位但不设置 D 位。
MONITOR 将内存地址视为隐式DS:RAX/EAX/AX,而不是在 ModRM 中编码。它实际上并没有从中加载,而只是设置核心以通知另一个核心何时更改该内存。但是,它确实像负载一样工作。 (大概是让线路进入 MESI 共享状态,以便它可以在另一个内核在写入之前使其无效时注意到。)
MONITOR 指令被排序为相对于其他内存事务的加载操作。该指令受到与字节加载相关的权限检查和故障的影响。像负载一样,MONITOR 设置页表中的 A 位而不是 D 位。
umonitor(用户空间版本)是一样的。