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

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

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

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

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, монитор os вызывает этот вызов, который может быть обнаружен, и цикл может быть повторно выполнен с использованием нового значение в процессе (переход обратно к LDREX), я здесь?

Ответы на вопрос(2)

Ваш ответ на вопрос