Modo protegido

ImprimirCitar
Modo operativo de CPUs compatibles con x86

En informática, el modo protegido, también llamado modo de dirección virtual protegida, es un modo operativo de las unidades centrales de procesamiento (CPU) compatibles con x86. Permite que el software del sistema use funciones como memoria virtual, paginación y multitarea segura diseñadas para aumentar el control de un sistema operativo sobre el software de la aplicación.

Cuando se enciende un procesador compatible con el modo protegido x86, comienza a ejecutar instrucciones en modo real para mantener la compatibilidad con procesadores x86 anteriores. Solo se puede ingresar al modo protegido después de que el software del sistema configure una tabla de descriptores y habilite el bit de habilitación de protección (PE) en el registro de control 0 (CR0).

El modo protegido se agregó por primera vez a la arquitectura x86 en 1982, con el lanzamiento del procesador 80286 (286) de Intel, y luego se amplió con el lanzamiento del 80386 (386) en 1985. Debido a las mejoras agregadas por el modo protegido, se ha adoptado ampliamente y se ha convertido en la base de todas las mejoras posteriores a la arquitectura x86, aunque muchas de esas mejoras, como instrucciones adicionales y nuevos registros, también aportaron beneficios al modo real.

Historia

El Intel 8086, el predecesor del 286, se diseñó originalmente con un bus de direcciones de 20 bits para su memoria. Esto permitió que el procesador accediera a 220 bytes de memoria, equivalentes a 1 megabyte. En ese momento, 1 megabyte se consideraba una cantidad de memoria relativamente grande, por lo que los diseñadores de la computadora personal de IBM reservaron los primeros 640 kilobytes para que los usaran las aplicaciones y el sistema operativo y los 384 kilobytes restantes para el BIOS (Sistema básico de entrada/salida).) y memoria para dispositivos adicionales.

A medida que disminuyó el costo de la memoria y aumentó el uso de la memoria, la limitación de 1 MB se convirtió en un problema importante. Intel pretendía resolver esta limitación junto con otras con el lanzamiento del 286.

El 286

El modo protegido inicial, lanzado con el 286, no se usó mucho; por ejemplo, fue utilizado por Coherent (desde 1982), Microsoft Xenix (alrededor de 1984) y Minix. Varias deficiencias, como la imposibilidad de acceder al BIOS o las llamadas de DOS debido a la imposibilidad de volver al modo real sin reiniciar el procesador, impidieron un uso generalizado. La aceptación también se vio obstaculizada por el hecho de que el 286 solo permitía el acceso a la memoria en segmentos de 16 bits a través de cada uno de los cuatro registros de segmento, lo que significa que solo se podía acceder a 4*216 bytes, equivalentes a 256 kilobytes, en un tiempo. Debido a que cambiar un registro de segmento en modo protegido provocó que un descriptor de segmento de 6 bytes se cargara en la CPU desde la memoria, la instrucción de carga del registro de segmento tomó muchas decenas de ciclos del procesador, lo que lo hizo mucho más lento que en el 8086; por lo tanto, la estrategia de calcular direcciones de segmento sobre la marcha para acceder a estructuras de datos de más de 128 kilobytes (el tamaño combinado de los dos segmentos de datos) se volvió poco práctica, incluso para los pocos programadores que la dominaban en el 8086/8088..

El 286 mantuvo la compatibilidad con versiones anteriores de su precursor, el 8086, al ingresar inicialmente al modo real al encenderlo. El modo real funcionó de manera prácticamente idéntica al 8086, lo que permitió que la gran mayoría del software 8086 existente se ejecutara sin modificaciones en el 286 más nuevo. -problema del huevo. Para acceder a la funcionalidad extendida del 286, el sistema operativo configuraba algunas tablas en la memoria que controlaban el acceso a la memoria en modo protegido, configuraba las direcciones de esas tablas en algunos registros especiales del procesador y luego configuraba el procesador en modo protegido. Esto permitió el direccionamiento de 24 bits, lo que permitió al procesador acceder a 224 bytes de memoria, equivalentes a 16 megabytes.

El 386

Un microprocesador Intel 80386

