linux-kernel - life - linux kernel version
¿Cómo pasar del modo usuario al modo kernel? (3)
Estoy aprendiendo sobre Linux kernel, pero no entiendo cómo cambiar de modo de usuario a modo kernel en Linux. ¿como funciona? ¿podría darme algún consejo o darme algún enlace para referirse a él o algún libro sobre esto? ¡muchas gracias!
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 da una lectura relacionada interesante.
http://www.codinghorror.com/blog/2008/01/understanding-user-and-kernel-mode.html
Aquí hay un breve extracto:
Modo kernel
En modo Kernel, el código de ejecución tiene acceso completo e irrestricto al hardware subyacente. Puede ejecutar cualquier instrucción de 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 núcleo son catastróficos; detendrán toda la PC.
Modo de usuario
En modo Usuario, el código de ejecución no tiene capacidad para acceder directamente al hardware o a la memoria de referencia. El código que se ejecuta en modo de usuario debe delegar en 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.
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 llamada del sistema con los parámetros adecuados, 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 de 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 manejador 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 núcleo en nombre del proceso del usuario.
Para pasar del modo de usuario al modo kernel, debe realizar una llamada al sistema.
Si solo quiere ver qué sucede bajo el capó, vaya a TLDP, es su nuevo amigo y vea el código (está bien documentado, sin necesidad de 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 una envoltura alrededor del código del ensamblado, que realiza una interrupción (0x80) y como resultado se llamará a un controlador para esta llamada al sistema.
Vamos a engañar un poco y usar un preprocesador C aquí para construir un archivo ejecutable (foo.S es un archivo donde pone un código del siguiente enlace):
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)