La mayoría de los sistemas modernos dividen la memoria en páginas que tienen un tamaño de 464 KB, a menudo con la capacidad de utilizar las llamadas páginas enormes de 2 MB o 1 GB de tamaño (a menudo ambas variantes son posibles). Las traducciones de las páginas se almacenan en caché en una memoria intermedia de traducción (TLB). Algunos sistemas, principalmente los diseños RISC más antiguos, hacen una trampa en el SO cuando no se encuentra una traducción de página en el TLB. La mayoría de los sistemas utilizan un caminador de árbol basado en hardware. La mayoría de los sistemas permiten deshabilitar la MMU, pero algunos deshabilitan la MMU cuando se trapea en el código del SO.

VAXEdit

Las páginas de VAX son de 512 bytes, lo cual es muy pequeño. Un SO puede tratar varias páginas como si fueran una sola página más grande. Por ejemplo, Linux en VAX agrupa ocho páginas. Así, el sistema es visto como si tuviera páginas de 4 KB. El VAX divide la memoria en cuatro regiones de propósito fijo, cada una de 1 GB de tamaño. Son:

Espacio P0 Se utiliza para la memoria de propósito general por proceso, como los heaps. Espacio P1 (O espacio de control) que también es por proceso y se utiliza normalmente para el supervisor, ejecutivo, kernel, pilas de usuario y otras estructuras de control por proceso gestionadas por el sistema operativo. Espacio S0 (o espacio del sistema) que es global para todos los procesos y almacena el código y los datos del sistema operativo, ya sean paginados o no, incluyendo las tablas de páginas. Espacio S1 Que no se utiliza y está «Reservado a Digital».

Las tablas de páginas son grandes matrices lineales. Normalmente, esto sería un gran desperdicio cuando las direcciones se utilizan en ambos extremos del rango posible, pero la tabla de páginas para las aplicaciones se almacena a su vez en la memoria paginada del kernel. Por lo tanto, hay efectivamente un árbol de dos niveles, permitiendo a las aplicaciones tener una disposición de memoria dispersa sin desperdiciar mucho espacio en las entradas de la tabla de páginas no utilizadas. La MMU de VAX es notable por carecer de un bit de acceso. Los sistemas operativos que implementan la paginación deben encontrar alguna manera de emular el bit de acceso si quieren operar eficientemente. Típicamente, el SO desmapeará periódicamente las páginas para que los fallos de página no presente puedan ser utilizados para que el SO establezca un bit de acceso.

ARMEdit

Los procesadores de aplicaciones basados en la arquitectura ARM implementan una MMU definida por la arquitectura del sistema de memoria virtual de ARM. La arquitectura actual define PTEs para describir páginas de 4 KB y 64 KB, secciones de 1 MB y supersecciones de 16 MB; las versiones anteriores también definían una página diminuta de 1 KB. ARM utiliza una tabla de páginas de dos niveles si utiliza páginas de 4 KB y 64 KB, o sólo una tabla de páginas de un nivel para las secciones de 1 MB y las secciones de 16 MB.

Las actualizaciones de la tabla de páginas se realizan automáticamente mediante el hardware de recorrido de la tabla de páginas. Los PTEs incluyen permiso de acceso de lectura/escritura basado en el privilegio, información de cacheabilidad, un bit NX y un bit no seguro.

IBM System/360 Modelo 67, IBM System/370 y sucesoresEditar

El IBM System/360 Modelo 67, que se introdujo en agosto de 1965, incluía una MMU llamada caja de traducción dinámica de direcciones (DAT). Tiene la característica inusual de almacenar los bits accedidos y sucios fuera de la tabla de páginas (junto con la clave de protección de cuatro bits para todos los procesadores S/360). Se refieren a la memoria física en lugar de a la memoria virtual, y se accede a ellos mediante instrucciones de propósito especial. Esto reduce la sobrecarga para el SO, que de otro modo tendría que propagar los bits accedidos y sucios desde las tablas de páginas a una estructura de datos más orientada físicamente. Esto hace que la virtualización a nivel de SO, más tarde llamada paravirtualización, sea más fácil.

