首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内核代码中asm与__asm__的区别

内核代码中asm与__asm__的区别
EN

Stack Overflow用户
提问于 2018-09-28 07:01:03
回答 1查看 993关注 0票数 1

我正在研究如何在内核中使用内存屏障(Linux内核v4.19-rc5)。我不明白asm__asm__之间的区别。例如,考虑障碍函数:

代码语言:javascript
运行
复制
static inline void barrier(void)
{
    asm volatile("" : : : "memory");
}

该函数使用asmvolatile关键字,是一个软件障碍。另一方面,考虑像这样的硬件障碍:

代码语言:javascript
运行
复制
#define mb()    __asm__ __volatile__("mb": : :"memory")

这次使用关键词__asm____volatile__。他们之间有什么区别?我从this文章中了解到,差异来自编译器,但我不明白为什么在相同的源代码中使用两个版本(__asm__asm)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 07:30:23

你看过@Ciro对这个问题的回答吗?'?

它解释了asm__asm__是相同的,只是gcc -std=c99禁用了asm,只留下了__asm__

asm__asm__的方便名称,可以在GNU模式下使用,这是默认的(-std=gnu99 / -std=gnu11或其他什么)。

行为上完全没有差别。Linux的一些贡献者更喜欢__asm__,而其他人则使用asm。Linux是用-std=gnu99gnu11编译的,因为它肯定依赖于对C的GNU扩展。

我不认为这些事件中的任何一个都在可以包含在Linux之外的其他地方的标题中。__asm__在GNU代码中没有错。但是,如果您需要使用-std=c11编译代码才能工作,那么asm是错误的。

只有MSVC的__asm关键字不同,并且使用__asm { insn; insn; },不受主线gcc的支持。(苹果公司的gcc对使用LLVM后端的旧OS支持-fasm-blocks,比如当前Clang。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52550016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档