内核代码中asm和__asm__的区别

Difference between asm and __asm__ in kernel code

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

static inline void barrier(void)
{
    asm volatile("" : : : "memory");
}

此功能使用了asmvolatile关键字,是一个软件障碍。另一方面,考虑像这样的硬件障碍:

#define mb()    __asm__ __volatile__("mb": : :"memory")

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

你读过@Ciro 对那个问题的回答了吗? What is the difference between 'asm', '__asm' and '__asm__'?.

说明asm__asm__除了gcc -std=c99禁用asm,只剩下__asm__.

是一样的

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


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

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


只有 MSVC 的 __asm 关键字不同,并且使用 __asm { insn; insn; } 并且不受主线 gcc 支持。 (Apple 的旧 OS X 使用 LLVM back-end 的 gcc 支持 -fasm-blocks,就像当前的 Clang。)