static __inline__ int atomic_dec_and_test(atomic_t *v)
{
unsigned char c;
__asm__ __volatile__(
LOCK "decl %0; sete %1"
:"=m" (v->counter), "=qm" (c)
:"m" (v->counter) : "memory");
return c != 0;
}
это реализация головоломки мне много атомное означает, что в этой функции? только часть уменьшения? , но как мы можем гарантировать, что sete вернет правильное значение? нам нужно отключить прерывание в функции invoke this ?, кажется, что атомный - это только одно предложение (decl) в этой функции, а не целая функция?операция Atom чтения и записи ядра Linux на архитектуре i386
Мне нужно сделать себя ясно, я знаю, что атом гарантирован в инструкции decl с префиксом блокировки, но как эта функция гарантирует, что sete использует правильное значение, которое вызывает регистр eflag после того, как decl перед набором может быть прерывание и значение eflag может быть изменено обработчиком прерываний !!!!!!!!!!!! – Adambynes
Прерывания не изменяют флаги, если они специально не закодированы. В противном случае вы не могли бы написать код. Например, если вы не можете полагаться на флаги, которые сохраняются между «CMP» и сопровождающей условной инструкцией, атомарными или нет. – Jester
Или, вернее, флаги восстанавливаются при возврате из прерывания. – ninjalj