¿Qué significa cuando el código se ejecuta en modo kernel o usuario?
Modo kernel
Un programa que se ejecuta en este modo tiene acceso completo al hardware subyacente. Puede ejecutar cualquier instrucción de CPU, acceder a cualquier dirección de memoria y esencialmente hacer lo que quiera.
El código de modo de usuario que se ejecuta en este modo está restringido a la modificación del hardware a través de la API del sistema operativo. No puede acceder al hardware directamente en absoluto .
Lo interesante aquí es que en las arquitecturas comunes, esto se aplica a través del hardware, no solo del sistema operativo. En particular, la arquitectura x86 tiene anillos de protección .
La gran ventaja de este tipo de separación es que cuando un programa falla al ejecutarse en modo de usuario, no siempre es fatal. De hecho, en los sistemas modernos, generalmente no lo es.
Mira el artículo de Jeff . Es su buena cosa habitual.
La respuesta corta es: simplemente le dice dónde pasan los programas su tiempo.
Para una respuesta más larga, explicaré esto en dos pasos. Primero:
1. Entrar en modo kernel
Cada código regular que escribe, se ejecuta en "modo de usuario".
Los programas pueden usar bibliotecas para hacer tareas comunes para ellos. Este también es el código de modo de usuario.
En algún momento, el programa puede requerir una función central del sistema. Por ejemplo:
Esta funcionalidad esencial, cercana al hardware, es parte del núcleo. Ese es el programa central detrás de todo en su computadora. Gestiona todo lo que los programas necesitan para funcionar.
Para usar una función en el núcleo, la ruta de ejecución del programa literalmente salta del modo Usuario al código del núcleo. El kernel hace su trabajo y pliega la ruta de ejecución al modo de usuario.
Cuando un programa pasa mucho tiempo en modo kernel, a menudo significa que está haciendo mucha actividad relacionada con el hardware. Por ejemplo, el disco busca o la transmisión de video. El hardware también podría estar funcionando mal; ralentizando el procesamiento y haciendo que el programa pase una cantidad inusual de tiempo en el espacio del kernel.
2 la diferencia
El código en el espacio del kernel es de alto rendimiento. Las otras partes del núcleo pueden llamarlo directamente, y el código tiene acceso directo a todos los recursos del sistema, sin ninguna verificación de límites. El cambio entre el modo kernel / user también es una operación costosa, que se evita por completo al ejecutar todo en el código kernel.
Sin embargo, dentro del núcleo, no hay mucho espacio para la verificación de seguridad, la protección contra fallas o la escritura en las partes incorrectas de la memoria. Estos son servicios que el núcleo puede proporcionar a otros programas. Engaña a los programas para que crean que el mundo se ve diferente (los programas viven en un entorno virtual, de espacio aislado / restringido) y, por lo tanto, todo lo que entra / sale de los programas se puede traducir y proteger.
El núcleo en sí mismo no puede tener mucha protección porque no hay nada detrás para protegerlo. Es el corazón del sistema, y cuando eso se detiene, todo termina. Tienes un kernel panic, o en Windows, el famoso BSOD.
Ese también es el riesgo del código basado en el núcleo, y la razón por la que más subsistemas con requisitos de bajo rendimiento se están trasladando al espacio de usuario. Sin embargo, las partes esenciales relacionadas con el hardware suelen ser el código del kernel que no cambiará en el corto plazo.
Es la distinción de si el código que se está ejecutando actualmente puede interactuar directamente con varias piezas de hardware. El código del modo kernel puede escribir en los buses del dispositivo, cambiar las asignaciones de memoria, cambiar los procesos en ejecución, etc. El modo de usuario puede hacer cálculos y puede hacer llamadas al sistema en el núcleo para interactuar con el resto del mundo.