mplementación de operaciones atómicas de lectura y escritura en el kernel de Lin

ecientemente he echado un vistazo a la implementación del kernel de Linux de una lectura y escritura atómica y surgieron algunas preguntas.

Primero el código relevante de la arquitectura ia64:

typedef struct {
    int counter;
} atomic_t;

#define atomic_read(v)      (*(volatile int *)&(v)->counter)
#define atomic64_read(v)    (*(volatile long *)&(v)->counter)

#define atomic_set(v,i)     (((v)->counter) = (i))
#define atomic64_set(v,i)   (((v)->counter) = (i))

Tanto para las operaciones de lectura como de escritura, parece que se tomó el enfoque directo para leer o escribir en la variable. A menos que haya otro truco en alguna parte, no entiendo qué garantías existen de que esta operación será atómica en el dominio de ensamblado. Supongo que una respuesta obvia será que tal operación se traduce en un código de operación de ensamblaje, pero aun así, ¿cómo se garantiza eso teniendo en cuenta los diferentes niveles de memoria caché (u otras optimizaciones)?

En las macros de lectura, el tipo volátil se usa en un truco de lanzamiento. ¿Alguien tiene idea de cómo esto afecta la atomicidad aquí? (Tenga en cuenta que no se utiliza en la operación de escritura)

Respuestas a la pregunta(6)

Su respuesta a la pregunta