¿Es posible encontrar el rango de direcciones físicas de un DIMM?

17

Observo que SMBios Tipo 20 ayudaría aquí, pero es opcional a partir de la versión 2.5 (2006-09-05) pp. 25, L796 y pp. 131 , mientras que los tipos 16, 17 y 19 son obligatorios, pero no del todo ayuda.

Matriz de memoria física (tipo 16)

Existe una de estas estructuras para todo el sistema, que explica lo que es posible en este tablero.

Handle 0x1000, DMI type 16, 23 bytes
Physical Memory Array
    Location: System Board Or Motherboard
    Use: System Memory
    Error Correction Type: Multi-bit ECC
    Maximum Capacity: 768 GB
    Error Information Handle: Not Provided
    Number Of Devices: 24

Dispositivo de memoria (tipo 17)

Hay un registro por cada Dimm, que le indica los Dimms físicos instalados en el tablero.

Handle 0x1100, DMI type 17, 34 bytes
Memory Device
    Array Handle: 0x1000
    Error Information Handle: Not Provided
    Total Width: 72 bits
    Data Width: 64 bits
    Size: 2048 MB
    Form Factor: DIMM
    Set: 1
    Locator: DIMM_A1 
    Bank Locator: Not Specified
    Type: DDR3
    Type Detail: Synchronous Registered (Buffered)
    Speed: 1600 MHz
    Manufacturer: XXXX
    Serial Number: XXXX
    Asset Tag: XXXX
    Part Number: XXXX 
    Rank: 1
    Configured Clock Speed: 1333 MHz

Dirección asignada de matriz de memoria (tipo 19)

Puede haber varios de estos registros, y cada registro enumera un rango de direcciones físicas.

Aquí está la salida con dos unidades de 2GB:

Handle 0x1300, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00000000000
    Ending Address: 0x000CFFFFFFF
    Range Size: 3328 MB
    Physical Array Handle: 0x1000
    Partition Width: 2

Handle 0x1301, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00100000000
    Ending Address: 0x0012FFFFFFF
    Range Size: 768 MB
    Physical Array Handle: 0x1000
    Partition Width: 2

Y aquí está la salida con 4 palos; 2 * 2GB y 2 * 4GB:

Handle 0x1300, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00000000000
    Ending Address: 0x000CFFFFFFF
    Range Size: 3328 MB
    Physical Array Handle: 0x1000
    Partition Width: 2

Handle 0x1301, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00100000000
    Ending Address: 0x0032FFFFFFF
    Range Size: 8960 MB
    Physical Array Handle: 0x1000
    Partition Width: 2

Tenga en cuenta que en la primera salida de muestra anterior, había dos DIMM de 2GB, pero dos rangos de 3.3GB y 0.7GB. Con 4 Dimms, el sistema también fusionará la región de direcciones mapeadas de la matriz de memoria en dos fragmentos, ya que solo representa lo mismo que el mapa e820, es decir, los rangos de direcciones físicas de memoria válidas.

1 a muchos registros Tipo 20 están vinculados a exactamente un dispositivo de memoria tipo 17, lo que significa que se puede conocer todo el rango físico:

Ejemplo

$ sudo dmidecode -t 20
# dmidecode 2.12
SMBIOS 2.6 present.

Handle 0x002F, DMI type 20, 19 bytes
Memory Device Mapped Address
    Starting Address: 0x00000000000
    Ending Address: 0x000FFFFFFFF
    Range Size: 4 GB
    Physical Device Handle: 0x002B
    Memory Array Mapped Address Handle: 0x002E
    Partition Row Position: 1

Handle 0x0030, DMI type 20, 19 bytes
Memory Device Mapped Address
    Starting Address: 0x00100000000
    Ending Address: 0x001FFFFFFFF
    Range Size: 4 GB
    Physical Device Handle: 0x002C
    Memory Array Mapped Address Handle: 0x002E
    Partition Row Position: 1

Parece posible pasar de la dirección al DIMM para EDAC - Detección de errores y propósitos de corrección , pero no del DIMM a todo el rango.

Mirando el código fuente de mcelog , también está usando el tipo 20 para su decodificación.

