¿Qué es / dev / mem?


40

Presumiblemente, ¿está relacionado de alguna manera con la memoria? Que seria

sudo cat /dev/urandom > /dev/mem

¿hacer? ¿Basura todo RAM? ¿Toda la memoria virtual no kernel? ¿Ninguna de las anteriores?


2
Véase también:dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
user3490

66
¿No debería la protección de la memoria detener el acceso a la RAM física para todos los procesos, excepto el que se ha asignado a esa área de RAM? ¿O sudo anula esa protección?
Matthew Lock

Respuestas:


32

Proporciona acceso a la memoria física del sistema.

La mem(4)página del manual explica más sobre lo que /dev/memes.

Sí, podría causar todo tipo de problemas. Un reinicio debería solucionarlo, pero las cosas malas pueden suceder muy fácilmente. ¡Ten cuidado! :-)


44
Sugeriría revisar la página de manual de mem. Trapos es correcto. "mem es un archivo de dispositivo de caracteres que es una imagen de la memoria principal de la computadora. Se puede usar, por ejemplo, para examinar (e incluso parchear) el sistema. Las direcciones de bytes en mem se interpretan como direcciones de memoria física". Y ... "El archivo kmem es el mismo que mem, excepto que se accede a la memoria virtual del núcleo en lugar de a la memoria física".
Sr. Shickadance

@Andrew Flanagan: su enlace ahora muestra cómo se puede configurar un cronómetro usando el comando de tiempo.
Aiyion.Prime

1
@ Aiyion.Prime. Gracias - señaló una versión de archive.org.
Andrew Flanagan

19

/ dev / mem proporciona acceso a la memoria física del sistema , no a la memoria virtual. Se puede acceder al espacio de direcciones virtuales de los núcleos usando / dev / kmem.

Se utiliza principalmente para acceder a direcciones de memoria IO relacionadas con hardware periférico, como adaptadores de video.


9

sudo cat /dev/urandom > /dev/memno hará nada, ya que sudo elevará el privilegio de cat pero no de la redirección. Puede hacer sudo suy luego trabajar en el shell raíz, o usar
sudo dd if=/dev/urandom of=/dev/mem

/dev/memproporciona acceso a la memoria física, es decir, a toda la RAM del sistema, sin embargo, esto no significa que le brinde acceso completo de lectura / escritura a la RAM (consulte la opción CONFIG_STRICT_DEVMEM en este documento). También tenga en cuenta que algunas regiones de la memoria física tendrán otros dispositivos, como la memoria de la tarjeta de video, etc.

Escribir a ciegas /dev/memdará como resultado un comportamiento incierto, aquí hay un video de YouTube que hace lo mismo.


7

Pruébalo con busybox devmem

busybox devmemes una pequeña utilidad CLI que hace mapas /dev/mem.

Puedes obtenerlo en Ubuntu con: sudo apt-get install busybox

Uso: leer 4 bytes de la dirección física 0x12345678:

sudo busybox devmem 0x12345678

Escribe 0x9abcdef0a esa dirección:

sudo busybox devmem 0x12345678 w 0x9abcdef0

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

MAP_SHARED

Cuando mmapping /dev/mem, es probable que desee usar:

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

MAP_SHARED hace que las escrituras vayan a la memoria física inmediatamente, lo que facilita su observación y tiene más sentido para las escrituras de registro de hardware.

CONFIG_STRICT_DEVMEM y nopat

Para usar /dev/mempara ver y modificar RAM normal en el kernel v4.9, debe puño:

  • deshabilitar CONFIG_STRICT_DEVMEM(configurado de forma predeterminada en Ubuntu 17.04)
  • pasar la nopatopción de línea de comando del kernel para x86

Los puertos IO todavía funcionan sin esos.

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

Lavado de caché

Si intenta escribir en la RAM en lugar de un registro, la CPU puede almacenar en caché la memoria: https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-address-space-in-linux y no veo una forma muy portátil / fácil de vaciarlo o marcar la región como no almacenable en caché:

Entonces, ¿tal vez /dev/memno se pueda usar de manera confiable para pasar memorias intermedias a dispositivos?

Desafortunadamente, esto no se puede observar en QEMU, ya que QEMU no simula cachés.

Cómo probarlo

Ahora viene la parte divertida. Aquí hay algunas configuraciones geniales:

  • Memoria de usuario
    • asignar volatilevariable en un proceso de usuario
    • obtener la dirección física con /proc/<pid>/maps+/proc/<pid>/pagemap
    • la dirección física con devmem2, y ver el proceso de tierra de usuario reaccionar:
  • Memoria Kernelland
    • asignar memoria del núcleo con kmalloc
    • obtener la dirección física virt_to_physy devolverla a userland
    • modificar la dirección física con devmem2
    • consultar el valor del módulo del núcleo
  • Dispositivo de plataforma virtual IO mem y QEMU
    • crear un dispositivo de plataforma con direcciones de registro físico conocidas
    • usar devmem2para escribir en el registro
    • los relojes printfsalen del dispositivo virtual en respuesta

5

/ dev / mem tradicionalmente proporcionaba acceso a todo el espacio de direcciones físicas. Eso incluye ram pero también incluye cualquier dispositivo de E / S mapeado en memoria.

Muchos núcleos modernos se configurarán con "CONFIG_STRICT_DEVMEM", que restringe / dev / mem solo a dispositivos IO asignados a memoria.

Escribir basura al azar es una mala idea, pero es difícil predecir exactamente qué mal sucederá. El hardware puede responder de manera impredecible a la basura aleatoria, las estructuras de memoria del núcleo dañadas pueden causar un comportamiento impredecible del núcleo. En el mejor de los casos, esperaría un bloqueo del sistema, en el peor de los casos, la corrupción de datos o incluso el bloqueo de hardware no están fuera de discusión.

PD: tenga en cuenta que su comando cuando se ejecuta como un usuario normal no debería hacer nada, porque el sudo solo aplica el comando cat, no la redirección.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.