Linux Fu : Lire la mémoire de votre mémoire

Les utilisateurs de Linux ont de nombreux logiciels dont ils peuvent être fiers. Cependant, il existe parfois un programme Windows qui fait quelque chose que vous aimeriez vraiment faire et qui ne fonctionnera tout simplement pas. Cela est particulièrement vrai pour les programmes système de bas niveau. Si vous voulez fouiller dans votre processeur et votre mémoire, par exemple, il existe des tonnes de programmes pour cela sous Windows. Il y en a quelques-uns pour Linux, mais ils ne sont pas toujours aussi complets ou pratiques. Récemment, la moitié de la mémoire de mon bureau principal a échoué et je voulais fouiller dans le système. En particulier, je souhaitais lire les informations encodées dans l’EEPROM de configuration des puces mémoires. Ça devrait être facile, non ? Vous penseriez.

Pas vraiment facile

Un bon outil que beaucoup d’utilisateurs de Windows ont est CPU-Z. Bien sûr, il ne fonctionne pas sous Linux, mais il existe un très bon imitateur appelé CPU-X. Vous pouvez probablement l’installer à partir de vos référentiels. Cependant, la page GitHub est une étape agréable si ce n’est pour aucune autre raison que de profiter du nom d’utilisateur [TheTumultuousUnicornOfDarkness]. Le programme a une interface gtk ou ncurses. Vous n’avez pas besoin de l’exécuter en tant que root, mais si vous appuyez sur le bouton « démarrer le démon » et que vous vous authentifiez, vous pouvez voir des informations supplémentaires, y compris un onglet pour la mémoire.

Ne vous excitez pas. Il ne lit pas les informations EEPROM, donc ça a échoué pour moi, mais c’est toujours un bon outil. Ce qu’il fait, cependant, c’est vous dire quelle est la vitesse actuelle de la RAM avec le fournisseur. Il vous montre également beaucoup d’autres choses, y compris des repères pour votre cache et votre ordinateur.

Alors que voulons-nous ?

Une clé DRAM moderne contient une petite EEPROM que le processeur peut lire via I2C. Il s’agit de la « détection de présence série » ou de la mémoire SPD. Chaque génération de DRAM a une disposition légèrement différente, mais en général, elle permet au processeur de s’adapter à la vitesse de la mémoire et à toute autre exigence étrange qu’il pourrait avoir. De plus, il y a de la place supplémentaire là-dedans, et Intel a défini une zone pour stocker des paramètres améliorés si vous souhaitez demander à la RAM d’aller plus vite que prévu. La plupart des cartes mères AMD peuvent également lire ces informations – le profil XMP – et les utiliser. AMD dispose également d’une technologie similaire appelée AMP et, pour la DDR5, EXPO, qui ont toutes le même objectif.

Parmi les informations qui devraient figurer dans le SPD figurent le fournisseur de la puce RAM et le « rang » de la mémoire : c’est-à-dire, utilise-t-elle un jeu de puces ou deux ? Bien sûr, Linux peut lire I2C, donc pas de problème, n’est-ce pas ?

Prochain essai

Bien sûr. Il y a même un bel outil appelé decode-dimms ça devrait nous faire l’affaire. Si vous l’exécutez, il y a de fortes chances que vous obteniez une erreur indiquant que vous devez charger at24, eepromou ee1004 Conducteurs. Le at24 les pilotes sont génériques, et si vous essayez ee1004, ça n’aidera pas encore, de toute façon. Donc, vous chargez consciencieusement eeprom en utilisant:

sudo modprobe eeprom

En cours decode-dimms fonctionne maintenant. Type de. Pour la DRAM DDR4 (et probablement d’autres), il se plaindra que le périphérique EEPROM n’est pas de la bonne taille et que vous auriez dû utiliser ee1004. C’est bien, mais ça n’a pas l’air de marcher. Peut-être avez-vous besoin des deux ? Non. En fait, si vous chargez eepromil saisira les appareils SPD et ee1004 ne pourra pas les trouver. Si tu as eeprom chargé (lsmod peut vous le dire), vous devez le décharger :

sudo modprobe -r eeprom
sudo modprobe ee1004

Trouver SPD

Le vrai problème est que ee1004 ne sait pas comment trouver le SPD par lui-même. Vous devrez aider. La première chose que vous devez faire est de trouver les adaptateurs SMBus sur votre carte mère. Vous pouvez en avoir plus d’un (moi oui). Voici comment procéder :


