【发布时间】:2019-01-01 14:02:32
【问题描述】:
阅读英特尔关于内存保护密钥 (MPK) 的 SDM 并不建议将 wrpkru 指令视为序列化或隐式强制执行内存排序。
首先,如果它不强制执行某种排序,那就令人惊讶了,因为人们会怀疑程序员不希望在 wrpkru 周围的内存访问被乱序执行。
第二,这是否意味着wrpkru 需要被lfence 包围?
【问题讨论】:
-
您可能想查看
pkey_mprotect()的源代码,看看他们是否采取了任何措施来保护它。 -
@Barmar
pkey_mprotect不使用wrpkru,它修改 pte 以设置 pkey 编号,然后在缓存时使 TLB 条目无效/关闭。 -
我误读了this page。它说
pkey_set()是wrpkru的包装器。 -
@RossRidge:我假设 OP 建议 LFENCE 阻止 CPU 管道中的乱序执行,这是
lfence的保证(仅限英特尔)效果:(Are loads and stores the only instructions that gets reordered? ),而不是因为它的(不存在的)内存排序效果。 (即仅与来自 WC 内存的 MOVNTDQA 负载与其他负载重新排序相关,没人关心。) -
@PeterCordes 好吧,这个问题确实提到了内存排序几次。正如您的回答所解释的那样,这里的问题是内存排序是一条红鲱鱼。
标签: linux performance assembly x86 memory-barriers