Con el lanzamiento del 386 en 1985, se solucionaron muchos de los problemas que impedían la adopción generalizada del modo protegido anterior. El 386 se lanzó con un tamaño de bus de direcciones de 32 bits, lo que permite acceder a 232 bytes de memoria, lo que equivale a 4 gigabytes. Los tamaños de los segmentos también se aumentaron a 32 bits, lo que significa que se podía acceder al espacio de direcciones completo de 4 gigabytes sin necesidad de cambiar entre varios segmentos. Además del mayor tamaño del bus de direcciones y los registros de segmentos, se agregaron muchas otras funciones nuevas con la intención de aumentar la seguridad y la estabilidad operativas. El modo protegido ahora se usa en prácticamente todos los sistemas operativos modernos que se ejecutan en la arquitectura x86, como Microsoft Windows, Linux y muchos otros.

Además, aprendiendo de las fallas del modo protegido 286 para satisfacer las necesidades de DOS multiusuario, Intel agregó un modo 8086 virtual separado, que permitió emular múltiples procesadores 8086 virtualizados en el 386. Se requiere virtualización de hardware x86 para virtualizar el Sin embargo, el modo protegido en sí tuvo que esperar otros 20 años.

386 adiciones al modo protegido

Con el lanzamiento del 386, se agregaron las siguientes características adicionales al modo protegido:

  • Paging
  • Espacio de dirección física y virtual de 32 bits (El espacio de dirección física de 32 bits no está presente en el 80386SX, y otras 386 variantes procesadoras que utilizan el autobús 286 más antiguo.)
  • offsets de 32 bits
  • Capacidad para cambiar al modo real sin reiniciar
  • Modo virtual 8086

Entrar y salir del modo protegido

Hasta el lanzamiento del 386, el modo protegido no ofrecía un método directo para volver al modo real una vez que se ingresaba al modo protegido. IBM ideó una solución alternativa (implementada en IBM AT) que implicaba restablecer la CPU a través del controlador de teclado y guardar los registros del sistema, el puntero de pila y, a menudo, la máscara de interrupción en la RAM del chip de reloj en tiempo real. Esto permitió que el BIOS restaurara la CPU a un estado similar y comenzara a ejecutar el código antes del reinicio. Más tarde, se usó una falla triple para restablecer la CPU 286, que era mucho más rápida y limpia que el método del controlador de teclado (y no depende del hardware compatible con IBM AT, pero funcionará en cualquier CPU 80286 en cualquier sistema).

Para ingresar al modo protegido, primero se debe crear la tabla de descriptores globales (GDT) con un mínimo de tres entradas: un descriptor nulo, un descriptor de segmento de código y un descriptor de segmento de datos. En una máquina compatible con IBM, la línea A20 (línea de dirección 21) también debe estar habilitada para permitir el uso de todas las líneas de dirección para que la CPU pueda acceder más allá de 1 megabyte de memoria (solo se permite usar las primeras 20 después encendido, para garantizar la compatibilidad con software anterior escrito para los modelos IBM PC y PC/XT basados en Intel 8088). Después de realizar esos dos pasos, el bit PE debe configurarse en el registro CR0 y debe realizarse un salto lejano para borrar la cola de entrada de captación previa.

; Programa MASM; entrar en modo protegido (set PE bit)mov EBX, CR0 ; Guardar registro de control 0 (CR0) a EBXo EBX, PE_BIT ; fijar PE bit by ORing, guardar a EBXmov CR0, EBX ; guardar EBX de vuelta a CR0; clara cola de prefetch; (utilizando la instrucción de salto lejos jmp)jmp CLEAR_LABELCLEAR_LABEL:

Con el lanzamiento del 386, se puede salir del modo protegido cargando los registros de segmento con valores de modo real, deshabilitando la línea A20 y borrando el bit PE en el registro CR0, sin necesidad de realizar los pasos de configuración inicial requeridos con el 286.

Características

El modo protegido tiene una serie de características diseñadas para mejorar el control de un sistema operativo sobre el software de la aplicación, con el fin de aumentar la seguridad y la estabilidad del sistema. Estas adiciones permiten que el sistema operativo funcione de una manera que sería significativamente más difícil o incluso imposible sin el soporte de hardware adecuado.

Niveles de privilegio

Ejemplo de uso de anillos de privilegio en un sistema operativo utilizando todos los anillos

