52 votes

Qu'est-ce que /dev/mem ?

On peut supposer qu'il s'agit d'un lien avec la mémoire. Qu'est-ce qui

sudo cat /dev/urandom > /dev/mem

faire ? Mettre à la poubelle toute la mémoire vive ? Toute la mémoire virtuelle non liée au noyau ? Rien de tout cela ?

39voto

Andrew Flanagan Points 1960

Il permet d'accéder à la mémoire physique du système.

En mem(4) page de manuel explique plus en détail ce qu'est la /dev/mem est.

Oui, cela pourrait causer toutes sortes de problèmes. Un redémarrage devrait régler le problème, mais de mauvaises choses peuvent se produire très facilement. Soyez prudent ! :-)

21voto

rags Points 313

/dev/mem permet d'accéder à la mémoire du système. physique et non la mémoire virtuelle. L'espace d'adressage virtuel du noyau est accessible via /dev/kmem.

Il est principalement utilisé pour accéder aux adresses de mémoire IO liées au matériel périphérique, comme les adaptateurs vidéo.

15voto

Sahil Singh Points 239

sudo cat /dev/urandom > /dev/mem ne fera rien, puisque sudo élèvera les privilèges de cat mais pas ceux de la redirection. Vous pouvez soit faire sudo su et travailler ensuite dans le Shell racine, ou utiliser
sudo dd if=/dev/urandom of=/dev/mem

/dev/mem permet d'accéder à la mémoire physique, c'est-à-dire à toute la mémoire vive du système, mais cela ne signifie pas qu'il vous donne un accès complet en lecture/écriture à la mémoire vive (voir l'option CONFIG_STRICT_DEVMEM dans la rubrique este ). Notez également que certaines régions de la mémoire physique sont occupées par d'autres périphériques tels que la mémoire de la carte vidéo, etc.

Écrire aveuglément à /dev/mem se traduira par un comportement incertain, ici est une vidéo youtube qui fait la même chose.

8voto

Testez-le avec busybox devmem

busybox devmem est un petit utilitaire CLI qui permet d'imbriquer /dev/mem .

Vous pouvez l'obtenir sous Ubuntu avec : sudo apt-get install busybox

Utilisation : lecture de 4 octets de l'adresse physique 0x12345678 :

sudo busybox devmem 0x12345678

Écrire 0x9abcdef0 à cette adresse :

sudo busybox devmem 0x12345678 w 0x9abcdef0

Source : https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85

MAP_SHARED

Lorsque la cartographie /dev/mem que vous voudrez probablement utiliser :

open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)

MAP_SHARED fait que les écritures vont immédiatement dans la mémoire physique, ce qui facilite l'observation et est plus logique pour les écritures dans les registres matériels.

CONFIG_STRICT_DEVMEM y nopat

Pour utiliser /dev/mem pour visualiser et modifier la RAM régulière sur le noyau v4.9, il faut commencer :

  • désactiver CONFIG_STRICT_DEVMEM (définie par défaut sur Ubuntu 17.04)
  • faire passer le nopat Option de ligne de commande du noyau pour x86

Les ports IO fonctionnent toujours sans eux.

Voir aussi https://stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582

Vidange du cache

Si vous essayez d'écrire dans la RAM au lieu d'un registre, la mémoire peut être mise en cache par le CPU : https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region-of-address-space-in-linux et je ne vois pas de moyen très portable / facile de le vider ou de marquer la région comme non cachable :

Alors peut-être que /dev/mem ne peut pas être utilisé de manière fiable pour transmettre des tampons de mémoire à des dispositifs ?

Cela ne peut malheureusement pas être observé dans QEMU, car ce dernier ne simule pas les caches.

Comment le tester

Passons maintenant à la partie la plus amusante. Voici quelques exemples d'installations sympas :

  • Mémoire de la zone utilisateur
    • allouer volatile sur un processus userland
    • obtenir l'adresse physique avec /proc/<pid>/maps + /proc/<pid>/pagemap
    • l'adresse physique avec devmem2 et observez la réaction du processus userland :
  • Mémoire de Kernelland
    • allouer de la mémoire au noyau avec kmalloc
    • obtenir l'adresse physique avec virt_to_phys et de le renvoyer à l'utilisateur
    • modifier l'adresse physique avec devmem2
    • demander la valeur au module du noyau
  • Mémoire IO et plate-forme virtuelle QEMU
    • créer un dispositif de plate-forme avec des adresses de registre physique connues
    • utiliser devmem2 pour écrire dans le registre
    • regarder printf sortent de l'appareil virtuel en réponse

5voto

plugwash Points 5642

/dev/mem permettait traditionnellement d'accéder à l'ensemble de l'espace d'adressage physique. Cela inclut la mémoire vive, mais aussi tous les périphériques d'E/S mappés en mémoire.

De nombreux noyaux modernes sont configurés avec "CONFIG_STRICT_DEVMEM" qui restreint /dev/mem aux seuls périphériques d'E/S mappés en mémoire.

L'écriture de déchets aléatoires est une mauvaise idée, mais il est difficile de prédire exactement ce qui va se passer. Le matériel peut réagir de manière imprévisible à des déchets aléatoires, des structures de mémoire du noyau corrompues peuvent entraîner un comportement imprévisible du noyau. Au mieux, je m'attendrais à un plantage du système, au pire à une corruption des données ou même à une panne du matériel, ce qui n'est pas exclu.

P.S. Notez que votre commande, lorsqu'elle est exécutée par un utilisateur normal, ne devrait rien faire, car le sudo n'active que la commande cat, pas la redirection.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X