Articulo de referencia

Unidad de gestión de memoria

Una MMU 68451 , que podría usarse con el Motorola 68010. MMU VLSI VI475 de Apple, procedente del Macintosh II, utilizada con el Motorola 68020. Una unidad de administración de m...

Una MMU 68451 , que podría usarse con el Motorola 68010.
MMU VLSI VI475 de Apple, procedente del Macintosh II, utilizada con el Motorola 68020.

Una unidad de administración de memoria ( MMU ), a veces llamada unidad de administración de memoria paginada ( PMMU ), [ 1 ] es una unidad de hardware de computadora que examina todas las referencias a la memoria y traduce las direcciones de memoria a las que se hace referencia, conocidas como direcciones de memoria virtual , en direcciones físicas en la memoria principal .

En los sistemas modernos, los programas suelen tener direcciones que acceden a la memoria máxima teórica de la arquitectura del ordenador , de 32 o 64  bits. La MMU asigna las direcciones de cada programa a áreas separadas de la memoria física, que generalmente es mucho menor que la memoria máxima teórica. Esto es posible porque los programas rara vez utilizan grandes cantidades de memoria simultáneamente.

La mayoría de los sistemas operativos modernos (SO) trabajan en conjunto con una MMU para brindar soporte de memoria virtual (VM). La MMU rastrea el uso de memoria en bloques de tamaño fijo conocidos como páginas . Si un programa se refiere a una ubicación en una página que no está en la memoria física, la MMU envía una interrupción al sistema operativo . El SO selecciona un bloque menos utilizado en la memoria, lo escribe en el almacenamiento de respaldo, como un disco duro, si ha sido modificado desde que se leyó, lee la página del almacenamiento de respaldo en ese bloque y configura la MMU para mapear el bloque a la página solicitada originalmente para que el programa pueda usarla. Esto se conoce como paginación por demanda . Algunos sistemas operativos en tiempo real más simples no admiten memoria virtual y no necesitan una MMU, pero aún necesitan una unidad de protección de memoria de hardware .

Las unidades de gestión de memoria (MMU) generalmente proporcionan protección de memoria para bloquear los intentos de un programa de acceder a memoria que no ha solicitado previamente, lo que impide que un programa malicioso o que se comporta de forma incorrecta modifique o lea datos pertenecientes a otro programa.

En algunos diseños de microprocesadores antiguos, la gestión de memoria se realizaba mediante un circuito integrado independiente , como el VLSI Technology VI475 (1986), el Motorola 68851 (1984) utilizado con la CPU Motorola 68020 en el Macintosh II , o el Z8010 [ 2 ] y el Z8015 (1985) [ 3 ] [ 4 ] utilizados con la familia de procesadores Zilog Z8000 . Los microprocesadores posteriores (como el Motorola 68030 y el Zilog Z280 ) colocaron la MMU junto con la CPU en el mismo circuito integrado, al igual que el Intel 80286 y los microprocesadores x86 posteriores .

Algunos sistemas antiguos, especialmente los de 8 bits , utilizaban unidades de gestión de memoria (MMU) muy sencillas para realizar la conmutación de bancos de memoria .

Tipos de traducción de direcciones

Los primeros sistemas utilizaban direccionamiento base y de límites, que posteriormente evolucionó hacia la segmentación , o bien empleaban un conjunto fijo de bloques en lugar de cargarlos bajo demanda. La diferencia entre estos dos enfoques radica en el tamaño del bloque contiguo de memoria; los sistemas paginados dividen la memoria principal en una serie de bloques de igual tamaño, mientras que los sistemas segmentados generalmente permiten tamaños variables. [ 5 ]

Traducción segmentada

En la traducción segmentada, una dirección de memoria contiene un número de segmento y un desplazamiento dentro del segmento. Los segmentos son de longitud variable y pueden tener permisos asociados, como lectura, escritura y ejecución. [ 6 ] Un segmento se carga en un área contigua de memoria física. Normalmente, el número de segmento se utiliza como índice en una tabla de segmentos ; cada entrada en la tabla de segmentos contiene la dirección del área de memoria física, la longitud del segmento y otra información, como indicadores de permisos.

Este estilo tiene la ventaja de la simplicidad; los bloques de memoria son continuos y, por lo tanto, solo es necesario almacenar los dos valores, base y límite, para fines de mapeo.

La desventaja de este enfoque es que produce un efecto conocido como fragmentación externa . Esto ocurre cuando se liberan asignaciones de memoria, pero estas no son contiguas. En este caso, puede haber suficiente memoria disponible para atender una solicitud, pero esta se encuentra dispersa y no puede asignarse a un único segmento. En sistemas donde los programas se inician y finalizan periódicamente, esto puede provocar una alta fragmentación de la memoria, sin que queden grandes bloques; en tal caso, sería necesario mover segmentos en la memoria y modificar sus entradas en la tabla de segmentos para reflejar la nueva dirección física, a fin de crear un espacio contiguo lo suficientemente grande para un segmento.

Algunos modelos del miniordenador PDP-11 de 16 bits cuentan con una unidad de gestión de memoria segmentada con un conjunto de registros de direcciones de página (PAR) y registros de descripción de página (PDR); esto asigna una dirección virtual de 16 bits a una dirección física de 18 bits. El PDP-11/70 amplía esta asignación para generar una dirección física de 22 bits. [ 7 ]

La segmentación se utilizó ampliamente en las plataformas de microcomputadoras de la década de 1980. Entre las MMU que utilizaron este concepto se encontraban la Motorola 68451 [ 5 ] y la Zilog Z8010 , pero existen muchos otros ejemplos.

