¿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.
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.
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.
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
/ 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.
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
Respuestas:
Proporciona acceso a la memoria física del sistema.
La
mem(4)
página del manual explica más sobre lo que/dev/mem
es.Sí, podría causar todo tipo de problemas. Un reinicio debería solucionarlo, pero las cosas malas pueden suceder muy fácilmente. ¡Ten cuidado! :-)
fuente
/ 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.
fuente
sudo cat /dev/urandom > /dev/mem
no hará nada, ya que sudo elevará el privilegio de cat pero no de la redirección. Puede hacersudo su
y luego trabajar en el shell raíz, o usarsudo dd if=/dev/urandom of=/dev/mem
/dev/mem
proporciona 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/mem
dará como resultado un comportamiento incierto, aquí hay un video de YouTube que hace lo mismo.fuente
Pruébalo con
busybox devmem
busybox devmem
es 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
:Escribe
0x9abcdef0
a esa dirección: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: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
ynopat
Para usar
/dev/mem
para ver y modificar RAM normal en el kernel v4.9, debe puño:CONFIG_STRICT_DEVMEM
(configurado de forma predeterminada en Ubuntu 17.04)nopat
opción de línea de comando del kernel para x86Los 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/mem
no 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:
volatile
variable en un proceso de usuario/proc/<pid>/maps
+/proc/<pid>/pagemap
devmem2
, y ver el proceso de tierra de usuario reaccionar:kmalloc
virt_to_phys
y devolverla a userlanddevmem2
devmem2
para escribir en el registroprintf
salen del dispositivo virtual en respuestafuente
/ 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.
fuente