Атомарные операции в ARM

Я работал над встроенной ОС для ARM, однако есть несколько вещей, которые я не понял об архитектуре даже после обращения к исходному коду ARMARM и Linux.

Атомарные операции.

ARM ARM говорит, что инструкции загрузки и сохранения являются атомарными, и их выполнение гарантированно будет завершено до того, как выполнится обработчик прерывания. Проверено просмотром

arch/arm/include/asm/atomic.h :
    #define atomic_read(v)  (*(volatile int *)&(v)->counter)
    #define atomic_set(v,i) (((v)->counter) = (i))

Однако проблема возникает, когда я хочу манипулировать этим значением атомарно, используя инструкции процессора (atomic _inc, atomic _dec, atomic _cmpxchg и т. д. ), которые используют LDREX и STREX для ARMv7 (моя цель ).

ARMARM ничего не говорит о блокировке прерываний в этом разделе, поэтому я предполагаю, что прерывание может произойти между LDREX и STREX. В нем упоминается блокировка шины памяти, которая, я думаю, полезна только для систем MP, где может быть больше процессоров, пытающихся получить доступ к одному и тому же месту в одно и то же время. Но для UP (и, возможно, MP ), если прерывание таймера (или IPI для SMP )срабатывает в этом маленьком окне LDREX и STREX, обработчик исключений, возможно, изменяет контекст процессора и возвращается к новой задаче., однако сейчас начинается шокирующая часть, она выполняет «CLREX» и, следовательно, удаляет любую эксклюзивную блокировку, удерживаемую предыдущим потоком. Итак, насколько лучше использовать LDREX и STREX, чем LDR и STR для атомарности в системе UP?

Я что-то читал о монопольном мониторе блокировки, поэтому у меня есть возможная теория о том, что когда поток возобновляет работу и выполняет STREX, монитор ОС вызывает сбой этого вызова, что можно обнаружить, и цикл может быть повторно -выполнен с использованием новое значение в процессе (переходит обратно в LDREX ), я здесь?

16
задан sgupta 10 August 2012 в 00:59
поделиться