Hay un bit en un registro que indica si la CPU está actualmente en modo kernel o en modo de usuario. El código del programa no puede modificar este bit directamente: tiene que usar instrucciones especiales que hacen más que solo cambiar este bit. Ciertas instrucciones solo pueden usarse en modo kernel; intentar usarlos en el modo de usuario en lugar de eso activa una trampa .
Mientras el procesador se ejecuta en modo kernel, puede cambiar al modo de usuario en cualquier momento. Pero mientras el procesador se ejecuta en modo usuario, solo hay algunas formas de cambiar al modo kernel: con la llamada al sistema instrucción, debido a una interrupción, oa través de una trampa. En todos los casos, el procesador no solo cambia al modo kernel, sino que también salta a una dirección en la memoria que solo puede configurarse mediante el código del kernel. Esto asegura que el código de modo de usuario no pueda ejecutar lo que quiera en modo kernel. El modo de usuario solo puede llamar a unos pocos puntos de entrada específicos en el código del kernel, y el código del kernel en estos puntos de entrada puede configurar su entorno de procesamiento con cuidado y validar sus entradas.
Todo esto sería inútil si el código de usuario pudiera modificar el contenido de la memoria que contiene el código o los datos del núcleo. No puede debido a la unidad de gestión de memoria (MMU) . Una de las funciones de la MMU es limitar a qué memoria se puede acceder en un momento dado. La memoria se puede marcar como accesible solo para el kernel, y el cambio entre el modo kernel y el modo de usuario puede cambiar la tabla de permisos de acceso. La configuración de la MMU solo se puede modificar mientras se ejecuta en modo kernel. De esta manera, el núcleo puede configurar la memoria para que pueda acceder a su propio código y datos, pero el código de usuario no puede.
El núcleo realmente mantiene una configuración de MMU por proceso de usuario. Antes de cambiar al modo de usuario, el kernel modifica la configuración de la MMU para que se corresponda con la del proceso que se ejecutará después de cambiar al modo de usuario.
Casi cualquier procesador suficientemente avanzado sigue este modelo básico: no solo cualquier PC fabricada en los últimos 30 años, sino también cualquier teléfono inteligente e incluso muchos dispositivos integrados.
He simplificado muchas cosas. En el mundo real, puede haber más de dos niveles de privilegio, más modos de procesador, más aspectos de la configuración de MMU, etc. Tiene la idea de cómo funciona. Si desea comprender el código del kernel o escribir el suyo, deberá leer más detalladamente sobre una arquitectura de procesador específica.
El "modo real" es un aspecto histórico de los procesadores x86. No ha sido relevante en el mundo real durante las últimas dos décadas, excepto en algunos sistemas x86 integrados raros y para algunas personas que escriben cargadores de arranque o ejecutan algún software heredado muy antiguo.