Los procesadores Intel 8086 , Intel 8088 , Intel 80186 e Intel 80188 ofrecen una segmentación de memoria básica y carecen de protección de memoria . (Cada byte de cada segmento está siempre disponible para cualquier programa). Los registros de segmento de 16 bits permiten 65.536 segmentos; cada segmento comienza en un desplazamiento fijo igual a 16 veces el número de segmento; la granularidad de la dirección de inicio del segmento es de 16 bytes. Cada segmento otorga acceso de lectura y escritura a 64  KiB (65.536 bytes) de espacio de direcciones (este límite lo establecen los registros PC y SP de 16 bits; el procesador no realiza comprobaciones de límites). El desplazamiento + dirección que exceda 0xFFFFF se reinicia a 0x00000. Cada  segmento de 64 KiB se superpone a los siguientes 4.095 segmentos; cada dirección física puede denotarse mediante 4.096 pares segmento-desplazamiento. Este esquema solo puede direccionar 1  MiB (1024  KiB) de memoria física (y E/S mapeadas en memoria). ( El hardware de memoria expandida opcional puede agregar memoria conmutada por bancos bajo control de software). Los procesadores x86 posteriores , comenzando con el Intel 80286 , admitieron el mapeo segmentado real, con una tabla de segmentos.

Traducción paginada

Esquema del funcionamiento de una MMU [ 8 ] : 186 y ss.

En la traducción paginada, el espacio de direcciones (el rango de direcciones utilizado por el procesador) se divide en páginas , cada una con un tamaño que es una potencia de 2, generalmente unos pocos kilobytes , aunque pueden ser mucho mayores. Los programas hacen referencia a la memoria utilizando el tamaño de dirección natural de la máquina, típicamente 32 o 64 bits en los sistemas modernos. Los bits inferiores de la dirección (el desplazamiento dentro de una página) permanecen sin cambios. Los bits superiores de la dirección son los números de página virtuales. [ 9 ]

La mayoría de las MMU utilizan una tabla de elementos en memoria denominada tabla de páginas , que contiene una entrada de tabla de páginas (PTE) por página virtual, para asignar números de página virtuales a números de página físicos en la memoria principal. A menudo se utilizan tablas de páginas multinivel para reducir el tamaño de la tabla de páginas. Una caché asociativa de PTE se denomina búfer de traducción anticipada (TLB) y se utiliza para evitar la necesidad de acceder a la memoria principal cada vez que se asigna una dirección virtual. [ 5 ]

Otras MMU pueden tener una matriz privada de memoria, [ 10 ] un conjunto de registros, [ 11 ] o una matriz de uno o más niveles de RAM estática [ 12 ] para almacenar un conjunto de información de mapeo.

La MMU divide la dirección virtual en un número de página virtual y un desplazamiento dentro de la página. El número de página virtual se utiliza para seleccionar una entrada de la tabla de páginas; si se encuentra la entrada y la página está marcada como en memoria, el número de página física de la entrada se combina con el desplazamiento para construir la dirección física correspondiente a la dirección virtual. [ 9 ]

El número de página virtual puede utilizarse directamente como índice en la tabla de páginas u otra información de mapeo, o puede dividirse aún más, utilizando bits de un nivel determinado como índice en una tabla de tablas de nivel inferior en la que los bits del siguiente nivel inferior se utilizan como índice, con dos o más niveles de indexación.

Un problema con la traducción paginada es que, a medida que se expande el espacio de direcciones virtuales, también aumenta la cantidad de memoria necesaria para almacenar la asignación. Por ejemplo, en el 68020 las direcciones tienen 32 bits de ancho, lo que significa que el número de página virtual para un  tamaño de página de 8 kB son los 19 bits superiores de la dirección, y una tabla de páginas de un solo nivel tendría  un tamaño de 512 kB. [ 5 ] En la década de 1980, para una tabla de páginas en memoria, esto podría ser una fracción significativa de la memoria principal de la máquina y, para una MMU que almacena el mapa de páginas en RAM estática, podría requerir una cantidad costosa de RAM estática. Este problema se puede reducir aumentando el tamaño de las páginas, por ejemplo, a 64  kB en lugar de 8. Ahora el índice de página usa 16 bits y la tabla de páginas resultante es de 64  kB, lo que es más manejable. Pasar a un tamaño de página mayor conlleva el segundo problema: mayor fragmentación interna. A un programa que genera una serie de solicitudes de bloques pequeños se le asignarán bloques grandes y, por lo tanto, desperdiciará grandes cantidades de memoria. [ 5 ]

Si el espacio de direcciones es disperso, de modo que no se asignan todas sus regiones, el problema puede reducirse utilizando una tabla de páginas multinivel o un mapa de RAM estático, y no asignando todas las entradas de la tabla de páginas que serían necesarias para una región vacía.

El método de traducción paginada fue ampliamente utilizado por las MMU de microprocesadores en las décadas de 1970 y 1980, incluyendo la 68851 de la serie 68020 y la MMU integrada en el chip de la 68030 , la Z8015 del Zilog Z8000 y la NS16082 de la serie NS32000 .

Una entrada de tabla de páginas u otra información por página también puede incluir información sobre si se ha escrito en la página (el bit de modificación ), cuándo se usó por última vez (el bit de acceso , para un algoritmo de reemplazo de páginas menos usadas recientemente (LRU) ), qué tipo de procesos ( modo usuario o modo supervisor ) pueden leerla y escribirla, y si debe almacenarse en caché . [ 13 ]

En ocasiones, una entrada de la tabla de páginas u otra información por página prohíbe el acceso a una página virtual específica, quizás porque no se ha asignado memoria de acceso aleatorio (RAM) física a dicha página virtual. En este caso, la MMU señala un fallo de página a la CPU. El sistema operativo (SO) gestiona entonces la situación, posiblemente intentando encontrar un marco de RAM libre y configurando el mapa de páginas para asignarlo a la dirección virtual solicitada. Si no hay RAM libre, puede ser necesario elegir una página existente (conocida como víctima ), utilizando algún algoritmo de reemplazo , y guardarla en el disco (un proceso denominado paginación ). En algunas MMU, también puede haber escasez de PTE, en cuyo caso el SO tendrá que liberar una para la nueva asignación. [ 13 ] [ 9 ]