Desde agosto de 1972, el IBM System/370 tiene una MMU similar, aunque inicialmente sólo soportaba un espacio de direcciones virtuales de 24 bits en lugar del espacio de direcciones virtuales de 32 bits del System/360 Modelo 67. También almacena los bits accedidos y sucios fuera de la tabla de páginas. A principios de 1983, la arquitectura System/370-XA amplió el espacio de direcciones virtuales a 31 bits, y en el año 2000, se introdujo la arquitectura z/Architecture de 64 bits, con el espacio de direcciones ampliado a 64 bits; estos continúan almacenando los bits accedidos y sucios fuera de la tabla de páginas.

DEC AlphaEdit

El procesador DEC Alpha divide la memoria en páginas de 8 KB. Después de un fallo en la TLB, el código máquina del firmware de bajo nivel (aquí llamado PALcode) recorre una tabla de páginas con estructura de árbol de tres niveles. Las direcciones se dividen de la siguiente manera: 21 bits no utilizados, 10 bits para indexar el nivel raíz del árbol, 10 bits para indexar el nivel medio del árbol, 10 bits para indexar el nivel de hoja del árbol y 13 bits que pasan a la dirección física sin modificación. Se soportan los bits de permiso completo de lectura/escritura/ejecución.

MIPSEdit

La arquitectura MIPS soporta de una a 64 entradas en el TLB. El número de entradas del TLB es configurable en la configuración de la CPU antes de la síntesis. Las entradas de la TLB son duales. Cada entrada de la TLB asigna un número de página virtual (VPN2) a uno de los dos números de marco de página (PFN0 o PFN1), dependiendo del bit menos significativo de la dirección virtual que no forma parte de la máscara de página. Este bit y los bits de la máscara de página no se almacenan en el VPN2. Cada entrada de la TLB tiene su propio tamaño de página, que puede ser cualquier valor entre 1 KB y 256 MB en múltiplos de cuatro. Cada PFN en una entrada de la TLB tiene un atributo de caché, un dirty y un bit de estado válido. Un VPN2 tiene un bit de estado global y un ID asignado por el sistema operativo que participa en la coincidencia de la entrada de la TLB de la dirección virtual, si el bit de estado global está a cero. Un PFN almacena la dirección física sin los bits de máscara de página.

Se genera una excepción de rellenado de la TLB cuando no hay entradas en la TLB que coincidan con la dirección virtual mapeada. Se genera una excepción de TLB inválida cuando hay una coincidencia pero la entrada está marcada como inválida. Una excepción de modificación de la TLB se genera cuando una instrucción de almacenamiento hace referencia a una dirección mapeada y el estado de suciedad de la entrada que coincide no está establecido. Si se produce una excepción TLB al procesar una excepción TLB, una excepción TLB de doble fallo, se envía a su propio manejador de excepciones.

MIPS32 y MIPS32r2 soportan 32 bits de espacio de direcciones virtuales y hasta 36 bits de espacio de direcciones físicas. MIPS64 admite hasta 64 bits de espacio de direcciones virtuales y hasta 59 bits de espacio de direcciones físicas.

Sun 1Edit

El Sun 1 original es un ordenador de placa única construido en torno al microprocesador Motorola 68000 e introducido en 1982. Incluye la unidad de gestión de memoria original de Sun 1 que proporciona traducción de direcciones, protección de memoria, compartición de memoria y asignación de memoria para múltiples procesos que se ejecutan en la CPU. Todo el acceso de la CPU a la RAM privada de la placa, a la memoria externa Multibus, a la E/S de la placa y a la E/S Multibus pasa por la MMU, donde la traducción de direcciones y la protección se realizan de manera uniforme. La MMU se implementa en hardware en la placa de la CPU.

La MMU consta de un registro de contexto, un mapa de segmentos y un mapa de páginas. Las direcciones virtuales de la CPU son traducidas a direcciones intermedias por el mapa de segmentos, que a su vez son traducidas a direcciones físicas por el mapa de páginas. El tamaño de la página es de 2 KB y el tamaño del segmento es de 32 KB, lo que da 16 páginas por segmento. Se pueden mapear hasta 16 contextos simultáneamente. El espacio máximo de direcciones lógicas para un contexto es de 1024 páginas o 2 MB. La dirección física máxima que se puede mapear simultáneamente es también de 2 MB.