En el modo protegido, hay cuatro niveles de privilegio o anillos, numerados del 0 al 3, siendo el anillo 0 el más privilegiado y el 3 el menos. El uso de anillos permite que el software del sistema restrinja el acceso a las tareas a los datos, las puertas de llamadas o la ejecución de instrucciones privilegiadas. En la mayoría de los entornos, el sistema operativo y algunos controladores de dispositivos se ejecutan en el anillo 0 y las aplicaciones se ejecutan en el anillo 3.

Compatibilidad con aplicaciones en modo real

Según el Manual de referencia del programador Intel 80286,

el 80286 sigue siendo compatible con la mayoría de los programas de aplicación 8086 y 80186. La mayoría de los programas de aplicación 8086 pueden ser recompilados o reensamblados y ejecutados en el 80286 en modo protegido.

En su mayor parte, la compatibilidad binaria con el código en modo real, la capacidad de acceder a hasta 16 MB de memoria física y 1 GB de memoria virtual fueron los cambios más evidentes para los programadores de aplicaciones. Esto no estuvo exento de limitaciones. Si una aplicación utilizaba o se basaba en cualquiera de las siguientes técnicas, no se ejecutaría:

  • Segmento aritmético
  • Instrucciones privilegiadas
  • Acceso directo al hardware
  • Escribir a un segmento de código
  • Ejecutar datos
  • Segmentos superpuestos
  • El uso de funciones de BIOS, debido a las interrupciones de BIOS siendo reservadas por Intel

En realidad, casi todos los programas de aplicación de DOS violaron estas reglas. Debido a estas limitaciones, se introdujo el modo virtual 8086 con el 386. A pesar de estos posibles contratiempos, Windows 3.0 y sus sucesores pueden aprovechar la compatibilidad binaria con el modo real para ejecutar muchas aplicaciones de Windows 2.x (Windows 2.0 y Windows 2.1x). en modo protegido, que se ejecutaba en modo real en Windows 2.x.

Modo virtual 8086

Con el lanzamiento del 386, el modo protegido ofrece lo que los manuales de Intel llaman modo 8086 virtual. El modo Virtual 8086 está diseñado para permitir que el código previamente escrito para el 8086 se ejecute sin modificaciones y simultáneamente con otras tareas, sin comprometer la seguridad o la estabilidad del sistema.

Sin embargo, el modo Virtual 8086 no es completamente compatible con versiones anteriores de todos los programas. Los programas que requieren manipulación de segmentos, instrucciones privilegiadas, acceso directo al hardware o código automodificable generarán una excepción que debe ser atendida por el sistema operativo. Además, las aplicaciones que se ejecutan en modo 8086 virtual generan una trampa con el uso de instrucciones que implican entrada/salida (E/S), lo que puede afectar negativamente al rendimiento.

Debido a estas limitaciones, algunos programas diseñados originalmente para ejecutarse en el 8086 no se pueden ejecutar en el modo 8086 virtual. Como resultado, el software del sistema se ve obligado a comprometer la seguridad del sistema o la compatibilidad con versiones anteriores cuando se trata de software heredado. Un ejemplo de tal compromiso se puede ver con el lanzamiento de Windows NT, que eliminó la compatibilidad con versiones anteriores para "mal comportamiento" aplicaciones DOS.

Direccionamiento de segmentos

Serie de sesiones virtuales de 80286

Modo real

En modo real, cada dirección lógica apunta directamente a una ubicación de memoria física, cada dirección lógica consta de dos partes de 16 bits: la parte del segmento de la dirección lógica contiene la dirección base de un segmento con una granularidad de 16 bytes, es decir, un el segmento puede comenzar en la dirección física 0, 16, 32,..., 220-16. La parte de desplazamiento de la dirección lógica contiene un desplazamiento dentro del segmento, es decir, la dirección física se puede calcular como physical_address: = segmento_part × 16 + offset (si la línea de dirección A20 está habilitada), respectivamente (segment_part × 16 + desplazamiento) mod 220 (si A20 está desactivado) Cada segmento tiene un tamaño de 216 bytes.

Modo protegido

