Saltar al contenido

¿Cómo cambiar del modo usuario al modo kernel?

Tenemos la contestación a este conflicto, o por lo menos eso creemos. Si sigues con interrogantes puedes escribirlo en el apartado de preguntas, que con gusto te ayudaremos

Solución:

La única forma en que una aplicación de espacio de usuario puede iniciar explícitamente un cambio al modo kernel durante el funcionamiento normal es haciendo una llamada al sistema como abrir, leer, escribir, etc.

Cada vez que una aplicación de usuario llama a estas API de llamadas del sistema con los parámetros apropiados, se activa una interrupción/excepción de software (SWI).

Como resultado de este SWI, el control de la ejecución del código salta desde la aplicación del usuario a una ubicación predefinida en la tabla de vectores de interrupción. [IVT] proporcionada por el sistema operativo.

Este IVT contiene una dirección para la rutina del controlador de excepciones SWI, que realiza todos los pasos necesarios para cambiar la aplicación del usuario al modo kernel y comenzar a ejecutar las instrucciones del kernel en nombre del proceso del usuario.

Para cambiar del modo de usuario al modo kernel, debe realizar una llamada al sistema.

Si solo desea ver qué sucede debajo del capó, vaya a TLDP es su nuevo amigo y vea el código (está bien documentado, no necesita conocimientos adicionales para comprender un código ensamblador).

Estas interesado en:

  movl    $len,%edx           # third argument: message length
  movl    $msg,%ecx           # second argument: pointer to message to write
  movl    $1,%ebx             # first argument: file handle (stdout)
  movl    $4,%eax             # system call number (sys_write)
  int     $0x80               # call kernel

Como puede ver, una llamada al sistema es solo un contenedor alrededor del código ensamblador, que realiza una interrupción (0x80) y, como resultado, se llamará a un controlador para esta llamada al sistema.

Hagamos un poco de trampa y usemos un preprocesador C aquí para construir un ejecutable (foo.S es un archivo donde colocas un código del enlace a continuación):

gcc -o foo -nostdlib foo.S

Ejecútelo a través de strace para asegurarse de que obtendremos lo que escribimos:

$ strace -t ./foo 
09:38:28 execve("./foo", ["./foo"], 0x7ffeb5b771d8 /* 57 vars */) = 0
09:38:28 stat(NULL, Hello, world!
 NULL)               = 14
09:38:28 write(0, NULL, 14)      

Acabo de leer esto, y es un recurso bastante bueno. Explica el modo de usuario y el modo kernel, por qué ocurren los cambios, qué tan caros son y ofrece algunas lecturas relacionadas interesantes.

http://www.codinghorror.com/blog/2008/01/understanding-user-and-kernel-mode.html

He aquí un breve extracto:

Modo de núcleo

En el modo Kernel, el código de ejecución tiene acceso completo y sin restricciones al hardware subyacente. Puede ejecutar cualquier instrucción de la CPU y hacer referencia a cualquier dirección de memoria. El modo kernel generalmente se reserva para las funciones más confiables y de nivel más bajo del sistema operativo. Los bloqueos en modo kernel son catastróficos; detendrán toda la PC.

Modo de usuario

En el modo Usuario, el código de ejecución no tiene la capacidad de acceder directamente al hardware o a la memoria de referencia. El código que se ejecuta en modo de usuario debe delegar a las API del sistema para acceder al hardware o la memoria. Debido a la protección que brinda este tipo de aislamiento, los bloqueos en el modo de usuario siempre son recuperables. La mayor parte del código que se ejecuta en su computadora se ejecutará en modo de usuario.

Eres capaz de añadir valor a nuestro contenido dando tu veteranía en las reseñas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *