Cómo se muestra la dirección física en cadenas y bancos DRAM

En un artículo anterior, discutimos cómo los procesadores Intel Sandy Bridge mapean direcciones físicas en el caché L3.

Ahora le diré cómo los controladores de memoria de estos procesadores asignan direcciones físicas a una ubicación en DRAM, en particular, los números de línea, banco y columna en los módulos DRAM. Llámelo mapeo de direcciones DRAM . Yo uso una máquina de prueba como ejemplo.

Motivación: error Rowhammer


Estoy interesado en asignar direcciones DRAM, ya que se relaciona con un error de Rowhammer .

Rowhammer es un problema con algunos módulos DRAM donde ciertos modelos de acceso a memoria en el peor de los casos pueden provocar daños en la memoria. En estas DRAM, la activación múltiple de una línea de memoria ("obstrucción de línea") produce ruido eléctrico que cambia los bits en las células vulnerables de las líneas adyacentes.

Estas activaciones de línea repetidas pueden ser causadas por el acceso múltiple a un par de direcciones DRAM que se encuentran en diferentes líneas del mismo banco DRAM. Conocer la asignación de direcciones DRAM es útil porque indica qué pares de direcciones satisfacen esta propiedad de "un banco, fila diferente" (mismo banco, fila diferente; SBDR).

Adivinar y verificar el mapeo de direcciones


Para la prueba, tengo una máquina con módulos DRAM vulnerables al error Rowhammer. Ejecutar rowhammer_test en esta máquina muestra un pequeño cambio.

Me gustaría conocer el esquema de asignación de direcciones DRAM para esta máquina, pero no está documentado públicamente: aquí está el procesador Sandy Bridge, pero Intel no documenta la asignación de direcciones utilizada por los controladores de memoria de estos procesadores.

De hecho, la prueba rowhammer_test no necesita conocer pares de direcciones SBDR. Solo intenta varias veces martillar en pares de direcciones seleccionadas al azar. Por lo general, 1/8 o 1/16 de ellos resultan ser pares SBDR, porque en nuestro automóvil hay 8 bancos en cada DIMM (y 16 bancos en total). Por lo tanto, no necesitamos conocer el mapeo de las direcciones DRAM para causar un pequeño cambio en la memoria, pero dicho conocimiento ayudará a realizar la prueba de manera más decidida.

Aunque el mapeo de direcciones no está documentado, descubrí que podía hacer una suposición razonable al respecto basada en la geometría DRAM, y luego verificar la suposición basada en las direcciones físicas informadas por rowhammer_test . La prueba informa las direcciones físicas donde cambian los bits ( "víctimas" ) y los pares de direcciones físicas que realizan estos cambios ( "agresores" ). Dado que estos pares deben ser pares SBDR, podemos verificar un mapeo hipotético de direcciones a estos datos empíricos.

Geometría de la memoria


El primer paso: verifique cuántos DIMM están instalados en la máquina y cómo están organizados internamente.

Puedo solicitar información DIMM usando la decode-dimms en Linux (en Ubuntu está en el paquete de I2C-tools ). Esta herramienta decodifica metadatos SPD (Detección de presencia en serie) en DIMM.

En mi máquina de prueba, dos SO-DIMM de cuatro gigabytes, que proporcionan 8 GB de memoria.

La decode-dimms informa la siguiente información para cada uno de los módulos:

  Size 4096 MB
 Bancos x Filas x Columnas x Bits 8 x 15 x 10 x 64
 Rangos 2 

Esto significa que ambos DIMM:

  • Cada banco tiene 2 ^ 15 líneas (32768 líneas).
  • Cada línea contiene 2 ^ 10 * 64 bits = 2 ^ 16 bits = 2 ^ 13 bytes = 8 KB.

Cada DIMM tiene 2 rangos y 8 bancos. La verificación cruzada de la capacidad del DIMM proporciona el tamaño esperado:

8 KB por línea * 32768 líneas * 2 rangos * 8 bancos = 4096 MB = 4 GB

Asignación de direcciones DRAM


En mi computadora de prueba, los bits de direcciones físicas se usan de la siguiente manera:

  • Bits 0-5 : estos son los 6 bits inferiores del índice de bytes en la cadena (es decir, el índice de 6 bits para la línea de caché de 64 bytes).
  • Bit 6 : este es un número de canal de 1 bit que selecciona entre dos DIMM.
  • Bits 7-13 : los 7 bits superiores del índice en una fila (es decir, los bits superiores del número de columna).
  • Bits 14-16 : XOR con los 3 bits inferiores del número de línea, lo que da un número de banco de 3 bits.
  • Bit 17 : un número de rango de 1 bit que selecciona entre dos rangos DIMM (que generalmente son dos lados de un chip DIMM).
  • Bits 18-32 : número de línea de 15 bits.
  • Bits 33+ : se pueden configurar porque la memoria física comienza con direcciones físicas mayores que 0.

¿Por qué tal pantalla?