La MMU también puede generar errores de acceso ilegal o fallos de página no válidos ante accesos a memoria ilegales o inexistentes, respectivamente, lo que provoca fallos de segmentación o errores de bus cuando el sistema operativo los gestiona.

La paginación mitiga el problema de la fragmentación externa de la memoria. Después de que se asignan y liberan bloques de memoria, la memoria libre puede fragmentarse (discontinuarse), de modo que el bloque contiguo más grande de memoria libre puede ser mucho menor que la cantidad total. Con la memoria virtual, un rango contiguo de direcciones virtuales se puede asignar a varios bloques no contiguos de memoria física; esta asignación no contigua es una de las ventajas de la paginación . [ 13 ] [ 9 ]

Sin embargo, la traducción paginada causa otro problema: la fragmentación interna . Esto ocurre cuando un programa solicita un bloque de memoria que no se asigna correctamente a una página; por ejemplo, si un programa solicita un  búfer de 1 KB para realizar operaciones con archivos. En este caso, la solicitud resulta en que se reserve una página completa, aunque solo  se utilice 1 KB de ella; si las páginas son mayores de 1  KB, el resto se desperdicia. Si se realizan muchas asignaciones pequeñas de este tipo, la memoria puede agotarse aunque gran parte de ella permanezca vacía. [ 5 ]

Segmentación más paginación

Algunos sistemas, como el GE 645 y sus sucesores, utilizaban tanto segmentación como paginación. La tabla de segmentos, en lugar de contener entradas individuales para cada segmento que indiquen la dirección base física y la longitud del segmento, contiene entradas que indican la dirección base física de una tabla de páginas para dicho segmento, además de su longitud. La memoria física se divide en páginas de tamaño fijo, y se emplean las mismas técnicas utilizadas para la paginación por demanda basada exclusivamente en páginas que para la paginación por demanda basada en segmentos y páginas.

La MMU Signetics 68905, diseñada para los microprocesadores Motorola 68000 , 68010 y 68012 , admitía segmentación y paginación. [ 14 ] Tanto Signetics como Philips produjeron una versión del 68000 que combinaba la 68905 en el mismo chip físico que el procesador, el 68070. [ 5 ]

Beneficios

Una MMU puede proporcionar protección de memoria , de modo que los intentos del código de acceder o modificar datos a los que no tiene acceso resultan en un fallo; esto detecta tanto errores de software como intentos deliberados de acceder o modificar esos datos. Normalmente, un sistema operativo asigna a cada programa su propio espacio de direcciones virtuales. [ 9 ]

Una MMU también puede utilizarse para ampliar el tamaño de la dirección física cuando la dirección virtual es demasiado pequeña. Por ejemplo, el PDP-11 originalmente tenía una dirección de 16 bits, lo que la hacía demasiado pequeña a medida que aumentaba el tamaño de la memoria en la década de 1970. Esto se solucionó ampliando el bus de memoria física a 18 bits y utilizando una MMU para añadir dos bits más, basándose en otros pines del bus del procesador, para indicar qué programa accedía a la memoria. [ 15 ]

Algunas MMU, como la Signetics 68905, también incluían un controlador para administrar una caché del procesador , que almacena los datos accedidos recientemente en una memoria muy rápida y, por lo tanto, reduce la necesidad de comunicarse con la memoria principal, que es más lenta. [ 14 ] En algunas implementaciones, las MMU también son responsables de la arbitraje del bus , controlando el acceso al bus de memoria entre las diversas partes del ordenador que desean acceder a él.

Unidades de Gestión de Operaciones Interinstitucionales (IOMMU)

El hardware que realiza acceso directo a memoria omite por completo la MMU de la CPU. Algunos sistemas de E/S permiten que el hardware DMA utilice direcciones físicas para leer o escribir directamente en cualquier lugar de la RAM física sin restricciones. Otros sistemas de E/S cuentan con una MMU independiente, denominada unidad de gestión de memoria de entrada/salida (IOMMU), que el sistema operativo puede programar para traducir las direcciones de los dispositivos del hardware DMA a páginas físicas específicas y limitadas, elegidas por el sistema operativo. La IOMMU puede utilizarse para bloquear ataques DMA .

Ejemplos

La mayoría de los sistemas modernos dividen la memoria en páginas de entre 4 y 64 KB , a menudo con la capacidad de usar páginas gigantes de 2 MB o 1 GB (frecuentemente ambas variantes son posibles). Las traducciones de página se almacenan en caché en un búfer de traducción anticipada (TLB). Algunos sistemas, principalmente los diseños RISC más antiguos , entran en el sistema operativo cuando no encuentran una traducción de página en el TLB. La mayoría de los sistemas utilizan un recorrido de árbol basado en hardware. La mayoría de los sistemas permiten deshabilitar la MMU, pero algunos la deshabilitan al entrar en el código del sistema operativo.

IBM System/360 Modelo 67, IBM System/370 y sus sucesores

El IBM System/360 Modelo 67 , presentado en agosto de 1965, incluía una MMU denominada caja de traducción dinámica de direcciones (DAT). [ 16 ] [ 17 ] Posee la peculiaridad de almacenar los bits de acceso y modificación fuera de la tabla de páginas (junto con la clave de protección de cuatro bits para todos los procesadores S/360). Estos bits hacen referencia a la memoria física en lugar de la memoria virtual, y se accede a ellos mediante instrucciones especiales. [ 17 ] Esto reduce la sobrecarga del sistema operativo, que de otro modo tendría que propagar los bits de acceso y modificación desde las tablas de páginas a una estructura de datos más orientada a la memoria física. Esto facilita la virtualización a nivel del sistema operativo , posteriormente denominada paravirtualización .

