È possibile trovare l'intervallo di indirizzi fisico di un modulo DIMM?


17

Noto che SMBios Type 20 sarebbe di aiuto in questo caso, ma è facoltativo a partire dalla versione 2.5 (2006-09-05) pp. 25, L796 e pp. 131 , mentre i tipi 16, 17 e 19 sono obbligatori, ma non del tutto Aiuto.

Matrice di memoria fisica (tipo 16)

Esiste una di queste strutture per l'intero sistema, che spiega ciò che è possibile su questa scheda.

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 di memoria (tipo 17)

C'è un record per ogni Dimm, che ti dice i Dimm fisici installati sulla scheda.

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

Indirizzo mappato array di memoria (tipo 19)

Possono esserci più di questi record e ogni record elenca un intervallo di indirizzi fisici.

Ecco l'output con due stick da 2 GB:

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

Ed ecco l'uscita con 4 stick; 2 * 2 GB e 2 * 4 GB:

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

Si noti che nel primo output di esempio precedente, c'erano due DIMM da 2 GB, ma due intervalli di 3,3 GB e 0,7 GB. Con 4 dimmer, il sistema unirà anche la regione di indirizzi mappata dell'array di memoria in due blocchi, poiché rappresenta lo stesso della mappa e820, ovvero gli intervalli di indirizzi fisici di memoria validi.

Da 1 a molti record di tipo 20 sono collegati esattamente a un dispositivo di memoria di tipo 17, il che significa che è possibile conoscere l'intero intervallo fisico:

Esempio

$ 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

Sembra possibile passare dall'indirizzo al DIMM per scopi EDAC - Error Detection & Correction , ma non dal DIMM all'intero intervallo.

Guardando il codice sorgente di mcelog , sta anche usando il tipo 20 per la sua decodifica.


Puoi spiegare ulteriormente la tua Q? Non seguo davvero quello che stai chiedendo. Maggiori dettagli o esempi sarebbero un grande vantaggio. 2 strumenti che vorrei iniziare w / are dmidecodee lshw, ma penso che tu stia cercando qualcosa di più di quello che offrono?
slm

@slm: lshwutilizza dmidecodecome base di codice e dmidecode -t 20fornisce le informazioni desiderate. Ma, come notato, dalla versione 2.5 di SMBIOS la struttura che contiene queste informazioni "Indirizzo dispositivo di memoria mappato" aka tipo 20 o posizione del banco è opzionale - quindi Q è se esiste un altro modo per recuperare le stesse informazioni. - Collegamento tra type 17il valore del localizzatore e l'intervallo di indirizzi fisici (come facoltativamente fornito da Type 20).
Runium,

@Sukminder - grazie. Queste informazioni dovrebbero probabilmente essere semplicemente incorporate nel Q. Dal momento che hai un handle su, ti dispiacerebbe?
slm

@Sukminder - Ho aggiunto un dmidecode -t 20output di esempio , puoi spiegare il valore di localizzazione del tipo 17 rispetto all'add. Fisico, tipo 20?
slm

Presumo che tu non lavori per un'agenzia governativa di 3 lettere o abbia il loro livello di finanziamento. E, se ci sei, non lo stai chiedendo qui. Per un PC / Server / MAC moderno, gli intervalli di memoria fisica vengono spesso mappati su intervalli virtuali, quindi potrebbero essere mappati nuovamente dal sistema operativo, potresti non essere in grado di capirlo. Anche allora, potrebbe mapparlo nella memoria estesa 640k + dei giorni DOS. L'uso di un sistema operativo a 32 bit ti darà probabilmente una risposta diversa rispetto a un sistema operativo a 64 bit. Qual è il tuo obiettivo finale?
MikeP,

Risposte:


1

Quando si hanno più DIMMS, il BIOS potrebbe configurarli in alcuni interfogli. Quindi potresti avere un DIMM 2G fisico 0G-> 4G, byte 0-7, saltando 8-15. (ovvero 64 bit bassi) Gli altri 2MM DIMM sono 0G-> 4G fisici, byte 8-15, saltando 0-7. (64 bit alti). Si noti che penso che l'interleave sia in realtà più grande di quello, perché penso che se si dispone di memoria QDR, che il sistema può eseguire 1 indirizzo, cicli di dati 8x a 64 bit, quindi interleaving con unità di 64 byte sarebbe meglio.

Le disposizioni fisiche 0.7G e 3.3G che vedi hanno a che fare con la necessità di tenere aperti alcuni dei 4G inferiori per dispositivi PCI, buffer VGA, schifezze classiche <1M 8086, ecc. Questo è fatto dal ponte nord. Quindi hai una mappa come: 0-> 640K, 1M-> 3.3G, 0.7G per BIOS, PCI, ecc. Fino a 4G. E poi 4G-> 4.7G per ram.


0

La soluzione della forza bruta sembra essere

  1. registra l'intervallo di memoria della configurazione corrente
  2. spegnere, rimuovere il modulo DIMM in questione e tutti i moduli DIMM sopra di esso
  3. riavviare, rivedere la nuova configurazione.

2
Non sono sicuro che aiuti ... cioè se avessi 6 DIMM da 2 GB e ne rimuovessi una coppia, è probabile che la tua gamma superiore si riduca solo di 4 GB, ma questo non ti dice dove fossero nel caso precedente, ma proverò questo e l'aggiornamento.
Alun,

".. e tutti i moduli DIMM sopra di esso", ad esempio, se il modulo DIMM in questione si trova nello slot 2, rimuovere anche il
modulo


-1

Oggi tutto è virtuale.

Nell'hardware esiste qualcosa chiamato MMU che traduce già gli indirizzi per il sistema operativo in indirizzi fisici reali. Potrebbe inoltre distribuire il carico tra i moduli DIMM e mappare altre parti dell'hardware nello spazio degli indirizzi. Quello che viene chiamato spazio di indirizzi fisico a livello di sistema operativo è già tramite la vista tradotta TLB .

/programming/36639607/how-exactly-do-kernel-virtual-addresses-get-translated-to-physical-ram è una bella spiegazione.


1
Ha detto che voleva l' intervallo di indirizzi fisici .
Dirkt

1
Intel ha aggiunto una MMU all'80286 ed era perfettamente funzionante su i386 ... oltre 30 anni fa ... tanto per la memoria "al giorno d'oggi tutto è virtuale" :) praticamente sempre è stata virtualizzata.
Eric
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.