i2cdetect -l

i2c-0   smbus           SMBus PIIX4 adapter port 0 at 0b00      SMBus adapter
i2c-1   smbus           SMBus PIIX4 adapter port 2 at 0b00      SMBus adapter
i2c-2   smbus           SMBus PIIX4 adapter port 1 at 0b20      SMBus adapter
i2c-3   i2c             NVIDIA GPU I2C adapter                  I2C adapter
i2c-4   i2c             NVIDIA i2c adapter 1 at b:00.0          I2C adapter
i2c-5   i2c             NVIDIA i2c adapter 3 at b:00.0          I2C adapter
i2c-6   i2c             NVIDIA i2c adapter 4 at b:00.0          I2C adapter
i2c-7   i2c             NVIDIA i2c adapter 5 at b:00.0          I2C adapter
i2c-8   i2c             NVIDIA i2c adapter 6 at b:00.0          I2C adapter

Votre liste sera, bien sûr, différente. J’ai trois adaptateurs SMBus différents et le SPD de chaque appareil sera compris entre 0x50 et 0x57. Donc on peut faire un peu de chasse (j’utilise -y 0parce que je veux regarder i2c-0):


i2cdetect -y 0 0x50 0x70

0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:
10:
20:
30:
40:
50: -- -- 52 53 -- -- -- --
60:
70:

Quelques remarques. Si vous ne voyez aucun numéro ici, essayez les autres bus (dans mon cas, -y 1 et -y 2). Si vous voyez « UU » au lieu d’un numéro, cela signifie qu’il y a déjà un appareil en cours d’utilisation. Vous avez probablement oublié de décharger eeprom ou il a refusé de décharger. Vous devrez corriger cela avant d’aller beaucoup plus loin.

Au fait, je suppose que vous avez chargé les pilotes i2c de base, et c’est probablement le cas. Sinon, vous devrez peut-être charger quelque chose comme i2c-amd-mp2-pci ou i2c-i801. Tout dépend de ta carte mère. Essayez un lsmod pour voir à quoi ressemble i2c-something-something. Vous pouvez également effectuer la complétion du shell sur modprobe si vous avez cette configuration ou recherchez dans votre répertoire /lib/modules les choses qui commencent par i2c.

Retour à ee1004

Si vous n’avez pas ee1004 chargé, c’est le moment de s’assurer qu’il est là. Cela ne fera pas de mal de le charger deux fois, mais si cela vous dérange, utilisez lsmod. Si ce n’est pas le cas ou si vous voulez simplement être sûr :

sudo modprobe ee1004

Bien sûr, si vous ne l’avez pas, vous avez besoin d’un nouveau noyau ou vous devez construire le module. Ces deux choses vont au-delà de ce dont je veux parler ici, mais si vous avez un nouveau noyau d’une distribution majeure, ça devrait aller.

L’étape suivante consiste à créer les appareils en utilisant les numéros i2cdetect vous a donné dans le bus que vous avez trouvé. Donc dans mon cas, j’ai besoin de i2c-0 0x52 et 0x53. N’oubliez pas qu’il manque la moitié de ma RAM, c’est pourquoi il y a deux appareils. Vous pouvez en avoir quatre et vos chiffres peuvent être différents. Ne présumez pas que mes numéros sont votre numéro.

Pour créer un nouveau périphérique, nous devons écrire dans le répertoire /sys. Lorsque vous utilisez sudo, vos redirections n’obtiennent pas les privilèges root, vous devez donc procéder d’une autre manière. Personnellement, j’utilise juste sudo -i pour démarrer un shell root, mais vous pouvez utiliser sudo tee si tu veux:


# This is one way if you are already root
echo ee1004 0x52 >/sys/bus/i2c/devices/i2c-0/new-device
# If you aren't root, try this:
echo ee1004 0x53 | sudo tee /sys/bus/i2c/devices/i2c-0/new-device

Une fois que vous avez créé tous les périphériques, probablement deux ou quatre, à moins que vous n’ayez un nombre impair de clés USB, vous êtes prêt à vider les EEPROMS. Si vous vous trompez, vous pouvez supprimer un périphérique comme celui-ci, en supposant que vous êtes root :

