GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo acceder (si es posible) al espacio del kernel desde el espacio del usuario?

¿Cuáles son las diferentes formas en que puedo escribir en el espacio de direcciones del kernel desde el espacio del usuario?

No estoy seguro de si hay otros métodos, pero puedes acceder a la memoria física usando /dev/mem &llamada al sistema mmap() .

/dev/mem es un archivo de dispositivo de caracteres que es una imagen de la memoria principal de la computadora. Puede usarse, por ejemplo, para examinar (e incluso parchear) el sistema. Las direcciones de byte en mem se interpretan como direcciones de memoria física.

más sobre /dev/mem :http://linux.about.com/library/cmd/blcmdl4_mem.htm

más sobre mmap() :http://linux.die.net/man/2/mmap

Puedes usar el mmap() para mapear una sección de /dev/mem y utilizar en su programa de usuario. Un breve código de ejemplo:

#define MAPPED_SIZE //place the size here
#define DDR_RAM_PHYS  //place the physical address here

int _fdmem;
int *map = NULL;
const char memDevice[] = "/dev/mem";

/* open /dev/mem and error checking */
_fdmem = open( memDevice, O_RDWR | O_SYNC );

if (_fdmem < 0){
printf("Failed to open the /dev/mem !\n");
return 0;
}
else{
printf("open /dev/mem successfully !\n");
}

/* mmap() the opened /dev/mem */
map= (int *)(mmap(0,MAPPED_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,_fdmem,DDR_RAM_PHYS));

/* use 'map' pointer to access the mapped area! */
for (i=0,i<100;i++)
printf("content: 0x%x\n",*(map+i));

/* unmap the area & error checking */
if (munmap(map,MAPPED_SIZE)==-1){
perror("Error un-mmapping the file");
}

/* close the character device */
close(_fdmem);

Sin embargo, asegúrese de que el área que está mapeando no sea utilizada, por ejemplo, por el núcleo, o hará que su sistema se bloquee o se cuelgue, y se verá obligado a reiniciar usando el botón de encendido del hardware.

Espero que ayude.


¿Cómo se diferencian exactamente la memoria del usuario y la memoria del kernel dentro del kernel de Linux (en términos de dar seguridad al espacio del kernel)?

No estoy seguro de haber entendido tu pregunta.

Para el núcleo no hay mucha diferencia técnicamente, es solo memoria. ¿Por qué? Porque el núcleo, que se ejecuta en el modo de CPU más privilegiado, puede acceder a toda la memoria.

¿Cuáles son las diferentes formas en que puedo escribir en el espacio de direcciones del kernel desde el espacio del usuario?

A menos que haya un agujero de seguridad en el kernel o en los controladores de dispositivo en modo kernel, no puede hacer eso, al menos no directamente. Sin embargo, el núcleo (o uno de sus controladores) puede copiar datos de la memoria de la aplicación en modo usuario a la memoria del núcleo.

... ¿hay alguna forma de que podamos acceder a una dirección física que está presente en el espacio del kernel y realizar operaciones en ella?

Lo mismo, no debería poder acceder a la memoria usando direcciones físicas si hay una traducción de dirección virtual a física presente. Incluso el núcleo mismo no puede evitar esta traducción una vez que está habilitado. Tiene que crear asignaciones de direcciones virtuales a físicas apropiadas en las tablas de páginas para acceder a la memoria en direcciones físicas arbitrarias.

Además de las llamadas al sistema, ¿existen otras formas de escribir en el espacio del núcleo desde una aplicación de usuario?

También puede obligar a la CPU a cambiar al código del kernel activando una excepción (por ejemplo, división por 0, error de página, error de protección general, etc.). El núcleo es el primero en manejar excepciones. El núcleo cambiará su memoria según sea necesario en respuesta a una excepción. Puede cargar datos desde algún lugar (por ejemplo, el disco) en un error de página.


Linux
  1. Linux:¿diferencia entre el espacio del usuario y el espacio del kernel?

  2. ¿Cómo crear un nuevo usuario con acceso Ssh?

  3. Cómo acceder a phpMyAdmin desde cPanel

  4. ¿Cómo asignar un búfer del kernel de Linux al espacio del usuario?

  5. ¿Cómo acceder a direcciones físicas desde el espacio de usuario en Linux?

Cómo compilar el kernel de Linux desde cero {Guía paso a paso}

Cómo agregar o eliminar un usuario de un grupo en Linux

Cómo acceder a las particiones de Linux desde Windows 10

Cómo construir el kernel de Linux desde cero

¿Cómo eliminar Swap Space de Centos 7.x?

¿Cómo puedo reservar un bloque de memoria del kernel de Linux?