El registro de contexto es importante en un sistema operativo multitarea porque permite a la CPU cambiar entre procesos sin recargar toda la información del estado de traducción. El registro de contexto de 4 bits puede cambiar entre 16 secciones del mapa de segmentos bajo el control del supervisor, lo que permite mapear 16 contextos simultáneamente. Cada contexto tiene su propio espacio de direcciones virtuales. Se puede compartir el espacio de direcciones virtuales y las comunicaciones entre contextos escribiendo los mismos valores en los mapas de segmentos o páginas de diferentes contextos. Se pueden manejar contextos adicionales tratando el mapa de segmentos como una caché de contextos y reemplazando los contextos obsoletos sobre la base del uso menos reciente.

El registro de contexto no hace distinción entre los estados de usuario y de supervisor. Las interrupciones y las trampas no cambian de contexto, lo que requiere que todos los vectores de interrupción válidos se mapeen siempre en la página 0 del contexto, así como la pila válida del supervisor.

PowerPCEdit

En PowerPC G1, G2, G3 y G4 las páginas son normalmente de 4 KB. Después de un fallo en la TLB, la MMU estándar de PowerPC comienza dos búsquedas simultáneas. Una búsqueda intenta hacer coincidir la dirección con uno de los cuatro u ocho registros de traducción de direcciones de bloques de datos (DBAT), o cuatro u ocho registros de traducción de direcciones de bloques de instrucciones (IBAT), según corresponda. Los registros BAT pueden mapear trozos lineales de memoria de hasta 256 MB, y normalmente son utilizados por un SO para mapear grandes porciones del espacio de direcciones para el propio uso del kernel del SO. Si la búsqueda en el BAT tiene éxito, la otra búsqueda se detiene y se ignora.

La otra búsqueda, no soportada directamente por todos los procesadores de esta familia, es a través de la llamada «tabla de páginas invertida», que actúa como una extensión fuera del chip del TLB. En primer lugar, los cuatro primeros bits de la dirección se utilizan para seleccionar uno de los 16 registros de segmento. A continuación, los 24 bits del registro de segmento sustituyen a esos cuatro bits, produciendo una dirección de 52 bits. El uso de los registros de segmento permite que varios procesos compartan la misma tabla hash.

La dirección de 52 bits se convierte en hash y luego se utiliza como índice en la tabla fuera del chip. Allí, se explora un grupo de entradas de la tabla de ocho páginas en busca de una que coincida. Si ninguna coincide debido a un exceso de colisiones de hash, el procesador lo intenta de nuevo con una función de hash ligeramente diferente. Si esto también falla, la CPU atrapa al SO (con la MMU deshabilitada) para que el problema pueda ser resuelto. El SO necesita descartar una entrada de la tabla hash para hacer espacio para una nueva entrada. El SO puede generar la nueva entrada a partir de una tabla de páginas más normal en forma de árbol o a partir de estructuras de datos por mapeo que probablemente sean más lentas y más eficientes en términos de espacio. El soporte para el control de no-ejecución está en los registros de segmento, lo que lleva a una granularidad de 256 MB.

Un problema importante con este diseño es la pobre localidad de la caché causada por la función hash. Los diseños basados en árboles evitan esto colocando las entradas de la tabla de páginas para páginas adyacentes en ubicaciones adyacentes. Un sistema operativo que se ejecute en el PowerPC puede minimizar el tamaño de la tabla hash para reducir este problema.

También es algo lento eliminar las entradas de la tabla de páginas de un proceso. El SO puede evitar la reutilización de los valores de los segmentos para retrasar el enfrentarse a esto, o puede elegir sufrir el desperdicio de memoria asociado a las tablas hash por proceso. Los chips G1 no buscan las entradas de la tabla de páginas, pero generan el hash, con la expectativa de que un SO busque la tabla hash estándar a través del software. El SO puede escribir en la TLB. Los chips G2, G3 y los primeros G4 utilizan hardware para buscar en la tabla hash. Los últimos chips permiten al SO elegir cualquiera de los dos métodos. En los chips que hacen esto opcional o no lo soportan en absoluto, el SO puede elegir usar una tabla de páginas basada en árbol exclusivamente.

IA-32 / x86Edit

La arquitectura x86 ha evolucionado durante mucho tiempo manteniendo la compatibilidad total del software, incluso para el código del SO. Así, la MMU es extremadamente compleja, con muchos modos de funcionamiento posibles. Aquí se describe el funcionamiento normal de la CPU tradicional 80386 y sus sucesores (IA-32).