Este mapeo es rowhammer_test a los resultados de rowhammer_test (ver más abajo), pero también podemos explicar que los bits de dirección están mapeados de tal manera que proporcionen un buen rendimiento para los patrones de acceso de memoria típicos, como el acceso secuencial y el acceso paso a paso ( acceso restringido):

  • Canales de concurrencia . Colocar un número de canal en el bit 6 significa que las líneas de caché alternarán entre dos canales (es decir, dos DIMM) a los que se puede acceder en paralelo. Esto significa que si accedemos a las direcciones secuencialmente, la carga se distribuirá en dos canales.

    Por cierto, Ivy Bridge (el sucesor de Sandy Bridge) parece complicar la visualización del número de canal. La presentación de Intel menciona el "hashing de canales" y afirma que "le permite seleccionar un canal basado en múltiples bits de dirección". Históricamente, fue "A [6]". Esto asegura una distribución más uniforme del acceso a la memoria a través de los canales ".
  • Deslizamiento bancario : en general, la disposición de los números de columna, bancos y líneas debe minimizar el cambio frecuente de líneas bancarias activas (sacudidas bancarias).

    Una pequeña introducción: los módulos DRAM se organizan en bancos, que, a su vez, se organizan en líneas. Cada banco tiene una "línea activa actual": su contenido se copia en el búfer de línea , que actúa como un caché, al que se puede acceder rápidamente. El acceso a otra línea lleva más tiempo porque primero debe activarse. Entonces, al mapear direcciones DRAM, los pares SBDR se llevan lo más lejos posible en el espacio de direcciones físicas.

    Las líneas de persecución (martilleo de fila) son un caso especial de deslizamiento de un banco cuando dos líneas específicas se activan alternativamente (posiblemente a propósito).
  • Paralelismo bancario : se puede acceder a los bancos en paralelo (aunque en menor medida que los canales), por lo que el número de banco cambia antes que el número de línea a medida que aumenta la dirección.
  • Esquema XOR : XOR'ing los bits menos significativos de un número de línea a un número de banco es un truco para evitar deslizar el banco al acceder a las matrices en grandes pasos. Por ejemplo, en la pantalla anterior, XOR'ing obliga a las direcciones X y X + 256k a ubicarse en diferentes bancos, sin formar un par SBDR.

    Los esquemas de XOR para banco / línea se describen en varias publicaciones, por ejemplo:

Reconciliación con rowhammer_test


La ejecución de rowhammer_test_ext (una versión extendida de rowhammer_test ) en una máquina de prueba durante 6 horas reveló un cambio repetido de bits en 22 lugares. (ver datos fuente y código de análisis ).

La prueba de cadenas de acuñación genera conjuntos de tres direcciones (A1, A2, V):

  • V es la dirección de la víctima, donde vemos el cambio de bits.
  • A1 y A2 son las direcciones del agresor que acuñamos.
  • Clasifique A1 y A2 para que A1 esté más cerca de V que A2. Suponemos tentativamente que una dirección más cercana, A1, en realidad causa un cambio de bit (aunque esto no sería necesariamente cierto si se usara una asignación más compleja de direcciones DRAM).

Para todos estos resultados, esperamos completar tres propiedades:

  • Línea : los números de línea A1 y V deben diferir en 1, es decir deberían estar en líneas adyacentes. (A2 puede tener cualquier número de línea).

    Esta propiedad facilita determinar dónde están los bits más bajos del número de línea en la dirección física.

    La prueba mostró que esta propiedad es válida para todos menos dos resultados. En estos dos resultados, los números de línea difieren en 3 en lugar de 1.
  • Banco : V, A1 y A2 deben tener el mismo número de banco. De hecho, esta propiedad se manifestó en los 22 resultados. Se guarda solo cuando se aplica el esquema XOR'ing de líneas / bancos.
  • Canal : V, A1 y A2 deben tener el mismo número de canal. Esto es cierto para todos los resultados. Sucede que todos los resultados tienen canal = 0, porque rowhammer_test selecciona solo las direcciones alineadas en 4k y, por lo tanto, solo prueba un canal (tal vez esto pueda considerarse un error).

Posibles pruebas adicionales


En el futuro, puede ejecutar dos experimentos más para verificar si la asignación de dirección DRAM evalúa la propiedad SBDR correctamente:

  • Medición del tiempo : el acceso múltiple a pares de direcciones SBDR debería ser más lento que el acceso múltiple a pares sin SBDR, porque el primero provoca la activación de las líneas y el segundo no.
  • Pruebas exhaustivas de Rowhammer : tan pronto como encontremos la dirección del agresor A1, que causa un cambio repetido de bits, podemos verificar esto en muchos valores de A2. El efecto de la moneda (A1, A2) cambiará los bits solo si es un par de SBDR.

Además, eliminar un DIMM de la unidad del sistema debería eliminar el bit del canal del mapeo de la dirección DRAM y, en consecuencia, cambiar las direcciones del agresor y la víctima. Esto también se puede verificar.

Source: https://habr.com/ru/post/es431102/


All Articles