En modo protegido, la segment_part se reemplaza por un selector de 16 bits, en el que los 13 bits superiores (bit 3 a bit 15) contienen el índice de una entrada dentro de una tabla de descriptores. El siguiente bit (bit 2) especifica si la operación se utiliza con el GDT o el LDT. Los dos bits más bajos (bit 1 y bit 0) del selector se combinan para definir el privilegio de la solicitud, donde los valores de 0 y 3 representan el privilegio más alto y más bajo, respectivamente. Esto significa que el desplazamiento de bytes de los descriptores en la tabla de descriptores es el mismo que el selector de 16 bits, siempre que los tres bits inferiores se pongan a cero.

La entrada de la tabla de descriptores define la dirección lineal real del segmento, un valor límite para el tamaño del segmento y algunos bits de atributo (banderas).

286

La dirección del segmento dentro de la entrada de la tabla de descriptores tiene una longitud de 24 bits, por lo que cada byte de la memoria física se puede definir como límite del segmento. El valor límite dentro de la entrada de la tabla de descriptores tiene una longitud de 16 bits, por lo que la longitud del segmento puede estar entre 1 byte y 216 bytes. La dirección lineal calculada es igual a la dirección de la memoria física.

386

La dirección del segmento dentro de la entrada de la tabla de descriptores se expande a 32 bits para que cada byte de la memoria física se pueda definir como límite del segmento. El valor límite dentro de la entrada de la tabla de descriptores se expande a 20 bits y se completa con un indicador de granularidad (G-bit, para abreviar):

  • Si G-bit es cero límite tiene una granularidad de 1 byte, es decir, tamaño del segmento puede ser 1, 2,..., 220 bytes.
  • Si G-bit es un límite tiene una granularidad de 212 bytes, es decir, tamaño del segmento puede ser 1 × 212, 2 × 212220 × 212 bytes. Si el paging está apagado, la dirección lineal calculada equivale a la dirección de memoria física. Si el paging está encendido, la dirección lineal calculada se utiliza como entrada de paging.

El procesador 386 también usa valores de 32 bits para el desplazamiento de dirección.

Para mantener la compatibilidad con el modo protegido 286, se agregó una nueva bandera predeterminada (D-bit, para abreviar). Si el bit D de un segmento de código está desactivado (0), todos los comandos dentro de este segmento se interpretarán como comandos de 16 bits de forma predeterminada; si está en (1), se interpretarán como comandos de 32 bits.

Estructura de la entrada del descriptor de segmento

Donde:

  • A es Acceso bit;
  • R es legible bit;
  • C (Bit 42) depende de X:
    • si X = 1 entonces C es Conformación bit, y determina qué niveles de privilegios pueden alcanzar mucho a este segmento (sin cambiar el nivel de privilegio):
      • si C = 0 entonces sólo código con el mismo nivel de privilegios DPL puede saltar aquí;
      • si C = 1 código con el mismo o menor nivel de privilegio relativo a DPL Puede saltar aquí.
    • si X = 0 entonces C es dirección Un poco:
      • si C = 0 entonces el segmento crece arriba;
      • si C = 1 entonces el segmento crece abajo.
  • X es Ejecución Un poco:
    • si X = 1 entonces el segmento es un segmento de código;
    • si X = 0 entonces el segmento es un segmento de datos.
  • S es Tipo de segmento bit, which should generally be cleared for system segments;
  • DPL es Nivel de privilegio descriptor;
  • P es Presente bit;
  • D es Tamaño predeterminado del funcionamiento;
  • G es Granularidad bit;
  • El bit 52 del descriptor 80386 no es utilizado por el hardware.

Paginación

Método común de usar paging para crear un espacio de dirección virtual
Paging (en Intel 80386) con tamaño de página de 4K

Además de agregar el modo 8086 virtual, el 386 también agregó paginación al modo protegido. A través de la paginación, el software del sistema puede restringir y controlar el acceso de una tarea a las páginas, que son secciones de la memoria. En muchos sistemas operativos, la paginación se usa para crear un espacio de direcciones virtual independiente para cada tarea, evitando que una tarea manipule la memoria de otra. La paginación también permite que las páginas se muevan del almacenamiento principal a un almacenamiento secundario más lento y más grande, como una unidad de disco duro. Esto permite utilizar más memoria que la disponible físicamente en el almacenamiento principal.

