繁体   English   中英

用户空间中的内存障碍? (Linux,x86-64)

[英]Memory barriers in userspace? (Linux, x86-64)

在内核方面很容易设置内存屏障:由于Linux内核标头,宏mb,wmb,rmb等始终在适当的位置。

如何在用户端做到这一点?

Posix 定义了许多用作内存屏障的功能 不能同时访问内存位置; 为防止这种情况,请使用同步-同步也将成为障碍。

您正在寻找gcc的完整内存屏障原子内建函数。

请注意我在此处提供的参考资料的详细内容,

[以下]内置程序旨在与特定于Intel Itanium处理器的应用程序二进制接口 7.4节中描述的内置程序兼容。 因此,它们背离了使用“ __builtin_”前缀的常规GCC惯例,而且它们过载,从而可以处理多种类型。

使用libatomic_ops。 http://www.hpl.hp.com/research/linux/atomic_ops/

它不是特定于编译器的,并且比GCC的东西少很多错误。 它不是提供大量您不需要关心的功能的千兆库。 它仅提供原子操作。 而且,它可移植到不同的CPU架构。

Linux x64意味着您可以使用Intel内存屏障指令。 如果这些宏不适用于您的代码,则可以将它们包装在类似于Linux标头中的宏中

GCC __sync_synchronize()

英特尔内存订购白皮书,英特尔64和IA-32手册第3A卷的一部分, 网址为http://developer.intel.com/Assets/PDF/manual/253668.pdf

Qprof分析库(与Qt无关)在其源代码中还包括原子操作库,包括内存屏障。 它们适用于许多编译器和体系结构。 我在我的一个项目上使用它。

http://www.hpl.hp.com/research/linux/qprof/download.php4

只需借用为Linux内核定义的障碍,只需将这些宏添加到头文件中即可: http : //lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21 当然,还要让Linux开发人员相信您的源代码。

最近的Qt发行版的include/arch/qatomic_*.h标头包含用于许多体系结构和各种内存屏障(获取,发布,两者)的(LGPL)代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM