当前位置: 首页 > 知识库问答 >
问题:

如何体验“LFENCE或SFENCE无法通过早期读/写”

边意
2023-03-14

我正在做一些关于功能安全的事情。我需要验证一些X86 CPU指令,例如LFENCE、SFENCE和MFENCE。

现在,我可以根据Intel SDM第8.2.3.4章“加载可能会与早期存储一起重新排序到不同位置”,体验MFENCE。

"xor %0, %0\n\t                 "
"movl $1, %1\n\t                "
"mfence\n\t                     "   
"movl %2, %0\n\t                "
: "=r"(r1), "=m" (X)             
: "m"(Y)                         
: "memory"); 
"xor %0, %0\n\t                 "
"movl $1, %1\n\t                "
"mfence\n\t                     "   
"movl %2, %0\n\t                "
: "=r"(r2), "=m" (Y)
: "m"(X)
: "memory");

以上代码只有经验MFENCE才能阻止内存重新排序。(通过在两个处理器中删除mfence之前/之后检测r1和r2的不同值)

所以我想知道如何像上面一样验证LFENCE和SFENCE。我在SDM中没有找到任何逻辑。

共有1个答案

皇甫敏达
2023-03-14

相关:Intel内存型号是否使SFENCE和LFENCE冗余?

除非您使用NT存储,否则sfence没有实际效果。如果NT存储数据,然后是指向该数据的指针(或“就绪”标志),则即使读卡器看到新的指针/标志值,也可以看到数据的旧值<代码>sfence可用于确保两个存储在程序顺序中变得可见。

除非您从WC内存区域(如视频RAM)执行NT加载,否则lford对于内存排序是无用的。您将很难创建一个注释它会在内存排序中产生可检测的不同的情况。

lford的主要用途是序列化执行,而不是内存。有关增加长度,请参阅了解lford对具有两个长依赖链的循环的影响

既然你问的是C而不仅仅是ami,那么关于什么时候应该使用_mm_sfence()和其他内在函数有一个相关的答案。我什么时候应该使用_mm_sfence_mm_lfence和_mm_mfence(通常你只需要ash(":::"内存");除非NT存储正在运行,因为阻塞编译时重新排序可以让你获得acq/rel排序,而无需任何运行时屏障指令。)

脚注1:正常WB(写回)内存可缓存性设置也是如此。在普通操作系统下的用户空间中,除非您做了一些非常特殊的事情,否则这就是您一直拥有的。

对于其他内存类型(MTRR或PAT设置):不可缓存内存上的NT存储没有特殊效果,并且仍然是强有序的。WC、WB或WT内存(或WC内存的普通存储)上的NT存储是弱有序的,并且在为另一个线程存储buffer_ready标志之前使用sford很有用。

SSE4.1来自WB内存的加载不是弱有序的。与存储不同,它不会覆盖内存类型的排序语义。在当前的CPU上,WB内存上没有发生任何特殊情况;他们只是一个效率较低的movdqa。仅在WC内存上使用它们。

 类似资料:
  • Intel内存型号保证: 门店不会与其他门店一起重新订购 货物不会与其他货物一起重新订购 http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/ 我看到有人声称由于英特尔内存模型,SFENCE在x86-64上是多余的,但从来没有LFENCE。上述内存模型规则是否使任一指令冗余?

  • 我一直在到处寻找答案,但没有任何帮助。 这是我的代码: 当我试图读取URL时,下面出现了一个异常。 任何帮助都会很好。我正在尝试读取url内部的图像,并将其与现有文件进行比较。这里没有任何问题给出答案。 编辑: 我尝试在命令行“keytool-list-keystore keystore”中输入,但它只显示给我TrustedCertentries。还没有解决方案奏效。

  • 我正在尝试使用nodemailer验证Outlook电子邮件帐户。但是,我不断收到相同的消息: {错误:无效登录:535 5.7.3 SMTPConnection的身份验证失败[CY1PR03CA0041.namprd03.prod.outlook.com]。\u SMTPConnection的formatError(/user\u code/node\u modules/nodemailer/l

  • 嗨,我正在进行Spring Boot,我正在尝试使用Spring Security性来从active Directory进行用户身份验证。但是我无法将用户登录到应用程序中,我已经尝试了几个东西,下面是我尝试的代码: 当我试图从administrator登录时,我得到的错误如下: 原因:LDAP处理过程中出现未分类异常;嵌套异常是javax.naming.namingException:[LDAP:

  • 我正在玩,它从您在命令行上指定的文件中读取行: 如果它不能读取其中一个文件名,它会抛出(也许有一天它会有更好的异常类型,这样我们就可以用方法获取文件名)。好吧,抓住那个: 所以这捕获了错误,但仅此而已。尝试块在这一点上完成。它不能并尝试下一个文件: 回到Perl5Land,您会收到一条关于错误文件名的警告,程序将继续进行下一步。 如果存在一些参数,我可以先过滤,然后重建: 尽管它默默地忽略了坏文件

  • 我有一个h:form,它围绕着p:tabView。在选项卡中,每个输入元素都有一个p:message。 我发表了以下意见。 1) 问题:验证仅在已激活的选项卡中执行 > 如果我切换到编辑模式并且当前选项卡没有验证错误并且我没有更改选项卡,那么我的实体将被保存并且其他选项卡上的验证错误将被忽略。 如果我切换到编辑模式并导航到有验证错误的选项卡,然后导航到没有验证错误的第一个选项卡,则会显示验证错误(