La CPU divide principalmente la memoria en páginas de 4 KB. Los registros de segmento, fundamentales en los antiguos diseños de la MMU del 8088 y 80286, no se utilizan en los SO modernos, con una excepción importante: el acceso a los datos específicos de los hilos de las aplicaciones o a los datos específicos de la CPU para los kernels del SO, que se realiza con el uso explícito de los registros de segmento FS y GS. Todo acceso a la memoria implica un registro de segmento, elegido en función del código que se está ejecutando. El registro de segmento actúa como un índice en una tabla, que proporciona un desplazamiento que se añade a la dirección virtual. Excepto cuando se utiliza FS o GS, el SO asegura que el desplazamiento será cero.

Después de añadir el desplazamiento, la dirección se enmascara para que no sea mayor de 32 bits. El resultado puede buscarse a través de una tabla de páginas con estructura de árbol, con los bits de la dirección divididos de la siguiente manera: 10 bits para la rama del árbol, 10 bits para las hojas de la rama, y los 12 bits más bajos se copian directamente al resultado. Algunos sistemas operativos, como OpenBSD con su función W^X, y Linux con los parches Exec Shield o PaX, también pueden limitar la longitud del segmento de código, según lo especificado por el registro CS, para no permitir la ejecución de código en regiones modificables del espacio de direcciones.

Las revisiones menores de la MMU introducidas con el Pentium han permitido páginas muy grandes de 4 MB saltando el nivel inferior del árbol (esto deja 10 bits para indexar el primer nivel de la jerarquía de páginas con los 10+12 bits restantes copiados directamente al resultado). Las revisiones menores de la MMU introducidas con el Pentium Pro introdujeron la característica de extensión de la dirección física (PAE), permitiendo direcciones físicas de 36 bits con 2+9+9 bits para las tablas de páginas de tres niveles y 12 bits más bajos que se copian directamente al resultado. También se puede disponer de páginas grandes (2 MB) saltando el nivel inferior del árbol (resultando 2+9 bits para la jerarquía de tablas de dos niveles y los restantes 9+12 bits más bajos copiados directamente). Además, la tabla de atributos de página permitía especificar la capacidad de caché buscando unos pocos bits altos en una pequeña tabla en la CPU.

El soporte para no ejecutar sólo se proporcionaba originalmente por segmentos, lo que hacía muy difícil su uso. Los chips x86 más recientes proporcionan un bit de no ejecución por página en el modo PAE. Los mecanismos W^X, Exec Shield y PaX descritos anteriormente emulan el soporte de no ejecución por página en los procesadores x86 que carecen del bit NX fijando la longitud del segmento de código, con una pérdida de rendimiento y una reducción del espacio de direcciones disponible.

x86-64Edit

Heterogeneous System Architecture (HSA) crea un espacio de direcciones virtual unificado para CPUs, GPUs y DSPs, obviando los trucos de mapeo y copia de datos.

x86-64 es una extensión de 64 bits de x86 que elimina casi por completo la segmentación en favor del modelo de memoria plana utilizado por casi todos los sistemas operativos para los procesadores 386 o más recientes. En modo largo, se ignoran todos los desplazamientos de segmento, excepto los segmentos FS y GS. Cuando se utiliza con páginas de 4 KB, el árbol de la tabla de páginas tiene cuatro niveles en lugar de tres.

Las direcciones virtuales se dividen de la siguiente manera: 16 bits sin usar, nueve bits para cada uno de los cuatro niveles del árbol (para un total de 36 bits), y los 12 bits más bajos copiados directamente al resultado. Con páginas de 2 MB, sólo hay tres niveles de tabla de páginas, para un total de 27 bits utilizados en la paginación y 21 bits de desplazamiento. Algunas CPUs más nuevas también soportan una página de 1 GB con dos niveles de paginación y 30 bits de offset.

CPUID puede utilizarse para determinar si se soportan páginas de 1 GB. En los tres casos, se requiere que los 16 bits más altos sean iguales al bit 48, o en otras palabras, los 48 bits bajos se extienden con signo a los bits más altos. Esto se hace para permitir una futura expansión del rango direccionable, sin comprometer la compatibilidad hacia atrás. En todos los niveles de la tabla de páginas, la entrada de la tabla de páginas incluye un bit de no ejecución.

