|
Administración de memoria en modo protegido
1 - Introducción
En el modo protegido del i386 se cuenta con dos ventajas en la administración de memoria: paginación y segmentación.
La segmentación brinda la posibilidad de "aislar" módulos de memoria (código, datos, pila), para que diferentes tareas puedan correr sobre el mismo procesador si interferir una con otra.
La paginación brinda la posibilidad de tener en memoria pequeñas partes de los módulos en función de lo requerido. La paginación puede utilizarse para brindar "aislamiento" entre diferentes tareas.
Cuando operamos en modo protegido, alguna forma de segmentación debe ser utilizada, debido a que la segmentación no tiene la posibilidad de habilitarla o no, en cambio la paginación si.
Estos dos mecanismos, pueden ser configurados para soportar un único proceso (o tarea), multitarea, o sistemas multiprocesamiento que utilicen memoria compartida.
La segmentación brinda un mecanismo para la división del espacio de memoria direccionable por el procesador (llamado ESPACIO DE DIRECCIONAMIENTO LINEAL) en espacios de direcciones protegidos más pequeños (llamados SEGEMENTOS).
Los segmentos pueden ser usados para almacenar CODIGO, DATOS o PILA, para un proceso o estructuras de datos del sistema (como TSS's o LDT's).
Si mas de un proceso corre en un procesador, a cada uno de ellos se le puede asignar su propio juego de segmentos. El procesador fuerza los limites entre estos segmentos, y asegura que un proceso no interfiera con la ejecución del otro escribiendo en los segmentos de memoria que no le fueron asignados.
La segmentación también brinda la posibilidad de tipificar los segmentos, para evitar que ciertas operaciones no se puedan realizar en ciertos tipos de segmentos (por ejemplo escribir en un segmento de código).
Todos los segmentos de un sistema deben ubicarse dentro del espacio de direccionamiento lineal del procesador. Para ubicar un byte en un segmento en particular, se requiere de una DIRECCION LOGICA (a veces llamada puntero lejano). Una dirección lógica consta de un SELECTOR de segmento y un desplazamiento dentro del mismo. Un selector de segmento es un IDENTIFICADOR UNICO del segmento, el mismo se lo ubica a través de un desplazamiento dentro de la tabla de descriptores de segmentos (por ejemplo la GDT, global descriptor table), en dicha posición se encontrara una estructura del sistema, reconocida por el procesador como descriptor de segmento, conteniendo la BASE del segmento (ubicación del primer byte del segmento dentro del espacio direccionable lineal de memoria), su LIMITE (tamaño del segmento), sus permisos de acceso y nivel de privilegio, y tipo de segmento.
El desplazamiento, de la dirección lógica, es sumado a la base definida en el descriptor del segmento, el cual es parte de la dirección lógica, formando así la dirección lineal.
Si no se utiliza paginación la dirección lineal es mapeada directamente a la DIRECCION FISICA de memoria. La dirección física de memoria es el rango de direcciones que el procesador es capaz de generar a través de su bus de direcciones.
Comúnmente en un sistema multitarea se define un espacio de direccionamiento lineal mas grande, conviene poder abarcarlo en espacio físico de direccionamiento, para ello es necesario algún método para "virtual izar" el espacio lineal. Esta virtualización es manejada por el mecanismo de paginación del procesador.
La paginación soporta un entorno de "memoria virtual", en donde un gran espacio de memoria lineal es simulado con un pequeño espacio de memoria física (RAM y ROM) y un sector de disco. Cuando se utiliza paginación, los segmentos son divididos en páginas, cada una, comúnmente de 4K, las cuales son almacenadas o en el espacio de memoria física, o en el disco. El sistema operativo mantiene un directorio de páginas, y un juego de tablas de páginas, para tener un seguimiento de las mismas. Cuando un proceso o una tarea intenta acceder a una dirección del espacio de memoria lineal, el procesador consulta el directorio de páginas y las tablas para transformar la dirección lineal en una dirección del espacio físico de memoria, y luego realiza la operación requerida (lectura/escritura) en la ubicación deseada. Si la pagina solicitada no se encuentra en el espacio de direccionamiento físico, el procesador interrumpe la ejecución del programa (generando una EXCEPCION page fault). El sistema operativo obtiene la página del disco y la ubica en el espacio de direccionamiento físico para luego continuar con la ejecución del proceso o tarea interrupida.
Cuando la paginación es implementada correctamente en el sistema operativo, el swapping de páginas entre el espacio físico de direccionamiento y el disco, es transparente para el correcto funcionamiento del proceso o tarea. Hasta los procesos escritos para las arquitecturas de Intel de 16 bits, pueden ser paginados (transparentemente) cuando corren en el modo virtual-8086.
2 - Formas de segmentación
El mecanismo de segmentación de la arquitectura Intel puede ser utilizado para implementar una amplia variedad de diseños de sistemas. Estos disnos varían desde el modelo Flat, el cual utiliza minimamente la segmentación para proteger los procesos, hasta el modelo multisegmentado el cual implementa la segmentación para crear un entorno de operación robusto en el cual múltiples procesos y tareas pueden ser ejecutados con seguridad.
2.1 - Segmentación Flat
Este el modelo mas sencillo de segmentación. En el mismo, el sistema operativo y las aplicaciones, tienen acceso a un espacio de direccionamiento continuo y no segmentado. Lo mas extenso como sea posible, ocultando el mecanismo de segmentación de la arquitectura, del diseñador del sistema y del programador de aplicaciones.
Para implementar este modelo es necesario crear al menos dos descriptores de segmentos, uno para referenciar a un segmento de código y otro para referenciar a uno de datos, aunque este mapeados a todo el espacio de direccionamiento lineal del sistema: esto es, ambos segmentos tienen base 0x0, e igual limite: 4GB. Configurando el limite en 4GB, el mecanismo de segmentación estará liberado de producir excepciones por referencias a memoria fuera de limite (ya que 4GB es el máximo direccionable por la arquitectura del i386), aunque no resida memoria física en una dirección particular. ROM (EPROM) generalmente se ubica en la parte superior del espacio de direccionamiento físico, porque el procesador comienza a ejecutar en FFFF_FFF0H. RAM (DRAM) esta ubicada en la parte inferior del espacio de direccionamiento físico, ya que al iniciar el registro de segmento de datos se encuentra con valor 0H.
2.2 - Segmentación Flat Protegida
Este modelo es similar al modelo Flat básico, excepto que los límites de los segmentos son configurados para incluir solo el rango de direcciones para el cual existe memoria física actualmente. Una excepción de protección-general (#GP) es generada ante cualquier intento de acceder a memoria no existente, lo cual no ocurre en el modelo anterior. Este modelo provee un nivel mínimo de protección por hardware contra algunos tipos de errores de programación.
Se puede incrementar la complejidad del modelo para proveer mayor protección. Por ejemplo, en el mecanismo de paginación, para proveer "aislamiento" entre código y datos del usuario y del supervisor, es necesario definir cuatro segmentos: uno de código y otro de datos para el nivel de privilegio 3 para el usuario, y otros dos para el nivel de privilegio 0 para el supervisor. Usualmente estos segmentos se encuentran solapados y tienen una base común 0H. Este modelo Flat junto con una estructura de paginación puede proteger el sistema operativo de las aplicaciones, y agregando una estructura de paginación separada para cada proceso o tarea, puede, a su vez, proteger a las aplicaciones entre ellas. Modelos similares son utilizados por varios sistemas operativos multitarea populares.
2.3 - Segmentación Multisegmentos
Un modelo multisegmentos usa todas las capacidades del mecanismo de segmentación para proveer una forzosa protección por hardware del código, estructura de datos, y procesos y tareas.
En este modelo, a cada proceso o tarea, se le asigna su propia tabla de descriptores de segmentos y sus propios segmentos. Los segmentos pueden ser completamente privados al proceso o tarea al que fueron asignados, o compartidos con otros procesos o tareas. El acceso a todos los segmentos y a los entornos de ejecución de cada proceso o tarea individual corriendo en el sistema, es controlada por el hardware.
Se puede utilizar control de acceso no solo para proteger contra referencias a memoria fuera del límite del segmento, sino contra la ejecución de operaciones no permitidas en ciertos segmentos, por ejemplo, el hardware no permitiría que se escriba en un segmento de solo lectura como lo son los de código. La información de permisos de acceso creada para el segmento puede ser utilizada para la creación de ANILLOS O NIVELES DE PROTECCION. Los niveles de protección pueden ser utilizados para proteger los procedimientos del sistema operativo de accesos no autorizados de programas de aplicación.
3 - Segmentación y Paginación
Aquí la segmentación es usada para definir particiones lógicas de memoria orientadas al control de acceso y la paginación es usada para manejar la localización de la memoria dentro de las particiones. El sistema MULTICS resolvió el problema de la fragmentación externa mediante la "paginación de los segmentos". * La solución difiere de la segmentación pura en que la entrada de la tabla de segmentos no contiene la dirección base del segmento, sino la dirección base de una tabla de páginas para ese segmento.
Entonces podemos decir que gracias a la paginación se elimina fragmentación externa y se provecha eficientemente la memoria
y gracias a la segmentación, es más visible al programador y da soporte para compartición y protección.
Dirección lógica:
Desde el punto de vista del usuario esta formada por:
Nro de segmento | desplazamiento
Desde el punto de vista de la máquina esta formada por:
Nro segmento | Nro página | desplazamiento
Estructuras de datos utilizadas:
-Cada proceso
-Una tabla de segmentos
-Una tabla de páginas por segmento
|