A partir de agosto de 1972, el IBM System/370 incorporó una MMU similar, aunque inicialmente solo admitía un espacio de direcciones virtuales de 24 bits en lugar del espacio de direcciones virtuales de 32 bits del System/360 Modelo 67. Además, almacenaba los bits de acceso y modificación 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 un espacio de direcciones también ampliado a 64 bits; estas arquitecturas continúan almacenando los bits de acceso y modificación fuera de la tabla de páginas.

VAX

Las páginas VAX son de 512 bytes, [ 18 ] : 199 , lo cual es muy pequeño. Un sistema operativo puede tratar varias páginas como si fueran una sola página más grande. Por ejemplo, Linux en VAX agrupa ocho páginas. Por lo tanto, el sistema se considera que tiene 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: [ 18 ] : 200–201

espacio P0
Se utiliza para la memoria por proceso de propósito general, como por ejemplo los montones.
Espacio P1
(O espacio de control) que también es por proceso y se utiliza normalmente para las pilas de supervisor, ejecutivo, núcleo , 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 código y datos del sistema operativo, estén paginados o no, incluidas las tablas de paginación.
Espacio S1
Que no se utiliza y está "Reservado para lo digital ". [ 18 ] : 200–201

Las tablas de páginas son grandes matrices lineales. [ 18 ] : 209–215 Normalmente, esto sería muy derrochador cuando las direcciones se usan en ambos extremos del rango posible, pero las tablas de páginas para el espacio P0 y P1 se almacenan en el espacio paginado S0. [ 18 ] : 211–212 Por lo tanto, hay efectivamente un árbol de dos niveles , lo que permite a las aplicaciones tener un diseño de memoria dispersa sin desperdiciar mucho espacio en entradas de tabla de páginas no utilizadas. A diferencia de las entradas de tabla de páginas en la mayoría de las MMU, las entradas de tabla de páginas en la MMU VAX carecen de un bit de acceso . [ 18 ] : 203–205 Los sistemas operativos que implementan la paginación deben encontrar alguna forma de emular el bit de acceso para que puedan operar de manera eficiente. Normalmente, el sistema operativo desasignará periódicamente las páginas para que las fallas de página no presente se puedan usar para permitir que el sistema operativo establezca un bit de acceso.

BRAZO

Los procesadores de aplicaciones basados ​​en la arquitectura ARM implementan una MMU definida por la arquitectura del sistema de memoria virtual (VMSA) de ARM. La arquitectura actual define PTE 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 pequeña de 1 KB . ARM utiliza una tabla de páginas de dos niveles si se usan páginas de 4 KB y 64 KB , o una tabla de páginas de un solo nivel para secciones de 1 MB y 16 MB .

Las actualizaciones de la TLB se realizan automáticamente mediante el hardware de recorrido de la tabla de páginas. Las PTE incluyen permisos de acceso de lectura/escritura basados ​​en privilegios, información de capacidad de caché, un bit NX y un bit no seguro. [ 19 ]

Alfa DEC

Los procesadores DEC Alpha dividen la memoria en 8 KB , 16 KB , 32 KB o 64 KB ; el tamaño de página depende del procesador. [ 20 ] : 3–2 [ 21 ] : 3–2 páginas. Después de un fallo de TLB, el código máquina de firmware de bajo nivel (aquí llamado PALcode ) recorre una tabla de páginas.

El código PAL de OpenVMS AXP y el código PAL de DEC OSF/1 recorren una tabla de páginas estructurada en árbol de tres niveles. Las direcciones se dividen en un conjunto de bits no utilizados (que contiene el mismo valor que el bit más alto del índice en el nivel raíz del árbol), un conjunto de bits para indexar el nivel raíz del árbol, un conjunto de bits para indexar el nivel medio del árbol, un conjunto de bits para indexar el nivel hoja del árbol y los bits restantes que pasan a la dirección física sin modificación, indexando un byte dentro de la página. Los tamaños de los campos dependen del tamaño de la página; los tres campos de índice del árbol tienen el mismo tamaño. [ 20 ] : 3-2–3-3 [ 21 ] : 3-1–3-2 El código PAL de OpenVMS AXP admite bits de permisos de lectura y escritura completos para los modos de usuario, supervisor, ejecutivo y kernel, y también admite fallos en los bits de lectura/escritura/ejecución. [ 20 ] : 3-3–3-6 El código PAL de DEC OSF/1 admite bits de permisos de lectura y escritura completos para los modos de usuario y kernel, y también admite fallos en los bits de lectura/escritura/ejecución. [ 21 ] : (II-B) 3-3-3-6

El código PAL de Windows NT AXP puede recorrer una tabla de páginas de un solo nivel en un espacio de direcciones virtuales o una tabla de páginas de dos niveles en un espacio de direcciones físicas. Los 32 bits superiores de una dirección se ignoran. Para una tabla de páginas de un solo nivel, las direcciones se dividen en un conjunto de bits para indexar la tabla de páginas y los bits restantes que pasan a la dirección física sin modificación, indexando un byte dentro de la página. Para una tabla de páginas de dos niveles, las direcciones se dividen en un conjunto de bits para indexar el nivel raíz del árbol, un conjunto de bits para indexar el nivel superior del árbol, un conjunto de bits para indexar el nivel hoja del árbol y los bits restantes que pasan a la dirección física sin modificación, indexando un byte dentro de la página. Los tamaños de los campos dependen del tamaño de la página. [ 22 ] : 3-2–3-4 El código PAL de Windows NT AXP admite que una página sea accesible solo desde el modo kernel o accesible desde el modo usuario y kernel, y también admite un bit de fallo en escritura. [ 22 ] : 3 - 5

