Modo de usuario de Os
En Windows (y en la mayoría de los sistemas operativos modernos), existe una distinción entre el código que se ejecuta en “modo usuario”, y el código que se ejecuta en “modo kernel”. Este capítulo va a señalar algunas de las diferencias. En primer lugar, las CPUs de Intel tienen modos de operación llamados anillos que especifican el tipo de instrucciones y la memoria disponible para el código en ejecución. Hay cuatro anillos:
Cuando se inicia un programa (por ejemplo, un navegador web o un procesador de textos), se ejecuta en su propio proceso. Un proceso contiene su propio espacio de memoria “virtual” y recursos. Su memoria es “virtual” porque el proceso piensa que la memoria que está en la dirección 0x12345678 puede estar en realidad en la dirección 0x65f7a678 de la memoria física. Del mismo modo, dos procesos diferentes pueden tener datos diferentes almacenados en (para ellos) 0x00401000. Esto se implementa dividiendo la memoria en trozos llamados páginas; en los sistemas x86 una página tiene un tamaño de 4 kilobytes. Cada página puede tener su propio conjunto de atributos, como por ejemplo, sólo lectura/lectura-escritura. La CPU dispone de un mecanismo transparente para traducir las direcciones virtuales a direcciones físicas a través de una tabla de páginas que configura el sistema operativo.
Modo kernel de Cheat engine
La arquitectura de Windows NT, una línea de sistemas operativos producidos y vendidos por Microsoft, es un diseño en capas que consta de dos componentes principales, el modo de usuario y el modo de núcleo. Se trata de un sistema operativo multitarea reentrante y preventivo, que ha sido diseñado para trabajar con ordenadores basados en uniprocesadores y multiprocesadores simétricos (SMP). Para procesar las solicitudes de entrada/salida (E/S), utilizan la E/S dirigida por paquetes, que utiliza paquetes de solicitud de E/S (IRP) y E/S asíncrona. A partir de Windows XP, Microsoft comenzó a ofrecer versiones de 64 bits de Windows; antes de esto, sólo había versiones de 32 bits de estos sistemas operativos.
Los programas y subsistemas en modo usuario están limitados en cuanto a los recursos del sistema a los que tienen acceso, mientras que el modo kernel tiene acceso ilimitado a la memoria del sistema y a los dispositivos externos. El modo kernel de Windows NT tiene acceso total a los recursos de hardware y del sistema del ordenador. El kernel de Windows NT es un kernel híbrido; la arquitectura comprende un kernel simple, una capa de abstracción de hardware (HAL), controladores y una serie de servicios (denominados colectivamente Executive), que existen todos en modo kernel[1].
Espacio de direcciones del kernel
El uso de la CPU suele representarse como un simple porcentaje del tiempo de la CPU dedicado a tareas no inactivas. Pero esto es una simplificación. En cualquier sistema operativo moderno, la CPU pasa el tiempo en dos modos muy distintos:
Es posible habilitar la visualización del tiempo del Kernel en el Administrador de Tareas, como he hecho en la captura de pantalla anterior. La línea verde es el tiempo total de la CPU; la línea roja es el tiempo del Kernel. El espacio entre las dos es el tiempo del usuario.
Estos dos modos no son meras etiquetas, sino que son impuestos por el hardware de la CPU. Si el código que se ejecuta en el modo de usuario intenta hacer algo fuera de su ámbito -como, por ejemplo, acceder a una instrucción privilegiada de la CPU o modificar la memoria a la que no tiene acceso-, se lanza una excepción que puede ser trapeada. En lugar de que todo el sistema se bloquee, sólo esa aplicación en particular se bloquea. Ese es el valor del modo de usuario.
Si sólo usamos dos anillos de aislamiento, no está claro dónde deben ir los controladores de dispositivos, el código que nos permite usar nuestras tarjetas de vídeo, teclados, ratones, impresoras y demás. ¿Estos controladores se ejecutan en modo Kernel, para obtener el máximo rendimiento, o se ejecutan en modo Usuario, para obtener la máxima estabilidad? Al menos en Windows, la respuesta es que depende. Los controladores de dispositivos pueden ejecutarse en modo usuario o en modo kernel. Hoy en día, la mayoría de los controladores se sitúan en el lado de usuario, con la notable excepción de los controladores de las tarjetas de vídeo, que necesitan un rendimiento total en el modo de núcleo. Pero incluso eso está cambiando; en Windows Vista, los controladores de vídeo están segmentados en secciones de usuario y de núcleo. Quizá por eso los jugadores se quejan de que Vista es un 10 por ciento más lento en los juegos.
Modos de la CPU
El procesador cambia de un modo a otro en función del tipo de código que se ejecute en él. Las aplicaciones se ejecutan en modo usuario, y los componentes principales del sistema operativo se ejecutan en modo kernel. Mientras que muchos controladores se ejecutan en modo kernel, algunos pueden ejecutarse en modo usuario.
Cuando se inicia una aplicación en modo usuario, Windows crea un proceso para la aplicación. El proceso proporciona a la aplicación un espacio de direcciones virtual privado y una tabla de manejadores privada. Como el espacio de direcciones virtual de una aplicación es privado, una aplicación no puede alterar los datos que pertenecen a otra aplicación. Cada aplicación se ejecuta de forma aislada, y si una aplicación se bloquea, el bloqueo se limita a esa aplicación. Las demás aplicaciones y el sistema operativo no se ven afectados por el fallo.
Además de ser privado, el espacio de direcciones virtual de una aplicación en modo usuario es limitado. Un procesador que se ejecuta en modo usuario no puede acceder a las direcciones virtuales que están reservadas para el sistema operativo. Limitar el espacio de direcciones virtuales de una aplicación en modo usuario evita que la aplicación altere, y posiblemente dañe, datos críticos del sistema operativo.