echo 0x53 >/sys/bus/i2c/devices/i2c-0/delete-device

Décodage

Il ne vous reste plus qu’à exécuter le decode-dimms commande. La sortie est importante, mais vous pouvez économiser de l’espace en lui demandant de faire le mode côte à côte. Vous pouvez également lui demander de sortir du HTML (-f) si vous voulez le regarder bien formaté dans un navigateur. Il y a beaucoup de sortie, mais c’est le début:


decode-dimms --side-by-side

Memory Serial Presence Detect Decoder
By Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
Jean Delvare, Trent Piepho and others

Decoding EEPROM                                  0-0052           0-0053
Guessing DIMM is in                              bank 3           bank 4
Kernel driver used                               ee1004

---=== SPD EEPROM Information ===---
EEPROM CRC of bytes 0-125                        OK (0xFE45)
# of bytes written to SDRAM EEPROM               384
Total number of bytes in EEPROM                  512
Fundamental Memory type                          DDR4 SDRAM
SPD Revision                                     1.1
Module Type                                      UDIMM
EEPROM CRC of bytes 128-253                      OK (0xDF74)

---=== Memory Characteristics ===---
Maximum module speed                             2400 MT/s (PC4-19200)
Size                                             16384 MB
Banks x Rows x Columns x Bits                    16 x 16 x 10 x 64
...

Profils XMP

Malheureusement, cela ne lit toujours pas le profil XMP. Cependant, vous pouvez facilement vider un vidage hexadécimal de l’EEPROM. Si vous voulez un vidage brut, essayez :

dd if=/sys/bus/i2c/drivers/ee1004/0-0052/eeprom out=/tmp/dump.bin   # bus 0, device 52 for me

Si vous voulez un vidage hexadécimal, essayez :

hexdump -C /sys/bus/i2c/drivers/ee1004/0-0052/eeprom   # or use xxd, od, etc.

Notez que la page Wikipedia sur SPD montre le décalage XMP pour la RAM DDR3. Si vous avez autre chose, le décalage sera différent, mais vous devriez toujours trouver le nombre magique d’en-tête. Pour ma DDR4, c’est à l’emplacement 0x180, par exemple.

Vous pouvez le séparer pour l’hexagone ou voici une idée : écrivez un décodeur et placez-le sur GitHub. Bien sûr, j’y ai pensé, mais ce post est déjà assez long ! Heureusement, hardinfo – qui est un excellent outil, a déjà un décodeur, mais la version du référentiel Ubuntu ne fonctionne pas ee1004. Si vous construisez la version à partir de GitHub, cela fonctionne très bien. Cependant, vous devez toujours configurer les pilotes, il valait donc la peine d’obtenir decode-dimms travailler.

Conclure

La commande hardinfo peut vous montrer beaucoup d’informations si vous avez configuré le bus

Il existe quelques autres outils qui vous donneront des informations sur votre RAM qu’elle obtient du système ou du SPD, y compris, bien sûr, hardinfo. Le lshw l’utilitaire peut vous en dire un peu plus sur votre DRAM (essayez -C memory pour limiter la sortie). Le dmidecode -t La commande memory peut également afficher quelques éléments. Il y en a probablement plus.

Ce serait bien si les pilotes i2c captaient vos puces mémoire indépendamment. Pourtant, une fois que vous l’avez configuré, ce n’est pas si difficile et vous n’aurez peut-être besoin de le faire qu’une seule fois. La DDR5 a probablement ses propres rides. Si vous voulez en savoir trop sur la mémoire DDR4, il y a une vidéo que vous devriez probablement regarder.

François Zipponi
Je suis François Zipponi, éditorialiste pour le site 10-raisons.fr. J'ai commencé ma carrière de journaliste en 2004, et j'ai travaillé pour plusieurs médias français, dont le Monde et Libération. En 2016, j'ai rejoint 10-raisons.fr, un site innovant proposant des articles sous la forme « 10 raisons de... ». En tant qu'éditorialiste, je me suis engagé à fournir un contenu original et pertinent, abordant des sujets variés tels que la politique, l'économie, les sciences, l'histoire, etc. Je m'efforce de toujours traiter les sujets de façon objective et impartiale. Mes articles sont régulièrement partagés sur les réseaux sociaux et j'interviens dans des conférences et des tables rondes autour des thèmes abordés sur 10-raisons.fr.