Qu'est-ce que / dev / mem?

40

Vraisemblablement, c'est en quelque sorte lié à la mémoire? Quel serait

sudo cat /dev/urandom > /dev/mem

faire? Corbeille toute la RAM? Toute la mémoire virtuelle non-noyau? Aucune de ces réponses?

Cfinley
la source
2
Voir aussi:dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
user3490
6
La protection de la mémoire ne devrait-elle pas arrêter l'accès à la RAM physique pour tous les processus, à l'exception de celui affecté à cette zone de RAM? Ou sudo annule-t-il cette protection?
Matthew Lock

Réponses:

32

Il donne accès à la mémoire physique du système.

La mem(4)page de manuel explique plus en détail ce qui /dev/memest.

Oui, cela pourrait causer toutes sortes de problèmes. Un redémarrage devrait vous réparer, mais de mauvaises choses peuvent arriver très facilement. Faites attention! :-)

Andrew Flanagan
la source
4
Je suggère de consulter la page de manuel mem. Rags est correct. "mem est un fichier de périphérique de caractères qui est une image de la mémoire principale de l'ordinateur. Il peut être utilisé, par exemple, pour examiner (et même corriger) le système. Les adresses d'octet dans mem sont interprétées comme des adresses de mémoire physique." Et ... "Le fichier kmem est identique à mem, sauf que la mémoire virtuelle du noyau, plutôt que la mémoire physique, est utilisée."
M. Shickadance
@ Andrew Flanagan: Votre lien montre maintenant comment on peut configurer un chronomètre en utilisant la commande time.
Aiyion.Prime
1
@ Aiyion.Prime. Merci - a indiqué une version de archive.org.
Andrew Flanagan
19

/ dev / mem fournit un accès à la mémoire physique du système , pas à la mémoire virtuelle. Vous pouvez accéder à l'espace d'adressage virtuel des noyaux à l'aide de / dev / kmem.

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

des chiffons
la source
9

sudo cat /dev/urandom > /dev/memne fera rien, puisque sudo augmentera le privilège de chat mais pas celui de la redirection. Vous pouvez soit faire sudo suet ensuite travailler dans le shell root, ou utiliser
sudo dd if=/dev/urandom of=/dev/mem

/dev/memfournit un accès à la mémoire physique, c’est-à-dire à toute la mémoire vive du système. Toutefois, 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 de ce document). Notez également que dans certaines régions de la mémoire physique, d'autres périphériques, tels que la mémoire vidéo, etc., sont mappés dessus.

Si vous écrivez aveuglément pour /dev/memobtenir un comportement incertain, voici une vidéo sur youtube qui fait de même.

Sahil Singh
la source
7

Testez-le avec busybox devmem

busybox devmemest un petit utilitaire CLI que mmaps /dev/mem.

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

Utilisation: lisez 4 octets à partir de l'adresse physique 0x12345678:

sudo busybox devmem 0x12345678

Ecrire 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

Lors du mappage /dev/mem, vous voudrez probablement utiliser:

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

MAP_SHARED rend les écritures immédiatement dans la mémoire physique, ce qui facilite l'observation et est plus logique pour les écritures de registre matériel.

CONFIG_STRICT_DEVMEM et nopat

Pour /dev/memvisualiser et modifier la RAM normale sur le noyau v4.9, vous devez commencer par:

  • désactiver CONFIG_STRICT_DEVMEM(défini par défaut sur Ubuntu 17.04)
  • passer l' nopatoption de ligne de commande du noyau pour x86

Les ports IO fonctionnent toujours sans ceux-ci.

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

Cache vidant

Si vous essayez d'écrire dans la RAM au lieu d'un registre, la mémoire peut être mise en cache par la 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 un moyen très portable / facile de le vider ou de marquer la région comme non cachable:

Alors peut-être /dev/memne peut- il pas être utilisé de manière fiable pour transmettre des mémoires tampons aux périphériques?

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

Comment le tester

Maintenant pour la partie amusante. Voici quelques configurations intéressantes:

  • Mémoire du pays
    • allouer une volatilevariable sur un processus utilisateur
    • obtenir l'adresse physique avec /proc/<pid>/maps+/proc/<pid>/pagemap
    • l'adresse physique avec devmem2et observez le processus utilisateur:
  • Kernelland mémoire
    • allouer de la mémoire du noyau avec kmalloc
    • récupère l'adresse physique virt_to_physet la renvoie à l'utilisateur
    • modifier l'adresse physique avec devmem2
    • interroger la valeur du module de noyau
  • IO mem et dispositif de plate-forme virtuelle QEMU
    • créer une plate-forme avec des adresses de registre physiques connues
    • utiliser devmem2pour écrire au registre
    • regarder printfs sortir de l'appareil virtuel en réponse
Ciro Santilli 改造 中心 六四 事件
la source
5

/ dev / mem fournissait traditionnellement l'accès à l'intégralité de l'espace d'adressage physique. Cela inclut la RAM, mais également tous les périphériques IO mappés en mémoire.

De nombreux noyaux modernes seront configurés avec "CONFIG_STRICT_DEVMEM" qui restreint / dev / mem aux périphériques IO mappés en mémoire.

Écrire des ordures au hasard est une mauvaise idée, mais il est difficile de prédire ce qui va arriver de mal. Le matériel peut réagir de manière imprévisible à des erreurs aléatoires. Les structures de mémoire endommagées du noyau peuvent entraîner un comportement imprévisible du noyau. Au mieux, je m'attendrais à un crash du système, au pire à une corruption des données ou même à des dégâts matériels.

PS remarque que votre commande, lorsqu'elle est exécutée en tant qu'utilisateur normal, ne doit rien faire, car sudo n'élimine que la commande cat, pas la redirection.

plugwash
la source