A continuación se brinda una descripción detallada de los contenidos de los descriptores utilizados en el microprocesador 80286 operando en modo protegido.
Bits de atributo del descriptor
El objeto apuntado por el selector se llama descriptor. Los descriptores son cantidades de ocho bytes que contienen atributos sobre una región de memoria (es decir, un segmento). Estos atributos incluyen la dirección base de 24 bits, la longitud de 16 bits, el nivel de protección (de 0 a 3), permisos de lectura, escritura o ejecución (esto último para segmentos de código), y el tipo de segmento. A continuación se muestra el formato general de un descriptor.
- Byte 0: Límite del segmento (bits 7-0).
- Byte 1: Límite del segmento (bits 15-8).
- Byte 2: Dirección base del segmento (bits 7-0).
- Byte 3: Dirección base del segmento (bits 15-8).
- Byte 4: Dirección base del segmento (bits 23-16).
- Byte 5: Derechos de acceso del segmento.
- Bytes 6 y 7: No utilizados (deben valer cero para lograr la compatibilidad con 80386 y posteriores).
El byte de derechos de acceso es el que define qué clase de descriptor es. El bit 4 (S) indica si el segmento es de código o datos (S = 1), o si es del sistema (S = 0). Veremos el primer caso.
- Bit 7: Presente (P). Si P = 1 el segmento existe en memoria física, mientras que si P = 0 el segmento no está en memoria. Un intento de acceder un segmento que no está presente cargando un registro de segmento (CS, DS, ES o SS) con un selector que apunte a un descriptor que indique que el segmento no está presente generará una excepción 11 (en el caso de SS se generará una excepción 12 indicando que la pila no está presente). El manejador de la interrupción 11 deberá leer el segmento del disco rígido. Esto sirve para implementar memoria virtual.
- Bits 6 y 5: Nivel de privilegio del descriptor (DPL): Atributo de privilegio del segmento utilizado en tests de privilegio.
- Bit 4: Bit descriptor del segmento (S): Como se explicó más arriba, este bit vale 1 para descriptores de código y datos.
- Bit 3: Ejecutable (E): Determina si el segmento es de código (E = 1), o de datos (E = 0).
Si el bit 3 vale cero:
- Bit 2: Dirección de expansión (ED): Si E = 0, el segmento se expande hacia arriba, con lo que los offsets deben ser menores o iguales que el límite. Si E = 1, el segmento se expande hacia abajo, con lo que los offsets deben ser mayores que el límite. Si no ocurre esto se genera una excepción 13 (Fallo general de protección) (en el caso de la pila se genera una excepción 12).
- Bit 1: Habilitación de escritura (W): Si W = 0 no se puede escribir sobre el segmento, mientras que si W = 1 se puede realizar la escritura.
Si el bit 3 vale uno:
- Bit 2: Conforme (C): Si C = 1, el segmento de código sólo puede ser ejecutado si CPL es mayor que DPL y CPL no cambia. Los segmentos conformes sirven para rutinas del sistema operativo que no requieran protección, tales como rutinas matemáticas, por ejemplo.
- Bit 1: Habilitación de lectura (R): Si R = 0, el segmento de código no se puede leer, mientras que si R = 1 sí. No se puede escribir sobre el segmento de código.
- Bit 0: Accedido (A): Si A = 0 el segmento no fue accedido, mientras que si A = 1 el selector se ha cargado en un registro de segmento o utilizado por instrucciones de test de selectores. Este bit es puesto a uno por el microprocesador.
|