MIPS

La arquitectura MIPS admite de una a 64 entradas en la TLB. El número de entradas de la 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 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 de 1 KB a 256 MB en múltiplos de cuatro. Cada PFN en una entrada de la TLB tiene un atributo de caché, un bit de estado de modificación y un bit de estado de validez. 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á establecido en cero. Un PFN almacena la dirección física sin los bits de la máscara de página.

Se genera una excepción de recarga de TLB cuando no hay entradas en la TLB que coincidan con la dirección virtual asignada. Se genera una excepción de TLB no válida cuando hay una coincidencia, pero la entrada está marcada como no válida. Se genera una excepción de TLB modificada cuando una instrucción de almacenamiento hace referencia a una dirección asignada y el estado de modificación de la entrada correspondiente no está establecido. Si se produce una excepción de TLB al procesar una excepción de TLB, una excepción de TLB de doble fallo, se envía a su propio controlador de excepciones .

MIPS32 y MIPS32r2 admiten 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.

Unidad de gestión de materiales (MMU) del Sol

El Sun-1 original es un ordenador de placa única basado en el microprocesador Motorola 68000 , presentado en 1982. Incluye la unidad de gestión de memoria (MMU) original del 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 integrada, la memoria Multibus externa, las E/S integradas y las E/S Multibus se realiza a través de la MMU, donde la traducción y la protección de direcciones se llevan a cabo de forma uniforme. La MMU está implementada 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. El mapa de segmentos traduce las direcciones virtuales de la CPU a direcciones intermedias, que a su vez son traducidas a direcciones físicas por el mapa de páginas. El tamaño de página es de 2 KB y el de segmento es de 32 KB , lo que da como resultado 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 también es de 2 MB .

El registro de contexto es importante en un sistema operativo multitarea porque permite a la CPU alternar entre procesos sin recargar toda la información del estado de traducción. El registro de contexto de 4 bits puede alternar 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. El espacio de direcciones virtuales compartido y la comunicación entre contextos se pueden proporcionar escribiendo los mismos valores en los mapas de segmentos o páginas de diferentes contextos. Se pueden gestionar contextos adicionales tratando el mapa de segmentos como una caché de contextos y reemplazando los contextos obsoletos según su uso menos reciente.

El registro de contexto no distingue entre estados de usuario y supervisor. Las interrupciones y trampas no cambian de contexto, lo que requiere que todos los vectores de interrupción válidos estén siempre mapeados en la página 0 del contexto, así como en la pila de supervisor válida. [ 23 ]

Las estaciones de trabajo Sun-2 son similares; están construidas alrededor del microprocesador Motorola 68010 y tienen una unidad de gestión de memoria similar, con páginas de 2 KB y segmentos de 32 KB . El registro de contexto tiene un contexto de sistema de 3 bits utilizado en el estado de supervisor y un contexto de usuario de 3 bits utilizado en el estado de usuario. [ 24 ]

Las estaciones de trabajo Sun-3 , a excepción de los modelos Sun-3/80, Sun-3/460, Sun-3/470 y Sun-3/480, están basadas en el Motorola 68020 y cuentan con una unidad de gestión de memoria similar. El tamaño de página se ha incrementado a 8 KB . (Los modelos posteriores están basados ​​en el Motorola 68030 y utilizan la MMU integrada de este chip).

Las estaciones de trabajo Sun-4 están construidas en torno a varios microprocesadores SPARC y cuentan con una unidad de gestión de memoria similar a la de las estaciones de trabajo Sun-3.

PowerPC

En PowerPC, las páginas G1, G2, G3 y G4 suelen tener un tamaño de 4 KB . Tras un fallo de la TLB, la MMU estándar de PowerPC inicia dos búsquedas simultáneas. Una de ellas 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 con cuatro u ocho registros de traducción de direcciones de bloques de instrucciones (IBAT), según corresponda. Los registros BAT pueden mapear bloques lineales de memoria de hasta 256 MB y, normalmente, el sistema operativo los utiliza para mapear grandes porciones del espacio de direcciones para su propio uso. Si la búsqueda en los registros BAT tiene éxito, la otra búsqueda se detiene y se ignora.

La otra búsqueda, no compatible directamente con todos los procesadores de esta familia, se realiza mediante una tabla de páginas invertida , que actúa como una extensión hash externa de la TLB. Primero, se utilizan los cuatro bits superiores de la dirección para seleccionar uno de los 16 registros de segmento . A continuación, 24 bits del registro de segmento reemplazan esos cuatro bits, generando una dirección de 52 bits. El uso de registros de segmento permite que varios procesos compartan la misma tabla hash .

La dirección de 52 bits se aplica una función hash y luego se usa como índice en la tabla externa. Allí, se escanea un grupo de ocho entradas de la tabla para encontrar una que coincida. Si ninguna coincide debido a colisiones de hash excesivas , el procesador lo intenta de nuevo con una función hash ligeramente diferente . Si esto también falla, la CPU entra en el sistema operativo (con la MMU deshabilitada) para que se pueda resolver el problema. El sistema operativo necesita descartar una entrada de la tabla hash para hacer espacio para una nueva entrada. El sistema operativo puede generar la nueva entrada a partir de una tabla de páginas más normal, similar a un árbol, o a partir de estructuras de datos por mapeo, que probablemente sean más lentas y más eficientes en cuanto a espacio. El soporte para el control de no ejecución está en los registros de segmento, lo que da como resultado una granularidad de 256 MB .

