jueves, 4 de diciembre de 2008

Administración de memoria en modo protegido

La administración de memoria facilitada por la arquitectura IA-32 está dividida en dos partes: segmentación y paginación. La segmentación proporciona un mecanismo para aislar código, datos, o módulos de pila individuales para que múltiples programas puedan ejecutarse en el mismo procesador sin interferirse entre ellas, dividiendo el espacio de memoria direccionable en espacios de direcciones protegidos más pequeños llamados segmentos. La paginación proporciona un mecanismo para implementar un sistema de memoria virtual convencional paginada donde las secciones del entorno de ejecución del programa sean mapeadas en la memoria física que necesite. La paginación se puede usar también para proporcionar aislamiento entre múltiples tareas. Cuando se opera en modo protegido, siempre se debe usar alguna forma de segmentación, sin embargo la paginación es opcional.
Estos dos mecanismos se pueden configurar para dar soporte a sistemas que ejecuten una única tarea, a sistemas multitarea, o a sistemas multiprocesador que usan memoria compartida.
Todos los segmentos del sistema están en el espacio de direcciones lineales del procesador. Para localizar un byte en un segmento particular, se deben proporcionar una dirección lógica (o puntero), que consiste en un selector de segmento y un offset. El selector de segmento es un identificador único para un segmento, y el offset localiza el byte dentro del segmento.
Los mecanismos de segmentación soportados por la arquitectura IA-32 se pueden implementar en una gran variedad de diseños de sistemas. Desde un sistema que los usa para proteger a los programas, hasta modelos multisegmentados que emplean la segmentación para crear robustos entornos de operación en cuyos múltiples programas y tareas necesitan ejecutarse con seguridad.
En el modo IA-32e de la arquitectura Intel 64, los efectos de la segmentación dependen de si el procesador se esté ejecutando en el modo de compatibilidad o en el modo de 64 bits. En el primero la segmentación actúa como comenté antes, pero en el segundo generalmente no existe segmentación; existe un espacio de direcciones lineales de 64 bits. El procesador trata la base de segmentación de CS, DS, ES y SS como si fueran cero, creando una dirección lineal equivalente a la dirección efectiva. Los segmentos FS y GS son excepciones; estos registros de segmento se pueden usar como una base de registros adicional para cálculos de direcciones lineales. Facilitan el direccionamiento a datos locales y aseguran las estructuras de datos del sistema operativo.
La paginación se puede usar con cualquier modelo de segmentación descrito. Consiste en dividir el espacio de direcciones lineales (en los cuales sus segmentos han sido mapeados) en partes pequeñas, o páginas. Estas páginas del espacio de direcciones lineal se mapea a páginas en el espacio físico de direcciones. Del mismo modo, la memoria es dividida en trozos del mismo tamaño que las páginas llamados marcos de página. Entonces, la cantidad de memoria desperdiciada por un proceso es el final de su última página, lo que minimiza la fragmentación interna y evita la externa. Este mecanismo de paginación ofrece facilidades de protección de niveles a las páginas que se puede usar en conjunto con el sistema de protección que ofrece la segmentación.
En modo protegido, la arquitectura IA-32 ofrece un espacio de direcciones físico normal de 4 GBytes (2^32 bytes). Este espacio no está segmentado, con direcciones contínuas de 0 a FFFFFFFFH. Este espacio puede ser mapeado a memoria de lectura/escritura, de sólo lectura, y memoria mapeada de E/S. Las facilidades para mapear memoria se pueden usar para dividirla en segmentos o páginas.
En el nivel de la arquitectura del sistema en modo protegido, el procesador usa dos modos de traducción de direcciones para conseguir la dirección de la memoria física: la traducción de direcciones lógicas, y la paginación del espacio de direcciones lineales. Incluso con el mínimo uso de la segmentación, a cada byte en el espacio de direcciones del procesador se accede con una dirección lógica, que consiste en un selector de segmento de 16 bits y un offset de 32. El procesador traduce cualquier dirección lógica en una dirección lineal. Una dirección lineal es una dirección de 32 bits en el espacio de direcciones lineales del procesador. Como el espacio de direcciones físicas, el espacio de direcciones lineales no está segmentado, es de 2^32 bytes, y las direcciones están en el rango de 0 a FFFFFFFFH. El espacio de direcciones lineales contiene todos los segmentos y tablas del sistema definidos por él. Si la paginación no está activada, el procesador mapea la dirección lineal directamente a una dirección física. Si está activada, se usa un segundo nivel de traducción de direcciones. En el modo IA-32e de un procesador Intel 64 se usan los mismos métodos de traducción, sin embargo en el modo de 64 bits, el offset y la dirección base del segmento son de 64 bits en vez de 32.
Cuando la bandera S (tipo de descriptor) de un descriptor de segmento está a cero, el descriptor es un descriptor de sistema. El procesador reconoce los siguientes tipos de descriptores de sistema: Descriptores de segmentos de tablas de descriptores locales (LDT, de local descriptor-table), descriptores de segmentos de estado de tarea (TSS, de task-state segment), descriptores de puertas de llamada, descriptores de puertas de interrupción, descriptores de puertas de trampa, y descriptores de puertas de tarea. Una tabla de descriptores de segmento es una selección de descriptores de segmentos, variable en longitud y puede contener hasta 2^13 descriptores de 8 bytes. Hay dos tipos de tablas de descriptores: La tabla de descriptores global (GDT, de global descriptor table), y la tabla de descriptores local (LDT, de local descriptor table). Cada sistema tiene que tener una GDT definida que se usará por todos los programas del sistema, y opcionalmente debe de definir una o más LDTs.
En el modo IA-32e de Intel 64, una tabla de descriptores de segmento puede contener hasta 2^13 descriptores de 8 bytes (como anteriormente), sin embargo los descriptores de sistema se expanden hasta 16 bytes (ocupando el espacio de 2 entradas). El GDTR y el LDTR (los registros del GST y del LDT, respectivamente) también son expandidos para abarcar direcciones base de 64 bits.
Cuando se opera en modo protegido, la IA-32 permite mapear directamente el espacio de direcciones lineales a una memoria física grande (por ejemplo, 4 GBytes de RAM), o indirectamente (usando paginación) a una memoria física más pequeña. Este segundo método de mapear el espacio lineal de direcciones se llama memoria virtual. Cuando se usa la paginación, el procesador divide el espacio de direcciones lineales en páginas de longitud fija (de 4 KBytes, 2 MBytes, o 4 MBytes) que puede ser mapeada en memoria física o almacenada en disco. Cuando un programa referencia una dirección lógica en memoria, el procesador traduce la dirección a una dirección lineal y entonces usa el mecanismo de paginación para traducirla a la correspondiente dirección física.
El mecanismo PAE (physical address extension) de paginamiento soporta direccionamiento físico de 36 bits, y fué introducido en la arquitectura IA-32 del Pentium Pro. La bandera PAE en el registro CR4 activa el mecanismo PAE y extiende las direcciones físicas de 32 bits a 36. El procesador proporciona direcciones de pines de línea adicionales para los bits adicionales. Para usar esta opción deben estar activos la bandera PG del registro CR0 (activa el paginamiento), y la bandera PAE del registro CR4. El procesador sólo soporta dos longitudes de paginamiento: 4 KBytes y 2 MBytes.
El mecanismo de paginamiento PSE-36 proporciona un método alternativo (al PAE) de extensión de direccionamiento de la memoria física a 36 bits. Este mecanismo usa el modo PSE (page size extension) y una tabla de directorios de páginas modificado para mapear páginas de 4 MBytes en un espacio de direcciones físicas de 64 GBytes. El procesador proporciona 4 pines de direccionamiento adicionales para los bits adicionales. Este mecanismo se introdujo en la IA-32 con el Pentium III.
La arquitectura Intel 64 expande las estructuras de paginamiento de la PAE a soportar potencialmente mapeado de una dirección lineal de 64 bits a una dirección física de 52. Cuando está activado IA-32e, la traducción de direcciones lineales a direcciones físicas es diferente que si está activado PAE en modo protegido. En este caso se usa hasta 4 niveles de paginamiento de estructuras de datos. Una nueva tabla de mapeo de páginas, y la tabla de paginamiento de map de nivel 4 (tabla PML4), están añadidas encima de la tabla de punteros de las páginas. La tabla PML4 se usa en la traducción de páginas sólo en el modo IA-32e, no tiene otro uso cuando IA-32e o PAE está desactivado.
Los mecanismos de segmentación y paginamiento proporcionados por la IA-32 soportan un conjunto de enfoques para administración de memoria. Cuando la segmentación y el paginamiento se combinan, los segmentos se pueden mapear a páginas de las dos formas. Para implementar un entorno de direccionamiento no segmentado, por ejemplo, todo el código, datos, y módulos de pila se pueden mapear a uno o más segmentos largos (de más de 4 GBytes) que comparte el mismo rango de direcciones lineales. Aquí los segmentos prácticamente son invisibles para las aplicaciones y para el sistema operativo. Si se usa el paginamiento, el mecanismo puede mapear un solo espacio de direcciones lineales (contenido en su propio segmento) a memoria virtual. O ese programa puede tener su propio espacio de direcciones lineales largo (contenido en su propio segmento), el cual es mapeado en memoria virtual a través de su propio directorio de páginas y de su propio conjunto de tablas de paginamiento.
Los segmentos pueden ser más pequeños que la longitud de la página; si un segmento así está contenido en una página que no está compartida con otro segmento, la memoria extra será desaprovechada. Los segmentos pueden contener el principio y el final de una página, y una página puede contener el principio y el final de un segmento; la arquitectura no fuerza ninguna correspondencia entre ambos, sin embargo es mucho más eficiente y más simple si se fuerza a que haya alguna.
El procesador guarda el directorio de página más reciente y las entradas a la tabla de páginas en caches llamados TLBs (de translation lookaside buffers). La familia P6 y los Pentium tienen TLBs separados para los datos y las caches de instrucción. La mayoría del paginamiento se realiza usando los contenidos de los TLBs, y son inaccesibles a las aplicaciones, programas y tareas. Sólo el sistema operativo o procedimientos ejecutados con privilegios de máximo nivel (nivel 0) pueden acceder a ellos.

No hay comentarios: