我正在研究如何在内核中使用内存屏障(Linux内核v4.19-rc5)。我不明白asm
和__asm__
之间的区别。例如,考虑障碍函数:
static inline void barrier(void)
{
asm volatile("" : : : "memory");
}
该函数使用asm
和volatile
关键字,是一个软件障碍。另一方面,考虑像这样的硬件障碍:
#define mb() __asm__ __volatile__("mb": : :"memory")
这次使用关键词__asm__
和__volatile__
。他们之间有什么区别?我从this文章中了解到,差异来自编译器,但我不明白为什么在相同的源代码中使用两个版本(__asm__
和asm
)?
发布于 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=gnu99
或gnu11
编译的,因为它肯定依赖于对C的GNU扩展。
我不认为这些事件中的任何一个都在可以包含在Linux之外的其他地方的标题中。__asm__
在GNU代码中没有错。但是,如果您需要使用-std=c11
编译代码才能工作,那么asm
是错误的。
只有MSVC的__asm
关键字不同,并且使用__asm { insn; insn; }
,不受主线gcc的支持。(苹果公司的gcc对使用LLVM后端的旧OS支持-fasm-blocks
,比如当前Clang。)
https://stackoverflow.com/questions/52550016
复制相似问题