Modo Protegido

     

 

Introducción

  El direccionamiento de memoria en modo protegido (a partir del 80286 y posteriores) permite acceder a datos y programas localizados por encima y dentro del primer megabyte de memoria. Para direccionar esta sección extendida el sistema de memoria se requiere un cambio en el esquema de direccionamiento de segmento más desplazamiento usado en el modo real. Cuando los datos y programa se direccionan la memoria extendida, se sigue utilizando la dirección de desplazamiento para acceder a la información en el segmento de memoria. Una diferencia consiste en la dirección del segmento ya que no existe en modo protegido. En lugar de una dirección de segmento, el registro de segmento contiene un SELECTOR  que elige un descriptor de una tabla.

  El descriptor especifica la ubicación del segmento en memoria, su longitud  y sus derechos de acceso. Dado que el registro de segmento y la dirección  de desplazamiento aún  acceden a la memoria, las instrucciones del modo protegido son idénticas a las de modo real. De hecho, la mayoría de los programas escritos para funcionar en modo real funcionarán sin cambios en el modo protegido.

  La diferencia entre los dos modos es la forma en que el microprocesador interpreta el registro de segmento para acceder al segmento de memoria. Otra diferencia, en los 80386 y posteriores, es que en modo protegido la dirección de desplazamiento puede ser un número de 32 bits en vez de utilizar uno de 16 bits como en modo real. Es por esto que puede direccionar hasta 4 Gb de longitud.

  El SELECTOR, ubicado en el registro del segmento, elige uno de 8192 descriptores en una de las dos tablas de descriptores. El DESCRIPTOR especifica la ubicación, la longitud  y los derechos de acceso del segmento de memoria, aunque no directamente como en el modo real. Por ejemplo, en el modo real, si CS=0008H, el segmento de código inicia en la localidad 00080H. En modo protegido, este número de segmento puede direccionar cualquier localidad  de memoria en todo el sistema para el  segmento de código.

  Existen dos tablas de descriptores utilizadas con los registros  de segmentos: una contiene descriptores globales y otra, descriptores locales. Los descriptores globales contienen las definiciones de los segmentos que se aplican a todos los programas, mientras que los descriptores locales son generalmente exclusivos de una aplicación. Podríamos llamar descriptor de sistema a un descriptor global, y descriptor de aplicación a uno local. Cada tabla de descriptores contendrá 8192 entradas, por lo tanto una aplicación  podría disponer en cualquier momento de 16.384 descriptores. Puesto que un descriptor describe un segmento de memoria, esto permite que puedan ser descriptos hasta 16.384 segmentos de una aplicación.

Descriptor del 80286  

 

7

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

 

6

5

Derechos de Acceso

Base (B23-B16)

4

3

Base (B15-B0)

2

1

Limite (L15-L0)

0

Descriptor del 80386 al Pentium II 

 

7

 

BASE (B13-B24)

G

D

O

V

LIMITE

(L19-L16)

 

6

 

5

Derechos de Acceso

Base (B23-B16)

4

3

Base (B15-B0)

2

1

Limite (L15-L0)

0

   Llamaremos DIRECCION DE BASE a la parte del descriptor que indica el inicio de un segmento de memoria. Para el microprocesador 80286, la dirección base es de 24 bits, así que los segmentos inician en cualquier localidad dentro de sus 16 MB de memoria. Los 80386 y posteriores emplean una dirección de base de 32 bits, que permite que los segmentos incien en cualquier localidad  de sus 4 Gb de memoria. Es por lo dicho anteriormente que podemos ver que el descriptor del 80286 es compatible con el 80386 al Pentium II, ya que sus 16 bits más significativos son los 0000H.

   El LIMITE DE SEGMENTO contiene la última dirección  de desplazamiento del segmento.

   A partir del 386 hasta el Pentium se incluyó el bit G o llamado BIT DE GRANULARIDAD. Si este G=0, el límite especifica un límite de segmento entre 00000H y FFFFF. Si G=1, el valor del límite se multiplica por 4 KB (agregando XXXXH). El límite para G=1 va entonces desde 00000XXXH hasta FFFFFXXXH. Esto permite una longitud de segmento de 4 KB a  4 GB en intervalos de 4 KB.

   En el descriptor del 80386 y posteriores, el bit AV es usado por algunos sistemas operativos para indicar que el segmento esta disponible (AV=1) o que no lo esta (AV=0). El bit D indica la forma en que las intrucciones de los microprocesadores 80386 al Pentium II acceden a los registros y a los datos  de memoria tanto en modo protegido como en el real. Si D=0, las instrucciones son de 16 bits, compatibles con los microprocesadores 8086 al 80286. Esto significa que las instrucciones utilizan registros y direcciones  de desplazamiento de 16 bits en forma predeterminada. Si D=1, las instrucciones son de 32 bits. Por omisión, el modo de instrucciones de 32 bits da por hecho que todas las direcciones de desplazamiento y los registros son de 32 bits.

7

6

5

4

3

2

1

0

P

DPL

 

S

E

ED/C

R/W

A

 

A=0 El segmento no ha sido accedido

A=1 El segmento ha sido accedido

E=0   El descriptor describe a un segmento de datos

