GESTION DE MEMORIA EN EL MODO PROTEGIDO DEL 286

El microprocesador 286 incluye dos modos de funcionamiento: el modo real, en el que se comporta exactamente igual que un 8086, y el modo protegido, en el que surgen capacidades nuevas, como memoria virtual, proteccion de segmentos, etc.

La forma de acceder a la memoria en el modo protegido, que es en el que trabaja OS/2 1.x, es mediante una combinación de dos valores de 16 bits cada uno: un selector y un offset o desplazamiento. El valor del selector se almacena en un registro del microprocesador, y se usa como índice para acceder a una tabla de selectores. Conviene señalar que esta tabla se almacena en la memoria RAM del sistema; esto explica que el hecho de cargar un nuevo valor en el registro de selector consuma mucho tiempo, pues hay que hacer dos lecturas a RAM (cada entrada de esta tabla ocupa 4 bytes), aparte de numerosas comprobaciones. En esta tabla se definen los distintos segmentos accesibles por el programa, y entre estos datos se incluye la posición base de cada uno. El offset indica el valor a sumar a dicha dirección base para obtener la dirección del dato.

Dado que la dirección base almacenada en la tabla de selectores viene definida con 24 bits, podemos situar cada segmento en cualquier punto de la memoria física (el 286 tiene un bus de direcciones de 24 lineas, luego puede direccionar hasta 16 megas), y recorrerlo con el valor de offset. Dado que este valor es de 16 bits, el tamaño máximo de cada segmento es de 64 kilobytes.

En este gráfico se ve el proceso seguido para calcular una dirección en base al valor del selector y del offset.

Vemos que este sistema nos permite cambiar de sitio cada uno de los segmentos sin que el programa falle. Esto es porque el programa se refiere a cada segmento a través de un selector, y no por medio de su dirección base, como ocurre en el modo real. Si para compactar la memoria, el OS/2 necesita mover el segmento 3 a otra zona, cambiará también la dirección base en la tabla de selectores. Como el programa se refiere a esa zona como el 'Selector 3', siempre accederá de forma correcta.

También vemos que el tamaño de cada segmento es variable, pudiendo medir desde 1 byte hasta 64 Kbytes. Si el segmento mide menos que el máximo y se intenta leer o escribir más allá de sus límites, se produce un error, una excepción, que hace que OS/2 intercepte el programa y lo termine inmediatamente. Lo mismo si se carga un valor no válido en el registro de selector.

Este esquema permite además implementar un sistema de memoria virtual. Entre los muchos datos que se almacenan en la tabla de selectores, uno de ellos es si ese segmento está presente o no en la memoria física. Si el programa carga en el registro de selector un valor correspondiente a un segmento no presente, se produce una excepción, la cual salta al gestor de memoria virtual que lo que hará será pasar a disco un segmento poco usado, marcandolo como no presente, cargar en esa zona el segmento reclamado por el programa, marcarlo como presente y anotar su dirección base en la tabla de selectores, y devolver el control a la aplicación. De este modo se puede trabajar con más memoria que la que tiene físicamente la máquina.

Este esquema tiene un pequeño problema: dado que los segmentos pueden tener un tamaño variable, puede ser necesario liberar varios pequeños para hacer sitio a uno grande. Además, la memoria puede fragmentarse con facilidad, lo que obliga a reorganizarla para juntar pequeños huecos libres en uno solo grande. Todo esto consume tiempo extra durante el intercambio a disco. Pensando en esto, en el 386 se mejoró el modo protegido, de modo que se facilita la gestión de la memoria virtual.

Pagina anterior  Indice  Pagina siguiente