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 |
A
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.
|