linux - tag - ¿Cómo acceder al espacio del kernel desde el espacio del usuario?
musicbrainz picard debian (2)
¿Cómo se diferencia 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 si entendí tu pregunta.
Para el núcleo no hay mucha diferencia técnica, es solo memoria. ¿Por qué? Debido a que el kernel, que se ejecuta en el modo de CPU más privilegiado, puede acceder a toda la memoria.
¿Cuáles son las diferentes maneras 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 dispositivos en modo kernel, no puede hacer eso, al menos no directamente. Sin embargo, el kernel (o uno de sus controladores) puede copiar datos de la memoria de la aplicación de modo de usuario a la memoria del kernel.
... ¿hay alguna manera de que podamos acceder a una dirección física que esté presente en el espacio del kernel y realizar operaciones en él?
De la misma manera, no debería poder acceder a la memoria utilizando direcciones físicas si hay una conversión de dirección virtual a física presente. Incluso el núcleo mismo no puede evitar esta traducción una vez que está habilitada. Tiene que crear asignaciones de direcciones físicas a virtuales apropiadas en las tablas de la página para acceder a la memoria en direcciones físicas arbitrarias.
Aparte de las llamadas al sistema, ¿hay otras formas de escribir en el espacio del kernel desde una aplicación de usuario?
También puede forzar a la CPU a cambiar al código del núcleo activando una excepción (por ejemplo, división por 0, error de página, error de protección general, etc.). El kernel es el primero en manejar excepciones. El kernel cambiará su memoria según sea necesario en respuesta a una excepción. Puede cargar datos de algún lugar (por ejemplo, un disco) en un error de página.
¿Cómo se diferencia 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)?
¿Cuáles son las diferentes maneras en que puedo escribir en el espacio de direcciones del kernel desde el espacio del usuario?
Una forma que conozco es a través de una llamada al sistema . Podemos usar varias llamadas al sistema, pero al final son todas las llamadas al sistema. Incluso en las llamadas al sistema, enviamos datos al espacio del kernel, donde (controlador o módulo respectivo) llama a funciones como copy_from_user () para copiar los datos del espacio del usuario al espacio del kernel. Aquí exactamente no estamos escribiendo en el espacio de direcciones. solo estamos pasando un puntero de usuario que contiene los datos que deben copiarse en los buffers del kernel.
Mi pregunta es ¿hay alguna forma en que podamos acceder a una dirección física que esté presente en el espacio del kernel y realizar operaciones en ella?
En segundo lugar, aparte de las llamadas al sistema, ¿hay otras formas de escribir en el espacio del kernel desde una aplicación de usuario?
Me referí a este link desde stackoverflow. Pero creo que mi pregunta no está respondida allí y es desde una perspectiva diferente. Por lo tanto, pensé en hacer una pregunta diferente.
Por favor comparte tu conocimiento ... Gracias.
¿Cuáles son las diferentes maneras 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 puede acceder a la memoria física utilizando /dev/mem
y system call 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 bytes en mem se interpretan como direcciones de memoria física.
más en /dev/mem
: http://linux.about.com/library/cmd/blcmdl4_mem.htm
más en mmap()
: http://linux.die.net/man/2/mmap
Puede usar mmap()
para asignar una sección de /dev/mem
y usar 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á asignando no se usa, por ejemplo, por el kernel, o se bloqueará / bloqueará su sistema, y se verá obligado a reiniciar con el botón de encendido del hardware.
Espero eso ayude.