内核代码中asm和__asm__的区别
Difference between asm and __asm__ in kernel code
我正在查看内核中如何使用内存屏障(Linux 内核 v4.19-rc5)。我不明白 asm
asm 和 __asm__
之间的区别。例如,考虑障碍函数:
static inline void barrier(void)
{
asm volatile("" : : : "memory");
}
此功能使用了asm
和volatile
关键字,是一个软件障碍。另一方面,考虑像这样的硬件障碍:
#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=gnu99
或 gnu11
编译的,因为它 绝对 依赖于 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。)
我正在查看内核中如何使用内存屏障(Linux 内核 v4.19-rc5)。我不明白 asm
asm 和 __asm__
之间的区别。例如,考虑障碍函数:
static inline void barrier(void)
{
asm volatile("" : : : "memory");
}
此功能使用了asm
和volatile
关键字,是一个软件障碍。另一方面,考虑像这样的硬件障碍:
#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=gnu99
或 gnu11
编译的,因为它 绝对 依赖于 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。)