Un problema importante de este diseño es la escasa localidad de 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 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 sistema operativo puede evitar reutilizar los valores de segmento para retrasar esta tarea, o puede optar por asumir el desperdicio de memoria asociado con las tablas hash por proceso. Los chips G1 no buscan entradas en la tabla de páginas, pero sí generan el hash, con la expectativa de que el sistema operativo busque en la tabla hash estándar mediante software. El sistema operativo puede escribir en la TLB. Los chips G2, G3 y los primeros G4 utilizan hardware para buscar en la tabla hash. Los chips más recientes permiten que el sistema operativo elija cualquiera de los dos métodos. En los chips que hacen que esto sea opcional o no lo admiten en absoluto, el sistema operativo puede optar por utilizar exclusivamente una tabla de páginas basada en árbol.

x86

La arquitectura x86 ha evolucionado a lo largo de mucho tiempo manteniendo una compatibilidad total con el software, incluso con el código del sistema operativo. Por lo tanto, la MMU es extremadamente compleja, con muchos modos de funcionamiento posibles.

Los procesadores 8086/8088 y 80186/80188 no tienen unidad de gestión de memoria; admiten segmentación, pero solo para admitir más memoria física de la que puede admitir una dirección de 16 bits, ya que el número de segmento, en un registro de segmento, se multiplica por 16 y se suma al desplazamiento del segmento para generar una dirección física.

El 80286 añadió una MMU que admite segmentación, pero no paginación. Cuando la segmentación está habilitada al activar el modo protegido , el número de segmento actúa como un índice en una tabla de descriptores de segmento ; un descriptor de segmento contiene una dirección física base, una longitud de segmento, un bit de presencia para indicar si el segmento está actualmente en memoria, bits de permiso y bits de control. Si el desplazamiento en el segmento está dentro de los límites especificados por el descriptor de segmento, ese desplazamiento se suma a la dirección física base para generar una dirección física.

El 80386 , que introdujo la versión IA-32 de 32 bits de x86, y las CPU x86 posteriores, admiten segmentación y paginación. Si la paginación está habilitada, la dirección base en un descriptor de segmento es una dirección en un espacio de direcciones paginado lineal dividido en páginas de 4 KB , de modo que cuando se suma al desplazamiento en el segmento, la dirección resultante es una dirección lineal en ese espacio de direcciones; en IA-32, esa dirección se enmascara para que no sea mayor de 32 bits. El resultado se puede consultar a través de una tabla de páginas con estructura de árbol, donde los bits de la dirección se dividen de la siguiente manera: 10 bits para la rama del árbol, 10 bits para las hojas de la rama y los 12 bits menos significativos se copian directamente al resultado.

Los registros de segmento, utilizados en las CPU anteriores al 80386 para extender el espacio de direcciones, no se utilizan en los sistemas operativos modernos, con una excepción importante: el acceso a datos específicos de subprocesos para aplicaciones o datos específicos de la CPU para núcleos del sistema operativo, que se realiza mediante el uso explícito de los registros de segmento FS y GS. Todo acceso a memoria implica un registro de segmento, elegido según el código que se esté ejecutando. Excepto cuando se utilizan FS o GS, el sistema operativo garantiza que el desplazamiento sea cero. 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 impedir la ejecución de código en regiones modificables del espacio de direcciones.

Las revisiones menores de la MMU introducidas con el Pentium permitieron páginas muy grandes de 4 MB al omitir el nivel inferior del árbol (esto deja 10 bits para indexar el primer nivel de la jerarquía de páginas, y los 10+12 bits restantes se copian directamente al resultado). Las revisiones menores de la MMU introducidas con el Pentium Pro introdujeron la función de extensión de dirección física (PAE), que permite direcciones físicas de 36 bits con 2+9+9 bits para tablas de páginas de tres niveles y los 12 bits menos significativos se copian directamente al resultado. También se pueden obtener páginas grandes ( 2 MB ) al omitir el nivel inferior del árbol (lo que resulta en 2+9 bits para una jerarquía de tabla de dos niveles y los 9+12 bits menos significativos restantes se copian directamente). Además, la tabla de atributos de página permitió especificar la capacidad de caché consultando algunos bits altos en una pequeña tabla en la CPU.

La compatibilidad con la opción de no ejecución se proporcionaba originalmente solo por segmento, lo que dificultaba su uso. Los chips x86 más recientes ofrecen un bit NX (bit de no ejecución) por página en el modo PAE. Los mecanismos W^X , Exec Shield y PaX descritos anteriormente emulan la compatibilidad con la opción de no ejecución por página en máquinas con procesadores x86 que carecen del bit NX, al establecer la longitud del segmento de código, lo que conlleva una pérdida de rendimiento y una reducción del espacio de direcciones disponible.

La arquitectura de sistemas heterogéneos (HSA) crea un espacio de direcciones virtuales unificado para CPU, GPU y DSP, lo que deja obsoletos los trucos de mapeo y la copia de datos.

x86-64 , la versión de 64 bits de la arquitectura x86, 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 posteriores. En modo largo, se ignoran todos los desplazamientos de segmento, excepto los segmentos FS y GS; las direcciones lineales son de 64 bits en lugar de 32 bits, siendo significativos los 48 bits menos significativos de la dirección. Cuando se utiliza con páginas de 4 KB , el árbol de la tabla de páginas tiene cuatro niveles en lugar de tres, para manejar las direcciones lineales más grandes; en algunos procesadores x86-64 más recientes, se puede habilitar un quinto nivel de tabla de páginas para admitir direcciones lineales de 57 bits. En todos los niveles de la tabla de páginas, la entrada de la tabla de páginas incluye un bit NX.

Las direcciones lineales de 48 bits 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 menos significativos se copian directamente al resultado. Con páginas de 2 MB , solo 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 CPU más recientes también admiten una página de 1 GB con dos niveles de paginación y 30 bits de desplazamiento. [ 25 ] Se puede usar CPUID para determinar si se admiten páginas de 1 GB .

