2012-02-22 12 views
10

En arquitectura ARM, desafortunadamente no sé exactamente qué chip es, es un atómico de lectura/escritura de 32 bit.ARM: ¿Está escribiendo/leyendo de int atomic?

¿Hay algún tipo de garantías sobre las lecturas/escrituras en los tipos básicos?

+0

Si ese 'int' está adecuadamente alineado (a 4 bytes), supongo que, como en la mayoría de los procesadores de 32 bits, la escritura es de alguna manera atómica. es el modelo de memoria (especialmente en situaciones de núcleos múltiples: coherencia de caché, etc.) –

+0

Incluso si no hay coherencia de caché, la lectura/escritura en la memoria principal seguirá siendo atómica (pero retrasada) –

+0

@BasileStarynkevitch sí modelo de memoria es un buen punto, pero yo solo h ave en la CPU ARM con un núcleo. –

Respuesta

9

Debe ser atómico, EXCEPTO si ese int se almacena en una dirección no alineada.

+0

¿Cómo se puede saber si está almacenado en una dirección no alineada? No hice ninguna alineación especial. –

+2

Comprueba si su dirección mod 4 es 0. Aunque si no hiciste nada raro (tipo-juego de palabras, etc.), entonces el compilador lo va a alinear. – jjlin

+3

En realidad, algunos procesadores ARM como el Cortex-M3 admiten el acceso no alineado en HW, por lo que incluso una lectura/escritura no alineada es atómica. El acceso puede abarcar múltiples ciclos de bus a la memoria, pero no hay oportunidad para que otra instrucción salte entre ellos, por lo que es atómico para el programador. – TJD

10

Esto está documentado en el TRM para el núcleo o en la especificación AMBA/AXI. Debes buscar el núcleo que se está utilizando desde allí si puedes averiguar qué sabor tiene el bus AMBA/AXI y en esa especificación explica la naturaleza atómica/no atómica de cada uno de los tipos de transacción.

Por ejemplo, swp y ldrex/strex son atómicos. Un strd y stm también deberían ser atómicos. Pero en el ARM11 Mpcore que estoy más familiarizado rompe las escrituras en ciclos de bus individuales de 64 bits, haga una stm con 8 registros Creo que se convierte en 4 longitudes separadas de 1 ciclo de bus, donde un ldm de 8 registros creo que es un solo transacción con una duración de cuatro.

Este es un buen momento para observar que ldrex y strex a menudo no se usan correctamente por los programadores. Linux lo tiene mal, por ejemplo. Son para bloquear cuando se usa un procesador multinúcleo en un sistema de memoria compartida, NO para bloquear hilos de software en un solo procesador. Use SWP para eso. Tienes suerte si tienes el caché L1 activado ya que ldrex/strex funciona (dentro de ese procesador).

Nota ARM siempre ha permitido los accesos no alineados, a veces por defecto (ARM7TDMI) después de que el valor predeterminado era arrojar un aborto de datos, pero puede cambiar la configuración para que no lo haga. Desalineado en ARM no hace lo que los programadores x86 quieren, por ejemplo. si lee 32 bits en la dirección 0x02, no obtiene necesariamente la colección de bytes 0x02, 0x03, 0x04, 0x05, puede/obtendrá 0x02, 0x03, 0x00, 0x01, utilizando un bus AMBA/AXI de 32 bits. PODRÍA obtener el resultado deseado en un bus AMBA/AXI de 64 bits pero quizás no, definitivamente en 32 y 64 bits si lee 32 bits en la dirección 0x0E obtendrá 0x0E 0x0F y 0x08 0x09 o 0x0c 0x0D. No del todo lo que los programadores esperan (por lo general, algunos que saben cómo funciona usarlo como un buen intercambio de bytes), por lo que a menudo se deja como arrojando un aborto de datos y el programador arreglando su código.

Los compiladores de C muy a menudo crean accesos no alineados, por lo que es difícil para los programadores x86 portar su código o pasar de esa plataforma a cualquier otro sistema. Ellos pagan una fuerte penalización en x86 (rendimiento horrible), pero no una penalización tan pesada como otros procesadores (interrupciones de memoria). SO está cargado con preguntas sobre el tema, ¿cómo hago que mi código se ejecute en el procesador xyz?

Saldré de la caja de jabón. ARM hace un excelente trabajo documentando todo esto (en relación con otros proveedores de chips). El TRM (manual de referencia técnica, cada núcleo tiene uno) describe las opciones de bus o bus de AMBA/AXI y entrará en los tipos de transacción. Luego, los documentos de AMBA/AXI van más allá para explicar lo que está sucediendo. El agujero puede ser un mapa entre las instrucciones y los tipos de transacción. Cuando haces un ldm de 6 palabras en una dirección de 0x4 en un bus AXI de 64 bit obtienes una lectura de 32 bits en la dirección 4, longitud de 1. Luego obtienes una longitud de 2 lectura de 64 bits (cuatro bytes) en la dirección 0x8 (cubriendo las palabras 0x8, 0xC, 0x10 y 0x14, luego una lectura separada de 32 bits en la dirección 0x18. El hecho de que se convierta en transacciones de 3 axi no significa que no sea atómico; deja una oportunidad para que no sea atómica, seguro , pero tendría que verificar los documentos ARM.