Est-il possible de trouver la plage d'adresses physiques d'un module DIMM?

17

Je note que SMBios Type 20 aiderait ici, mais il est facultatif à partir de la version 2.5 (2006-09-05) pp. 25, L796 et pp. 131 , tandis que les types 16, 17 et 19 sont obligatoires, mais pas tout à fait Aidez-moi.

Réseau de mémoire physique (type 16)

Il existe une de ces structures pour l'ensemble du système, expliquant ce qui est possible sur cette carte.

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

Périphérique de mémoire (type 17)

Il y a un enregistrement par Dimm, qui vous indique les Dimms physiques installés sur la carte.

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

Adresse mappée de la baie de mémoire (type 19)

Il peut y avoir plusieurs de ces enregistrements, et chaque enregistrement répertorie une plage d'adresses physiques.

Voici la sortie avec deux sticks de 2 Go:

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

Et voici la sortie avec 4 sticks; 2 * 2 Go et 2 * 4 Go:

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

Notez que dans le premier exemple de sortie ci-dessus, il y avait deux modules DIMM de 2 Go, mais deux plages de 3,3 Go et 0,7 Go. Avec 4 Dimms, le système fusionnera également la région d'adresse mappée de la matrice de mémoire en deux blocs, car elle représente simplement la même que la carte e820, c'est-à-dire les plages d'adresses physiques de mémoire valides.

1 à plusieurs enregistrements de type 20 sont liés à exactement un périphérique de mémoire de type 17, ce qui signifie que toute la plage physique peut être connue:

Exemple

$ 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

Il semble possible de passer de l'adresse au module DIMM à des fins de détection et de correction d'EDAC , mais pas du module DIMM à l'ensemble de la plage.

En regardant le code source de mcelog , il utilise également le type 20 pour son décodage.

Alun
la source
Pouvez-vous expliquer davantage votre Q? Je ne suis pas vraiment ce que vous demandez. Plus de détails ou d'exemples seraient un énorme plus. 2 outils que je commencerais w / are dmidecodeet lshw, mais je pense que vous cherchez plus que ce qu'ils fournissent?
slm
@slm: lshwutilise dmidecodecomme base de code et dmidecode -t 20donne les informations souhaitées. Mais, comme indiqué, par la version 2.5 de SMBIOS, la structure contenant ces informations "Adresse mappée du périphérique de mémoire" alias Type 20 ou emplacement de la banque est facultative - ainsi Q est s'il existe un autre moyen de récupérer les mêmes informations. - Lien entre type 17la valeur du localisateur et la plage d'adresses physiques (comme fourni en option par Type 20).
Runium
@Sukminder - merci. Cette information devrait probablement être incorporée dans le Q. Puisque vous avez une poignée dessus, cela vous dérangerait?
slm
@Sukminder - J'ai ajouté un exemple de dmidecode -t 20sortie, pouvez-vous expliquer la valeur du localisateur du type 17 par rapport à l'adr. Physique, type 20?
slm
Je suppose que vous ne travaillez pas pour une agence gouvernementale à 3 lettres ou que vous n'avez pas leur niveau de financement. Et, si vous êtes là, vous ne demandez pas ici. Pour un PC / serveur / MAC moderne, les plages de mémoire physique sont souvent mappées sur des plages virtuelles, puis peuvent être remappées par le système d'exploitation, vous ne pourrez peut-être pas le comprendre. Même alors, il pourrait le mapper dans la mémoire étendue 640k + des jours DOS. L'utilisation d'un système d'exploitation 32 bits vous donnera probablement une réponse différente de celle d'un système d'exploitation 64 bits. Quel est votre objectif final?
MikeP

Réponses:

1

Lorsque vous avez plusieurs modules DIMM, le BIOS peut les configurer en un entrelacement. Donc, vous pourriez avoir un DIMM 2G étant 0G-> 4G physique, octets 0-7, sautant 8-15. (c.-à-d. faible 64 bits) L'autre DIMM 2G étant physique 0G-> 4G, octets 8-15, sautant 0-7. (64 bits élevé). Notez que je pense que l'entrelacement est en fait plus grand que cela, car je pense que si vous avez de la mémoire QDR, que le système peut faire 1 adresse, 8x cycles de données 64 bits, donc l'entrelacement par unités de 64 octets serait mieux.

Les dispositions physiques 0.7G et 3.3G que vous voyez ont à voir avec le besoin de garder une partie de la 4G inférieure ouverte pour les périphériques PCI, les tampons VGA, la merde classique <1M 8086, etc. Cela se fait par le pont nord. Vous avez donc une carte comme: 0-> 640K, 1M-> 3.3G, 0.7G pour le BIOS, PCI, etc. jusqu'à 4G. Et puis 4G-> 4.7G pour ram.

mcr
la source
0

La solution Brute Force semble être

  1. enregistrer la plage de mémoire de la configuration actuelle
  2. éteignez, retirez le module DIMM en question et tous les modules DIMM au-dessus
  3. redémarrer, revoir la nouvelle configuration.
K7AAY
la source
2
Je ne suis pas sûr que cela aide ... c'est-à-dire que si vous aviez 6 modules DIMM de 2 Go et que vous en retiriez une paire, votre gamme supérieure est susceptible de rétrécir de 4 Go, mais cela ne vous dit pas où ils étaient dans le cas précédent, mais je vais tester cela et mettre à jour.
Alun
".. et tous les modules DIMM au-dessus", par exemple, si le module DIMM en question se trouve dans l'emplacement 2, retirez également le
module
-1

Tout est aujourd'hui virtuel.

Il y a quelque chose appelé MMU dans le matériel qui traduit déjà les adresses du système d'exploitation en adresses physiques réelles. Il peut également répartir la charge entre les modules DIMM et mapper d'autres parties du matériel dans l'espace d'adressage. Ce que l'on appelle l'espace d'adressage physique au niveau du système d'exploitation est déjà via la vue traduite TLB .

/programming/36639607/how-exactly-do-kernel-virtual-addresses-get-translated-to-physical-ram est une belle explication.

Thomas
la source
1
Il a dit qu'il voulait la plage d'adresses physiques .
dirkt
1
Intel a ajouté un MMU au 80286 et il était entièrement fonctionnel sur i386 ... c'était il y a plus de 30 ans ... tant pis pour "aujourd'hui tout est virtuel" :) la mémoire a presque toujours été virtualisée.
Eric