En los tres casos, los 16 bits más significativos deben ser iguales al bit número 48; es decir, los 48 bits menos significativos se extienden con signo a los bits más significativos. Esto se hace para permitir una mayor expansión del rango direccionable, sin comprometer la compatibilidad con versiones anteriores.

Las direcciones lineales de 57 bits se dividen de la siguiente manera: 7 bits sin usar, nueve bits para cada uno de los cinco niveles del árbol (para un total de 45 bits) y los 12 bits menos significativos se copian directamente al resultado. Los 57 bits menos significativos se extienden con signo. [ 26 ]

Alternativas

Sistemas Burroughs serie B5000, B6x00/B7x00/B5900/serie A/MCP de Unisys

El Burroughs B5000 de 1961 fue el primer sistema comercial en admitir memoria virtual (después del Atlas ), y no necesita una MMU externa. [ 27 ] El B5000 y sus sucesores hasta los sistemas Unisys ClearPath MCP (Libra) actuales proporcionan las dos funciones de una MMU —direcciones de memoria virtual y protección de memoria— con un enfoque arquitectónico diferente. En lugar de agregar memoria virtual a un procesador no diseñado para ello, está integrada en el diseño central del procesador/sistema, por lo que no se requiere una unidad externa para agregar funcionalidad de traducción de direcciones o verificación de límites, lo que resulta en una seguridad de memoria sin precedentes.

Primero, en el mapeo de direcciones de memoria virtual, en lugar de necesitar una MMU, las máquinas se basan en descriptores . [ 28 ] [ 29 ] El bit más alto de una palabra de memoria de 48 bits en los sistemas de la serie Burroughs B5000 indica si la palabra es un dato de usuario o una palabra de descriptor/control; los descriptores eran de solo lectura para los procesos de usuario y solo podían ser actualizados por el sistema (hardware o sistema operativo). Las palabras de memoria en los sistemas B6x00/B7x00/B5900/serie A/Unisys MCP tienen 48 bits de datos y 3 bits de etiqueta (y los sistemas posteriores hasta el actual tienen 4 bits de etiqueta). Las palabras cuya etiqueta es un número impar son de solo lectura para los procesos de usuario: los descriptores tienen una etiqueta de 5 y las palabras de código tienen una etiqueta de 3.

A cada bloque de memoria asignado se le asigna un descriptor maestro con sus propiedades: dirección física, tamaño y si se encuentra o no en la memoria principal. En este último caso, al acceder por primera vez al bloque, este debe asignarse; si existe una dirección, se trata de una dirección en el almacenamiento secundario y debe cargarse en la memoria principal. Todas las referencias a código y datos se realizan mediante un descriptor. Cuando se solicita acceso al bloque para lectura o escritura, el hardware verifica su presencia a través del bit de presencia (pbit) del descriptor.

Un pbit [ 30 ] de 1 indica la presencia del bloque. En este caso, se puede acceder al bloque mediante la dirección física de la memoria principal en el descriptor. Si el pbit es cero, se genera una interrupción de pbit [ 31 ] para que el MCP (sistema operativo) haga presente el bloque. Si el campo de dirección es cero, este es el primer acceso a este bloque y se le asigna (un pbit init (inicial)). Si el campo de dirección es distinto de cero, es una dirección de disco del bloque, que se ha desplegado previamente: el bloque se obtiene del disco, el pbit se establece en uno y la dirección de memoria física se actualiza para apuntar al bloque en memoria. Esto hace que los descriptores sean equivalentes a una entrada de tabla de páginas en un sistema MMU, pero los descriptores no tienen tabla.

Por lo tanto, toda la asignación de memoria es completamente automática (una de las características de los sistemas modernos [ 32 ] ) y no hay otra forma de asignar bloques que no sea este mecanismo. No existen llamadas como malloc o dealloc, ya que los bloques de memoria también se asignan automáticamente en la interrupción pbit o se descartan. El esquema también es perezoso , ya que un bloque no se asignará hasta que se haga referencia a él. 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 solo lectura (como segmentos de código que se pueden restaurar desde su copia original) y, como último recurso, transfiriendo los segmentos de datos modificados (es decir, actualizados) al disco.

Otra función que estos sistemas cumplen en la práctica es la protección. Dado que todos los accesos se realizan a través del descriptor, el hardware puede verificar que se mantengan dentro de los límites y, en el caso de una escritura, que el proceso tenga permiso de escritura. El sistema MCP es intrínsecamente seguro y, por lo tanto, no necesita una MMU para proporcionar este nivel de protección de memoria.

Los bloques se pueden compartir entre procesos mediante descriptores de copia en pilas de procesos (una pila es una estructura especial del sistema que representa el estado de ejecución de un proceso). Por lo tanto, algunos procesos pueden tener permisos de escritura, mientras que otros no. Los segmentos de código son de solo lectura, por lo que son reentrantes y se comparten entre procesos. Los descriptores de copia contienen un campo de dirección de 20 bits que indica el índice del descriptor maestro en la matriz de descriptores maestros. Esto también implementa un mecanismo de comunicación entre procesos (IPC) muy eficiente y seguro. Los bloques se pueden reubicar fácilmente, ya que solo es necesario actualizar el descriptor maestro cuando cambia el estado de un bloque.

Otro aspecto importante es el rendimiento : ¿los sistemas con o sin MMU ofrecen un mejor desempeño? Los sistemas MCP pueden implementarse sobre hardware estándar que incluye una MMU (por ejemplo, un PC estándar). Incluso si la implementación del sistema utiliza la MMU de alguna manera, esto no será perceptible a nivel de MCP. 

Cambio de banco

