it-swarm.com.de

Was ist / dev / mem?

Vermutlich hängt es irgendwie mit dem Gedächtnis zusammen? Was würde

Sudo cat /dev/urandom > /dev/mem

tun? Alles RAM in den Papierkorb werfen? Alle Nicht-Kernel-virtuellen Speicher? Nichts des oben Genannten?

38
Paul

Es bietet Zugriff auf den physischen Speicher des Systems.

In der Manpage mem(4) erfahren Sie mehr darüber, was /dev/mem ist.

Ja - es könnte alle möglichen Probleme verursachen. Ein Neustart sollte Abhilfe schaffen, aber schlimme Dinge können sehr leicht passieren. Achtung! :-)

31
Andrew Flanagan

/ dev/mem ermöglicht den Zugriff auf den physischen Speicher des Systems, nicht auf den virtuellen Speicher. Auf den virtuellen Adressraum des Kernels kann mit/dev/kmem zugegriffen werden.

Es wird in erster Linie verwendet, um auf IO Speicheradressen zuzugreifen, die sich auf Peripheriegeräte wie Videoadapter beziehen.

17
rags

Sudo cat /dev/urandom > /dev/mem macht nichts, da Sudo das Privileg von cat, aber nicht von redirect erhöht. Sie können entweder Sudo su ausführen und dann in der Root-Shell arbeiten oder verwenden
Sudo dd if=/dev/urandom of=/dev/mem

/dev/mem bietet Zugriff auf den physischen Speicher, dh auf den gesamten RAM im System. Dies bedeutet jedoch nicht, dass Sie vollständigen Lese-/Schreibzugriff auf RAM erhalten (siehe CONFIG_STRICT_DEVMEM-Option in dieses Dokument). Beachten Sie auch, dass in einigen Regionen des physischen Speichers andere Geräte wie Grafikkartenspeicher usw. zugeordnet sind.

Blindes Schreiben in /dev/mem führt zu einem unsicheren Verhalten, hier ist ein YouTube-Video, das dasselbe tut.

8
Sahil Singh

/ dev/mem bot traditionell Zugriff auf den gesamten physischen Adressraum. Das schließt RAM ein, aber es schließt auch alle Speicher zugeordneten IO Geräte ein.

Viele moderne Kernel werden mit "CONFIG_STRICT_DEVMEM" konfiguriert, wodurch/dev/mem auf den Speicher beschränkt wird, der nur IO Geräten zugeordnet ist.

Zufälliges Schreiben von Müll ist eine schlechte Idee, aber es ist schwer vorherzusagen, was genau passieren wird. Hardware reagiert möglicherweise auf unvorhersehbare Weise auf zufälligen Müll. Beschädigte Kernel-Speicherstrukturen können zu unvorhersehbarem Kernel-Verhalten führen. Bestenfalls würde ich einen Systemabsturz erwarten, im schlimmsten Fall kommen Datenverfälschungen oder gar Hardware-Bricking nicht in Frage.

P.S. Beachten Sie, dass Ihr Befehl, wenn er als normaler Benutzer ausgeführt wird, nichts tun sollte, da das Sudo nur den Befehl cat und nicht die Umleitung aufhebt.

5
plugwash

Teste es mit busybox devmem

busybox devmem ist ein winziges CLI-Dienstprogramm, das /dev/mem mmappt.

Du bekommst es in Ubuntu mit: Sudo apt-get install busybox

Verwendung: 4 Bytes von der physischen Adresse lesen 0x12345678:

Sudo busybox devmem 0x12345678

Schreibe 0x9abcdef0 an diese Adresse:

Sudo busybox devmem 0x12345678 w 0x9abcdef0

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

MAP_SHARED

Wenn Sie /dev/mem mappen, möchten Sie wahrscheinlich Folgendes verwenden:

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

Durch MAP_SHARED werden Schreibvorgänge sofort in den physischen Speicher verschoben, was die Beobachtung erleichtert und das Schreiben von Hardware-Registern sinnvoller macht.

CONFIG_STRICT_DEVMEM UND nopat

Um /dev/mem zum Anzeigen und Ändern von normalem RAM in Kernel v4.9 zu verwenden, müssen Sie Folgendes ausführen:

  • deaktiviere CONFIG_STRICT_DEVMEM (standardmäßig eingestellt auf Ubuntu 17.04)
  • übergeben Sie die Kernel-Befehlszeilenoption nopat für x86

IO-Ports funktionieren auch ohne diese.

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

Cache leeren

Wenn Sie versuchen, in RAM anstelle eines Registers zu schreiben, wird der Speicher möglicherweise von der CPU zwischengespeichert: https://stackoverflow.com/questions/22701352/how- to-flush-the-cpu-cache-for-a-region-of-address-space-in-linux und ich sehe keine sehr portable/einfache Möglichkeit, es zu leeren oder Markieren Sie die Region als nicht zwischenspeicherbar:

Vielleicht kann /dev/mem nicht zuverlässig verwendet werden, um Speicherpuffer an Geräte zu übergeben?

Dies kann in QEMU leider nicht beobachtet werden, da QEMU keine Caches simuliert.

Wie man es ausprobiert

Nun zum spaßigen Teil. Hier sind ein paar coole Setups:

  • Userland-Speicher
    • ordnen Sie volatile variable einem Userland-Prozess zu
    • erhalte die physikalische Adresse mit /proc/<pid>/maps + /proc/<pid>/pagemap
    • geben Sie die physikalische Adresse mit devmem2 ein und beobachten Sie, wie der Userland-Prozess reagiert:
  • Kernelland-Speicher
    • zuweisen von Kernelspeicher mit kmalloc
    • holen Sie sich die physikalische Adresse mit virt_to_phys und geben Sie sie an userland zurück
    • ändere die physikalische Adresse mit devmem2
    • fragen Sie den Wert vom Kernel-Modul ab
  • Gerät für E/A-Mem und virtuelle QEMU-Plattform
    • erstellen Sie ein Plattformgerät mit bekannten physischen Registeradressen
    • verwenden Sie devmem2, um in das Register zu schreiben
    • beobachten Sie, wie printfs als Antwort aus dem virtuellen Gerät ausgegeben werden