ED=0 El segmento se expande hacia arriba (segmento de datos)

ED=1 El segmento se expande hacia abajo (segmento de pila)

 

W=0  Los datos no pueden se escritos

W=1  Los datos pueden se escritos

E=1 El descriptor describe a un segmento de código

C=0 Ignora el nivel de privilegio del descriptor

C=1 Honra el nivel de privilegio

 

R=0 El segmento de código no puede leerse

R=1 El segmento de código  puede leerse 

 

S=0     Descriptor de sistema

S=1     Descriptor de segmento de código o datos

 

DLP =  Establece el nivel de privilegio del descriptor

 

P=0 Descriptor sin definir

P=1 El segmento contiene una base y límite válidos.

   En modo protegido, el byte de derechos de acceso controla el acceso al segmento de memoria. Este byte define el funcionamiento del segmento en el sistema. El byte de derechos de acceso permite un control completo sobre el segmento. Si el segmento es de datos, especifica el sentido de crecimiento; si el segmento crece más allá de su límite, el programa del microprocesador es interrumpido, indicando un error de protección general. Se puede especificar si un segmento de datos puede ser escrito o si está protegido contra escritura. E segmento de código  es controlado en forma similar y su lectura puede ser inhibida para proteger el software.

   Los descriptores son seleccionados mediante el registro de segmento de la tabla de descriptores.

   El registro de segmento contiene un campo de selección de 13 bits, un bit selector de tabla y un campo de nivel de privilegio de acceso, El selector de 13 bits selecciona uno de los 8192 descriptores de la tabla. El bit TI elige entre la tabla de descriptores globales (TI=0)  o los descriptores locales (TI=1). El RPL (nivel de privilegio de acceso) define el nivel de privilegio de un segmento de memoria. El nivel de privilegio más alto es 00 y el más bajo 11. Si el nivel de privilegio solicitado coincide o tiene mayor prioridad que el nivel de privilegio establecido por el byte de derechos de acceso, se permite el acceso. Por ejemplo si el nivel de privilegio asociado es 10 y el byte de derechos de acceso establece un nivel de privilegio de 11 para el segmento, el acceso es autorizado ya que el nivel de privilegio 10 tiene mayor prioridad que 11 (los niveles de privilegio se utilizan en ambientes multiusuario y el sistema indica que normalmente cuando se presenta una violación  privilegio).

 

15                                         3       2     1   0   

SELECTOR                              |  TI  | RPL     |

 

   Las tablas de descriptores globales y locales se encuentran en el sistema de memoria. Con el fin de acceder y especificar la dirección de estas tablas, los microprocesadores 80286, 80386, 80486, Pentium, Pentium Pro y Pentium II contienen registros invisibles para el programa. Los registros invisibles para el programa no son diseccionados directamente por el software, motivo por el cual reciben este nombre (TR, LDTR,GDTR,IDTR)

   La parte invisible de estos registros recibe el nombre de caché ( no se debe confundir con los niveles 1 o 2 encontradas en el microprocesador). Cada vez que se cambia el número en el registro de segmento, la parte del registro de segmentos invisible para el programa es cargada en la dirección base., el límite y los derechos de acceso. Cuando se escribe un nuevo número en un registro, el microprocesador accede a la tabla de descriptores y carga el descriptor en la caché invisible para el programa de forma parte  del registro del segmento. El descriptor se mantiene ahí y es usado para acceder al segmento de memoria hasta que el número de segmento es cambiado nuevamente. Esto permite al microprocesador acceder repetidamente a un segmento de memoria sin consultar en cada ocasión la tabla de descriptores (de ahí el término caché).

   El GDTR (registro de tabla de descriptores globales) y el IDTR (registro de tabla de descriptores de interrupción) contiene la dirección base y límite de la tabla de descriptores. El límite de cada tabla de descriptores es de 16 bits debido a que la máxima longitud de la tabla es de 64 KB. Cuando se desea la operación en modo protegido, la dirección y el límite de la tabla de descriptores globales son cargados en el GDTR. Antes de usar el modo protegido, debe inicializarse también la tabla de descriptores de interrupción y el IDTR.

  La ubicación de la tabla de descriptores locales es seleccionada de la tabla de descriptores globales (uno de los descriptores se configura para direccionar la tabla de descriptores locales).

  Para acceder a la tabla de descriptores locales , LDTR (registro de la tabla de descriptores locales) es cargado con un selector, al igual que un registro de segmento es cargado con un selector. Este selector accede a la tabla de descriptores globales y carga la dirección de base, el límite y los derechos de acceso de la tabla de descriptores hacia la parte caché del LDTR.

  El TR (registro de tarea) contiene un selector, el cual accede a un descriptor que define una tarea. Una tarea es con frecuencia un procedimiento o un programa de aplicación. El descriptor para el procedimiento o programa es almacenado en la tabla de descriptores globales, de forma que el acceso pueda se controlado por medio de los niveles de privilegio. El registro de tarea permite la conmutación de contexto o de tarea en aprox. 17 us. La conmutación de tareas se efectúa en lapsos razonablemente cortos y permite a los sistemas multitareas cambiar una tarea a otra de manera simple y ordenada.