Unisys MCP Systems (Burroughs B5000)Edit

Esta sección puede ser confusa o poco clara para los lectores. Por favor, ayude a aclarar la sección. Puede haber una discusión sobre esto en la página de discusión. (Septiembre de 2020) (Aprende cómo y cuándo eliminar este mensaje de la plantilla)

El Burroughs B5000 de 1961 fue el primer sistema comercial que soportó la memoria virtual (después del Atlas), aunque no tiene MMU Proporciona las dos funciones de una MMU -direcciones de memoria virtual y protección de la memoria- con un enfoque arquitectónico diferente.

En primer lugar, en el mapeo de las direcciones de memoria virtual, en lugar de necesitar una MMU, los sistemas MCP se basan en descriptores. Cada bloque de memoria asignado recibe un descriptor maestro con las propiedades del bloque (es decir, el tamaño, la dirección y si está presente en la memoria). Cuando se hace una petición para acceder al bloque para leer o escribir, el hardware comprueba su presencia a través del bit de presencia (pbit) en el descriptor.

Un pbit de 1 indica la presencia del bloque. En este caso, se puede acceder al bloque a través de la dirección física del descriptor. Si el pbit es cero, se genera una interrupción para que el MCP (sistema operativo) haga presente el bloque. Si el campo de dirección es cero, se trata del primer acceso a este bloque, y se asigna (un pbit init). Si el campo de dirección es distinto de cero, se trata de una dirección de disco del bloque, que ha sido previamente desplegada, por lo que el bloque se obtiene del disco y el pbit se pone a uno y la dirección de memoria física se actualiza para apuntar al bloque en memoria (otro pbit). Esto hace que los descriptores sean equivalentes a una entrada de tabla de páginas en un sistema MMU. El rendimiento del sistema puede controlarse a través del número de pbits. Los pbits de inicio indican las asignaciones iniciales, pero un alto nivel de otros pbits indica que el sistema puede estar haciendo thrashing.

Toda la asignación de memoria es, por tanto, completamente automática (una de las características de los sistemas modernos) y no hay otra forma de asignar bloques que este mecanismo. No hay llamadas como malloc o dealloc, ya que los bloques de memoria también se descartan automáticamente. El esquema también es perezoso, ya que un bloque no se asignará hasta que sea realmente referenciado. Cuando la memoria está casi llena, el MCP examina el conjunto de trabajo, intentando la compactación (ya que el sistema está segmentado, no paginado), desasignando segmentos de sólo lectura (como los segmentos de código que pueden ser restaurados desde su copia original) y, como último recurso, rodando los segmentos de datos sucios al disco.

Otra forma en que el B5000 proporciona una función de una MMU es en la protección. Dado que todos los accesos son a través del descriptor, el hardware puede comprobar que todos los accesos están dentro de los límites y, en el caso de una escritura, que el proceso tiene permiso de escritura. El sistema MCP es intrínsecamente seguro y, por tanto, no necesita una MMU para proporcionar este nivel de protección de la memoria. Los descriptores son de sólo lectura para los procesos de usuario y sólo pueden ser actualizados por el sistema (hardware o MCP). (Las palabras cuya etiqueta es un número impar son de sólo lectura; los descriptores tienen una etiqueta de 5 y las palabras de código tienen una etiqueta de 3.)

Los bloques pueden ser compartidos entre procesos a través de descriptores de copia en la pila de procesos. Así, algunos procesos pueden tener permiso de escritura, mientras que otros no. Un segmento de código es de sólo lectura, por lo tanto reentrante y compartido entre procesos. Los descriptores de copia contienen un campo de dirección de 20 bits que da el índice del descriptor maestro en la matriz de descriptores maestros. Esto también implementa un mecanismo IPC muy eficiente y seguro. Los bloques pueden ser fácilmente reubicados, ya que sólo es necesario actualizar el descriptor maestro cuando el estado de un bloque cambia.

El único otro aspecto es el rendimiento – ¿los sistemas basados en MMU o no basados en MMU proporcionan un mejor rendimiento? Los sistemas MCP pueden implementarse sobre hardware estándar que sí tiene una MMU (por ejemplo, un PC estándar). Incluso si la implementación del sistema utiliza la MMU de alguna manera, esto no será en absoluto visible a nivel de MCP.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.