La arquitectura x86 permite el control de páginas a través de dos arreglos: directorios de páginas y tablas de páginas. Originalmente, un directorio de páginas tenía el tamaño de una página, cuatro kilobytes y contenía 1024 entradas de directorio de páginas (PDE), aunque las mejoras posteriores a la arquitectura x86 agregaron la capacidad de usar tamaños de página más grandes. Cada PDE contenía un puntero a una tabla de páginas. Una tabla de páginas también tenía originalmente un tamaño de cuatro kilobytes y contenía 1.024 entradas de tabla de páginas (PTE). Cada PTE contenía un puntero a la dirección física de la página real y solo se usa cuando se usan las páginas de cuatro kilobytes. En un momento dado, solo un directorio de páginas puede estar en uso activo.

Multitarea

Mediante el uso de anillos, puertas de llamadas privilegiadas y el segmento de estado de tareas (TSS), introducido con el 286, la multitarea preventiva fue posible en la arquitectura x86. El TSS permite que los registros de uso general, los campos selectores de segmentos y las pilas se modifiquen sin afectar los de otra tarea. El TSS también permite que el nivel de privilegio de una tarea y los permisos del puerto de E/S sean independientes de los de otra tarea.

En muchos sistemas operativos, no se utilizan todas las funciones del TSS. Esto suele deberse a problemas de portabilidad o a problemas de rendimiento creados con los conmutadores de tareas de hardware. Como resultado, muchos sistemas operativos usan hardware y software para crear un sistema multitarea.

Sistemas operativos

Los sistemas operativos como OS/2 1.x intentan cambiar el procesador entre los modos protegido y real. Esto es lento e inseguro, porque un programa en modo real puede bloquear fácilmente una computadora. OS/2 1.x define reglas de programación restrictivas que permiten que un programa Family API o bound se ejecute en modo real o protegido. Algunos de los primeros sistemas operativos Unix, OS/2 1.x y Windows usaban este modo.

Windows 3.0 pudo ejecutar programas en modo real en modo protegido de 16 bits; al cambiar al modo protegido, decidió conservar el modelo de nivel de privilegio único que se usaba en el modo real, razón por la cual las aplicaciones y DLL de Windows pueden enganchar interrupciones y acceder directamente al hardware. Eso duró a través de la serie Windows 9x. Si un programa de Windows 1.x o 2.x está escrito correctamente y evita la aritmética de segmentos, se ejecutará de la misma manera tanto en el modo real como en el protegido. Los programas de Windows generalmente evitan la aritmética de segmentos porque Windows implementa un esquema de memoria virtual de software, moviendo el código del programa y los datos en la memoria cuando los programas no se están ejecutando, por lo que manipular direcciones absolutas es peligroso; los programas solo deben mantener los identificadores de los bloques de memoria cuando no se están ejecutando. Iniciar un programa antiguo mientras Windows 3.0 se ejecuta en modo protegido activa un cuadro de diálogo de advertencia, lo que sugiere ejecutar Windows en modo real u obtener una versión actualizada de la aplicación. La actualización de programas que se comportan bien usando la utilidad MARK con el parámetro MEMORY evita este cuadro de diálogo. No es posible tener algunos programas GUI ejecutándose en modo protegido de 16 bits y otros programas GUI ejecutándose en modo real. En Windows 3.1, el modo real ya no era compatible y no se podía acceder a él.

En los sistemas operativos modernos de 32 bits, el modo virtual 8086 todavía se usa para ejecutar aplicaciones, p. Programas extensores de DOS compatibles con DPMI (a través de máquinas DOS virtuales) o aplicaciones de Windows 3.x (a través del subsistema Windows en Windows) y ciertas clases de controladores de dispositivos (p. ej., para cambiar la resolución de pantalla usando la funcionalidad BIOS) en OS/2 2.0 (y posterior OS/2) y Windows NT de 32 bits, todo bajo el control de un kernel de 32 bits. Sin embargo, los sistemas operativos de 64 bits (que se ejecutan en modo largo) ya no lo usan, ya que el modo 8086 virtual se eliminó del modo largo.

Contenido relacionado

Sombrero rojo linux

Edwin Howard Armstrong

Transporte en Angola

Más resultados...
Tamaño del texto:
Copiar