Operações atômicas em ARM

Eu tenho trabalhado em um sistema operacional embarcado para o ARM, no entanto, existem algumas coisas que eu não entendi sobre a arquitetura, mesmo depois de referir-se a fonte ARMARM e Linux.

Operações atômicas.

ARM ARM diz que as instruções Load e Store são atômicas e sua execução é garantida para ser concluída antes que a rotina de tratamento de interrupções seja executada. Verificado por olhar

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

No entanto, o problema vem quando eu quero manipular este valor atomicamente usando as instruções de CPU (atomic_inc, atomic_dec, atomic_cmpxchg etc ..) que usam LDREX e STREX para ARMv7 (meu destino).

O ARMARM não diz nada sobre interrupções sendo bloqueadas nesta seção, então eu suponho que uma interrupção possa ocorrer entre o LDREX e o STREX. A coisa que ele menciona é sobre o bloqueio do barramento de memória, que eu acho que é útil apenas para sistemas MP, onde pode haver mais CPUs tentando acessar a mesma localização ao mesmo tempo. Mas para UP (e possivelmente MP), se uma interrupção de timer (ou IPI para SMP) disparar nesta pequena janela de LDREX e STREX, o manipulador Exception executa possivelmente altera o contexto cpu e retorna para a nova tarefa, no entanto a parte chocante entra agora , ele executa o 'CLREX' e, portanto, remove qualquer bloqueio exclusivo mantido pelo thread anterior. Então, como melhor usar LDREX e STREX do que LDR e STR para atomicidade em um sistema UP?

Eu li algo sobre um monitor de bloqueio exclusivo, então eu tenho uma teoria possível que quando o segmento retoma e executa o STREX, o monitor de SO faz com que essa chamada falhar, que pode ser detectada eo loop pode ser executado novamente usando o novo valor no processo (ramo de volta para LDREX), estou aqui mesmo?

questionAnswers(2)

yourAnswerToTheQuestion