Разница между asm и __asm__ в коде ядра - PullRequest
0 голосов
/ 28 сентября 2018

Я смотрел, как в ядре используются барьеры памяти (ядро 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__.В чем разница между ними?Из этого сообщения я понимаю, что различие происходит от компилятора, но я не понимаю, почему обе версии (__asm__ и asm) были использованы в одном и том же исходном коде?

1 Ответ

0 голосов
/ 28 сентября 2018

Вы читали ответ @ Сиро на этот вопрос? В чем разница между 'asm', '__asm' и '__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.

Я не думаю, что какое-либо из этих вхождений было в заголовке, который можно было бы включитьв другом месте, за пределами Linux.__asm__ не неправильно в коде GNU C.Но если вам нужен код для работы даже при компиляции с -std=c11, то asm неверен.


Только ключевое слово MSVC __asm отличается и использует __asm { insn; insn; } и не поддерживаетсяпо основной линии(Gcc от Apple для более старой OS X, использующей серверную часть LLVM, поддерживает -fasm-blocks, как и текущий Clang.)

...