Alun
fuente
¿Puedes explicar tu Q más? Realmente no entiendo lo que estás preguntando. Más detalles o ejemplos serían una gran ventaja. ¿2 herramientas que comenzaría con / son dmidecodey lshw, pero creo que está buscando más de lo que proporcionan?
slm
@slm: se lshwusa dmidecodecomo código base y dmidecode -t 20proporciona la información deseada. Pero, como se señaló, en la versión 2.5 de SMBIOS, la estructura que contiene esta información "Dirección asignada del dispositivo de memoria", también conocida como Tipo 20 o ubicación del banco, es opcional, por lo tanto, Q es si hay otra forma de recuperar la misma información. - Enlace entre type 17el valor del localizador y el rango de direcciones físicas (como lo proporciona opcionalmente Type 20).
Runium
@Sukminder - gracias. Esta información probablemente debería incorporarse a la Q. Ya que tiene un control, ¿le importaría?
slm
@Sukminder: agregué algunos dmidecode -t 20resultados de muestra , ¿puede explicar el valor del localizador del tipo 17 en comparación con la dirección física, tipo 20?
slm
Asumiré que no trabajas para una agencia gubernamental de 3 letras o tienes su nivel de financiación. Y, si estás allí, entonces no estás preguntando aquí. Para una PC / Servidor / MAC moderna, los rangos de memoria física a menudo se asignan a Rangos virtuales, luego el SO puede reasignarlos, es posible que no pueda resolverlo. Incluso entonces, podría asignarlo a la memoria extendida de 640k + de los días de DOS. El uso de un sistema operativo de 32 bits probablemente le dará una respuesta diferente a la de un sistema operativo de 64 bits. ¿Cuál es tu objetivo final?
MikeP

Respuestas:

1

Cuando tiene varios DIMMS, el BIOS puede configurarlos en alguna intercalación. Por lo tanto, es posible que tenga un DIMM 2G físico 0G-> 4G, bytes 0-7, omitiendo 8-15. (es decir, bajo-64 bits) El otro DIMM 2G es físico 0G-> 4G, bytes 8-15, omitiendo 0-7. (alto-64 bits). Tenga en cuenta que creo que la intercalación es en realidad más grande que eso, porque creo que si tiene memoria QDR, que el sistema puede hacer 1 dirección, 8 ciclos de datos de 64 bits, por lo que sería mejor intercalar unidades de 64 bytes.

Los arreglos físicos de 0.7G y 3.3G que ve tienen que ver con la necesidad de mantener abiertos algunos de los 4G inferiores para dispositivos PCI, memorias intermedias VGA, basura clásica <1M 8086, etc. Esto se hace por el puente norte. Entonces tiene un mapa como: 0-> 640K, 1M-> 3.3G, 0.7G para BIOS, PCI, etc., hasta 4G. Y luego 4G-> 4.7G para ram.

mcr
fuente
0

La solución de la fuerza bruta parece ser

  1. registrar el rango de memoria de la configuración actual
  2. apague, quite el DIMM en cuestión y todos los DIMM encima
  3. reiniciar, revisar la nueva configuración.
K7AAY
fuente
2
No estoy seguro de que eso ayude ... es decir, si tenía 6 DIMM de 2 GB y elimina un par, es probable que su rango superior se reduzca en 4 GB, pero eso no le indica dónde estaban en el caso anterior, pero probaré esto y actualizar.
Alun
"... y todos los DIMM encima", por ejemplo, si el DIMM en cuestión está en la ranura 2, también quite el DIMM en las ranuras 3 ... n
K7AAY
-1

Todo es hoy en día virtual.

Hay algo llamado MMU en el hardware que ya traduce las direcciones del sistema operativo en direcciones físicas reales. También podría distribuir la carga entre los DIMM y asignar otras partes del hardware al espacio de direcciones. Lo que se llama espacio de direcciones físicas a nivel del sistema operativo ya es a través de la vista traducida TLB .

/programming/36639607/how-exactly-do-kernel-virtual-addresses-get-translated-to-physical-ram es una buena explicación.

Thomas
fuente
1
Dijo que quería el rango de direcciones físicas .
Dirkt
1
Intel agregó una MMU al 80286 y era completamente funcional en i386 ... eso fue hace más de 30 años ... tanto por la memoria "hoy en día todo es virtual" :) casi siempre se ha virtualizado.
Eric