2014-03-05 2 views
0
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

+0

Мне нужно сделать себя ясно, я знаю, что атом гарантирован в инструкции decl с префиксом блокировки, но как эта функция гарантирует, что sete использует правильное значение, которое вызывает регистр eflag после того, как decl перед набором может быть прерывание и значение eflag может быть изменено обработчиком прерываний !!!!!!!!!!!! – Adambynes

+0

Прерывания не изменяют флаги, если они специально не закодированы. В противном случае вы не могли бы написать код. Например, если вы не можете полагаться на флаги, которые сохраняются между «CMP» и сопровождающей условной инструкцией, атомарными или нет. – Jester

+0

Или, вернее, флаги восстанавливаются при возврате из прерывания. – ninjalj

ответ

2

v является атомной переменной. Доступ к этой переменной должен быть атомарным. Инструкция decl является единственной инструкцией в этой функции, которая обращается к v, поэтому она является единственной, которая должна обеспечивать атомный доступ. После этого локальная переменная (которая не может быть доступна для разных CPU/контекстов) устанавливается на основании результата decl.

Таким образом, atomic_dec_and_test() означает атомное уменьшение атомной переменной и проверяет, привело ли это к достижению нулевого значения.

+0

Мне нужно сделать себя ясно, я знаю, что атомный обеспечивается в инструкции decl с префиксом блокировки, но как эта функция гарантирует, что sete использует правильное значение, вызванное eflag register после в объявлении перед множеством могут быть прерывания, а значение eflag может быть изменено обработчиком прерываний !!!!!!!!!!!! – Adambynes

0

Я не знаю, какую версию кода ядра Linux вы ищете (я не нашел фрагмент кода, который вы опубликовали в текущей версии ядра, а в последнем ядре он был заменен LOCK_PREFIX), но попытайтесь найти вне, что LOCK стоит, это определяется как макрос. Я уверен, что вы найдете инструкцию lock внутри макроса LOCK, который сообщает процессору выполнить следующую инструкцию атомарно look here. В частности, в следующей строке:

In a multiprocessor environment, the LOCK# signal insures that the processor has 
exclusive use of any shared memory while the signal is asserted. 

Примечание это исключительное использование любой разделяемой памяти. И я думаю, что это ключ.

Смежные вопросы