Una técnica sencilla llamada conmutación de bancos fue ampliamente utilizada por los primeros microprocesadores de 8 bits, como el MOS 6502. Por ejemplo, la MMU de Atari expresaba bits adicionales en el bus de direcciones para seleccionar entre varios bancos de memoria DRAM según cuál de los chips estuviera activo en ese momento, normalmente la CPU o el ANTIC . Esto se utilizó para ampliar la memoria disponible en el Atari 130XE a 128  kB. [ 33 ] El Commodore 128 utilizó un enfoque similar.

Véase también

Referencias

  1. Unidad de gestión de memoria en el Diccionario en línea gratuito de informática
  2. "Especificaciones del producto de la unidad de gestión de memoria MMU Z8010 Z8000" (PDF) . Zilog . Abril de 1985.
  3. "Libro de datos 1983/84" (PDF) . Zilog. págs. 215–234 . Consultado el 27 de abril de 2021 . 
  4. Schmidt, Stephen (abril de 1983). "Memoria virtual para microcomputadoras" . Byte . Vol. 8, n.° 4, págs. 234–235 .   
  5. 1 2 3 4 5 6 7 Zehr, Gregg (noviembre de 1986). "Unidades de gestión de memoria para arquitecturas 68000" (PDF) . Byte . págs. 127–135 . Archivado del original (PDF) el 2 de mayo de 2020. 
  6. Glaser, Edward L.; Couleur, John F.; Oliver, GA (1965). Diseño de un sistema informático para aplicaciones de tiempo compartido . Conferencia conjunta de informática de otoño de 1965.
  7. "6". Manual del procesador PDP-11/70 (PDF) . DIC. 1977.
  8. Tanenbaum, Andrew S. (2009). Sistemas operativos modernos . Upper Saddle River (Nueva Jersey): Prentice-Hall. ISBN 978-0-13-600663-3.
  9. 1 2 3 4 5 Frank Uyeda (2009). "Clase 7: Gestión de memoria" (PDF) . CSE 120: Principios de sistemas operativos . UC San Diego . Recuperado el 4 de diciembre de 2013 .
  10. Manual de referencia del procesador Spectra 70 70/46 (PDF) . RCA . Marzo de 1968. págs. 5–6 , 12–13 . Consultado el 15 de agosto de 2013 . 
  11. Manual de referencia, computadora SDS 940 (PDF) . Scientific Data Systems . 1966. págs. 8–10 . 
  12. Manual de ingeniería de hardware para la placa de CPU 2060 (PDF) . Sun Microsystems . 10 de mayo de 1987. págs. 121–129 . 
  13. 1 2 3 Este artículo se basa en material tomado de Memory+management+unit en el Free On-line Dictionary of Computing antes del 1 de noviembre de 2008 e incorporado bajo los términos de "relicencia" de la GFDL , versión 1.3 o posterior.
  14. 1 2 Manual de datos del microprocesador 1986 (PDF) . Signetics . págs. 2-568 – 2-598 . 
  15. Bell, Gordon. "Una retrospectiva sobre lo que hemos aprendido del PDP-11" .
  16. "Archivos de IBM: Fechas y características de System/360" . 03.ibm.com . 23 de enero de 2003. Archivado del original el 16 de enero de 2005. Consultado el 3 de mayo de 2017 .
  17. 1 2 "Características funcionales del modelo 67 del IBM System/360, tercera edición" (PDF) . Febrero de 1972. GA27-2719-2 . Consultado el 29 de octubre de 2021 .
  18. 1 2 3 4 5 6 "Capítulo 4 Gestión de memoria". Manual de referencia de la arquitectura VAX (PDF) . Digital Equipment Corporation . 1987. ISBN 0-932376-86-XEY-3459E-DP.
  19. "Manual de referencia técnica de Cortex-A8" (PDF) . Infoventer.arm.com . Consultado el 3 de mayo de 2017 .
  20. 1 2 3 "Parte II-A / Software OpenVMS AXP". Arquitectura Alpha AXP (PDF) (Segunda edición). Digital Press . 1995. ISBN  1-55558-145-5EY-TI32E-DP.
  21. 1 2 3 "Parte II-B / Software DEC OSF/1". Arquitectura Alpha AXP (PDF) (Segunda edición). Digital Press . 1995. ISBN  1-55558-145-5EY-TI32E-DP.
  22. 1 2 "Parte II-C / Software Windows NT AXP". Arquitectura Alpha AXP (PDF) (Segunda edición). Digital Press . 1995. ISBN  1-55558-145-5EY-TI32E-DP.
  23. Manual del usuario de la placa Sun 68000, Sun Microsystems, Inc., febrero de 1983, Revisión B
  24. "Manual de arquitectura Sun-2" (PDF) . Sun Microsystems . 15 de diciembre de 1983. págs. 9–12 . 
  25. "Manual del programador de la arquitectura AMD64 Volumen 2: Programación del sistema" (PDF) . Marzo de 2017. Consultado el 5 de diciembre de 2017 .
  26. "Documento técnico sobre paginación de 5 niveles y EPT de 5 niveles" . Intel . Consultado el 5 de abril de 2026 .
  27. Tanenbaum, Andrew S.; Herder, Jorrit N.; Bos, Herbert (mayo de 2006). "¿Podemos hacer que los sistemas operativos sean fiables y seguros?" . Computer . 39 (5): 44– 51. Bibcode : 2006Compr..39e..44T . CiteSeerX 10.1.1.112.3028 . doi : 10.1109/MC.2006.156 . S2CID 99779 .  
  28. "El descriptor" (PDF) . Bitsavers .
  29. "Descriptor de Unisys" . Unisys .
  30. "Pbits" . Unisys .
  31. "Interrupción Pbit" . Unisys .
  32. Daniel HH Ingalls (agosto de 1981). "Principios de diseño detrás de Smalltalk" . Byte Magazine . Archivado del original el 27 de septiembre de 2007.
  33. MCU, Unidad de Control de Memoria, FREDDIE (Informe técnico). Atari. 1983.