stringtranslate.com

Unidad de gestión de memoria

Esta MMU 68451 podría usarse con el Motorola 68010 .

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 de memoria en el bus de memoria , traduciendo estas solicitudes, conocidas como direcciones de memoria virtual , en direcciones físicas en memoria principal .

En los sistemas modernos, los programas generalmente tienen direcciones que acceden a la memoria máxima teórica de la arquitectura del ordenador , 32 o 64 bits. La MMU asigna las direcciones de cada programa a áreas separadas en la memoria física, que generalmente es mucho más pequeña que el máximo teórico. Esto es posible porque los programas rara vez utilizan grandes cantidades de memoria en un momento dado.

La mayoría de los sistemas operativos (SO) modernos funcionan en conjunto con la MMU para proporcionar soporte de memoria virtual (VM). La MMU rastrea el uso de la memoria en bloques de tamaño fijo conocidos como páginas , y si un programa hace referencia a una ubicación en una página que no está en la memoria física, la MMU provocará una interrupción en el sistema operativo . Luego, el sistema operativo seleccionará un bloque menos utilizado en la memoria, lo escribirá en el almacenamiento de respaldo , como un disco duro , si se modificó desde que se leyó, leerá la página del almacenamiento de respaldo en ese bloque y configurará la MMU para asignar el bloque a la página solicitada originalmente para que el programa pueda usarlo. Esto se conoce como paginación de demanda .

Las MMU modernas generalmente también realizan tareas adicionales relacionadas con la memoria. La protección de la memoria bloquea los intentos de un programa de acceder a la memoria que no ha solicitado previamente, lo que evita que un programa que se comporta mal utilice toda la memoria o que el código malicioso lea datos de otro programa. También suelen gestionar una memoria caché del procesador , que almacena los datos a los que se ha accedido recientemente en una memoria muy rápida y, por tanto, reduce la necesidad de hablar con la memoria principal más lenta. En algunas implementaciones, también son responsables del arbitraje del bus , controlando el acceso al bus de memoria entre las muchas partes de la computadora que desean acceder.

Antes de que los sistemas VM se generalizaran en la década de 1990, los diseños anteriores de MMU eran más variados. Entre ellas, la más común era la traducción paginada, que era similar a la paginación por demanda moderna en el sentido de que utilizaba bloques de tamaño fijo, pero tenía una lista de páginas de tamaño fijo que dividía la memoria; esto significaba que el tamaño del bloque era función del número de páginas y de la memoria instalada. Otra técnica común, que se encuentra principalmente en máquinas más grandes, fue la traducción segmentada, que permitía bloques de memoria de tamaño variable que se asignaban mejor a las solicitudes del programa. Esto fue eficiente pero no se asignó tan bien a la memoria virtual. Algunos de los primeros sistemas, especialmente los de 8 bits , utilizaban MMU muy simples para realizar la conmutación de bancos .

Descripción general

Esquema del funcionamiento de una MMU [2] : 186 y sigs. 

Las MMU modernas suelen dividir el espacio de direcciones virtuales (el rango de direcciones utilizadas por el procesador) en páginas , cada una de las cuales tiene un tamaño que es una potencia de 2, normalmente unos pocos kilobytes , pero pueden ser mucho más grandes. Los programas hacen referencia a la memoria utilizando el tamaño de dirección natural de la máquina, normalmente de 32 o 64 bits en los sistemas modernos. Los bits inferiores de la dirección (el desplazamiento dentro de una página) no se modifican. Los bits de dirección superiores son los números de página virtuales. [3]

La mayoría de las MMU utilizan una tabla de elementos en memoria llamada tabla de páginas , que contiene una entrada de tabla de páginas (PTE) por página virtual, para asignar números de páginas virtuales a números de páginas físicas en la memoria principal. Las tablas de páginas de varios niveles se utilizan a menudo para reducir el tamaño de la tabla de páginas. Un caché asociativo de PTE se denomina búfer de búsqueda de traducción (TLB) y se utiliza para evitar la necesidad de acceder a la memoria principal cada vez que se asigna una dirección virtual. [4]

Otras MMU pueden tener una matriz privada de memoria, [5] registros, [6] o RAM estática [7] que contiene un conjunto de información de mapeo.

El número de página virtual se puede usar directamente como índice en la tabla de páginas u otra información de mapeo, o se puede dividir aún más, con bits en un nivel dado usados ​​como índice en una tabla de tablas de nivel inferior en las que se dividen los bits en el nivel. El siguiente nivel inferior se utiliza como índice, con dos o más niveles de indexación.

El número de página física se combina con el desplazamiento de página para proporcionar la dirección física completa. [3]

Una entrada de la tabla de páginas u otra información por página también puede incluir información sobre si la página se escribió (el bit sucio ), cuándo se usó por última vez (el bit accedido , para un algoritmo de reemplazo de página usado menos recientemente (LRU) ) , qué tipo de procesos ( modo usuario o modo supervisor ) pueden leerlo y escribirlo, y si debe almacenarse en caché .

A veces, una entrada de la tabla de páginas u otra información por página prohíbe el acceso a una página virtual en particular, tal vez porque no se ha asignado ninguna memoria física de acceso aleatorio (RAM) a esa página virtual. En este caso, la MMU señala un fallo de búsqueda a la CPU. Luego, el sistema operativo (SO) maneja la situación, tal vez intentando encontrar un marco de RAM libre y configurar el mapa de páginas para asignarlo a la dirección virtual solicitada. Si no hay RAM libre, puede que sea necesario elegir una página existente (conocida como víctima ), utilizando algún algoritmo de reemplazo , y guardarla en el disco (un proceso llamado paginación ). En algunas MMU también puede haber escasez de PTE, en cuyo caso el sistema operativo tendrá que liberar una para la nueva asignación. [3]

La MMU también puede generar condiciones de error de acceso ilegal o fallas de página no válidas en accesos a memoria ilegales o inexistentes, respectivamente, lo que lleva a fallas de segmentación o condiciones de error de bus cuando las maneja el sistema operativo.

Beneficios

VLSI VI475 MMU Apple HMMU del Macintosh II usado con el Motorola 68020

En algunos casos, un error de página puede indicar un error de software , que se puede evitar usando la protección de la memoria como uno de los beneficios clave de una MMU: un sistema operativo puede usarla para protegerse contra programas erróneos al no permitir el acceso a la memoria de un programa en particular. no debería tener acceso a. Normalmente, un sistema operativo asigna a cada programa su propio espacio de direcciones virtuales. [3]

Una MMU paginada también mitiga el problema de la fragmentación externa de la memoria. Una vez asignados y liberados los bloques de memoria, la memoria libre puede fragmentarse (discontinua), de modo que el bloque contiguo más grande de memoria libre puede ser mucho menor que la cantidad total. Con la memoria virtual, se puede asignar un rango contiguo de direcciones virtuales a varios bloques no contiguos de memoria física; esta asignación no contigua es uno de los beneficios de la paginación . [3]

Sin embargo, el mapeo paginado causa otro problema: la fragmentación interna . Esto ocurre cuando un programa solicita un bloque de memoria que no se asigna claramente a una página, por ejemplo, si un programa solicita un búfer de 1 KB para realizar el trabajo con el archivo. En este caso, la solicitud da como resultado que se reserve una página completa aunque solo se utilizará 1 KB de la página; si las páginas tienen más de 1 KB, el resto de la página se desperdicia. Si se realizan muchas asignaciones pequeñas de este tipo, la memoria puede agotarse aunque gran parte de ella permanezca vacía. [4]

En algunos de los primeros diseños de microprocesadores , la gestión de la 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 [8] y Z8015. (1985) [9] [10] utilizado 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 los microprocesadores Intel 80286 y posteriores x86 .

Conceptos más antiguos

Si bien este artículo se concentra en las MMU modernas, comúnmente basadas en paginación de demanda, los primeros sistemas usaban bases y límites para abordar eso y se desarrollaron aún más en segmentación , o usaban un conjunto fijo de bloques en lugar de cargarlos bajo demanda. La diferencia entre estos dos enfoques es el tamaño del bloque de memoria contiguo; 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. [4]

Traducción segmentada

Los primeros sistemas de gestión de memoria, a menudo implementados en software, reservaban una parte de la memoria para contener una serie de asignaciones. Estos consistían en pares de valores, la base y el límite , aunque se han utilizado muchos otros términos. Cuando el sistema operativo solicitaba memoria para cargar un programa, o un programa solicitaba más memoria para almacenar datos de un archivo, por ejemplo, llamaba a la biblioteca de manejo de memoria . Esto examinó las asignaciones para buscar un área en la memoria principal lo suficientemente grande como para contener la solicitud. Si se encontraba dicho bloque, se ingresaba una nueva entrada en la tabla. A partir de entonces, cuando ese programa accedió a la memoria, todas sus direcciones fueron compensadas por el valor base. Cuando el programa termina con la memoria que solicitó y se libera, o el programa sale, se liberan las entradas asociadas con él. [4]

Este estilo de acceso, con el tiempo, se volvió común en el mercado de mainframe [ cita necesaria ] y se conoció como traducción segmentada , aunque aquí también se utilizan una variedad de términos. Este estilo tiene la ventaja de la sencillez; los bloques de memoria son continuos y por lo tanto sólo es necesario almacenar los dos valores, base y límite. Cada entrada corresponde a un bloque de memoria utilizado por un único programa, y ​​la traducción es invisible para el programa, que ve la memoria principal comenzando en la dirección cero y extendiéndose hasta algún valor fijo. [4]

La desventaja de este enfoque es que conduce a un efecto conocido como fragmentación externa . Esto ocurre cuando se liberan asignaciones de memoria pero no son contiguas. En este caso, es posible que haya suficiente memoria disponible para manejar una solicitud, pero está dispersa y no se puede asignar. En sistemas donde los programas se inician y se detienen con el tiempo, esto puede eventualmente llevar a que la memoria esté muy fragmentada y no queden bloques grandes. Se desarrollaron varios algoritmos para abordar este problema. [4]

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 Motorola 68451 y Signetics 68905, [4] pero existen muchos otros ejemplos. También se apoyó en implementaciones de software; un ejemplo es el MultiFinder de Apple , lanzado en 1987 para la plataforma Macintosh . A cada programa se le asignó una cantidad de memoria que se preseleccionó en el Finder y la traducción de virtual a física se realizó dentro de los programas mediante identificadores . [11]

Un ejemplo más común es el Intel 8088 utilizado en la PC IBM . Esto implementó una MMU muy simple dentro de la CPU, con cuatro registros de procesador que contienen valores base a los que el programa accede directamente. Estos mapeaban solo los 4 bits superiores de la dirección de 20 bits, y no había un equivalente a un límite, que era simplemente los 16 bits inferiores de la dirección y, por lo tanto, 64 kB fijos. [12] Las entradas posteriores de la serie de arquitectura x86 utilizaron diferentes enfoques.

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 por segmento que proporcionan la dirección base física y la longitud del segmento, contiene entradas que proporcionan la dirección base física de una tabla de páginas para el segmento, además de la longitud del segmento. La memoria física se divide en páginas de tamaño fijo y las mismas técnicas utilizadas para la paginación de demanda basada puramente en páginas se utilizan para la paginación de demanda basada en segmentos y páginas.

Traducción paginada

Otro enfoque para el manejo de la memoria es dividir la memoria principal en una serie contigua de bloques de tamaño fijo. Esto es similar al sistema moderno de paginación por demanda en el sentido de que el resultado es una serie de páginas, pero en estos sistemas anteriores la lista de páginas tiene un tamaño fijo y normalmente se almacena en algún tipo de memoria rápida, como RAM estática, para mejorar el rendimiento. En este caso, las dos partes de la dirección almacenada por la MMU se conocen como número de segmento e índice de página . [4]

Considere un diseño de procesador con direccionamiento de 24 bits, como el Motorola 68000 original . En dicho sistema, la MMU divide la dirección virtual en partes, por ejemplo, los 13 bits menos significativos para el índice de página y los 11 bits más significativos restantes como número de segmento. Esto da como resultado una lista de 2048 páginas de 8 kB cada una. [4] En este enfoque, las solicitudes de memoria dan como resultado que se concedan una o más páginas a ese programa, que pueden no ser contiguas en la memoria principal. La MMU mantiene una lista del número de página expresado originalmente por el programa y el número de página real en la memoria principal. Cuando intenta acceder a la memoria, la MMU lee el número de segmento del bus de memoria del procesador, encuentra la entrada correspondiente para ese programa en su memoria interna y expresa la versión asignada del valor en el bus de la memoria mientras los bits inferiores del original La dirección se pasa sin cambios. Al igual que en el caso segmentado, los programas ven su memoria como un único bloque contiguo. [4]

Este enfoque tiene dos desventajas. La primera es que a medida que se expande el espacio de direcciones virtuales, también aumenta la cantidad de memoria necesaria para mantener la asignación. Por ejemplo, en el 68020 las direcciones tienen 32 bits de ancho, lo que significa que el número de segmento para el mismo tamaño de página de 8 kB ahora son los 19 bits superiores y la tabla de mapeo se expande a 512 kB de tamaño, [4] mucho más allá de lo que podría ser implementado en hardware a un costo razonable en la década de 1980. Este problema se puede reducir haciendo las páginas más grandes, digamos 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 cual es más manejable. Pasar a un tamaño de página más grande conduce al segundo problema: una 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. [4]

El enfoque de traducción paginada fue ampliamente utilizado por las MMU con microprocesador en los años 1970 y principios de los 80, incluido el Signetics 68905 (que podía funcionar en cualquier modo). Tanto Signetics como Philips produjeron una versión del 68000 que combinaba el 68905 en el mismo chip físico, el 68070. [4]

Otro uso de esta técnica es 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 que lo hacía demasiado pequeño a medida que el tamaño de la memoria aumentaba en la década de 1970. Esto se solucionó expandiendo el bus de memoria física a 18 bits y usando una MMU para agregar dos bits más basados ​​en otros pines en el bus del procesador para indicar qué programa estaba accediendo a la memoria. [13]

Otro uso de esta misma técnica, aunque no se denomina paginación sino conmutación de banco , fue ampliamente utilizado por los primeros microprocesadores de 8 bits como el MOS 6502 . Por ejemplo, la MMU de Atari expresaría bits adicionales en el bus de direcciones para seleccionar entre varios bancos de memoria DRAM en función de cuál de los chips estaba actualmente activo, normalmente la CPU o ANTIC . Esto se utilizó para ampliar la memoria disponible en el Atari 130XE a 128 kB. [14] El Commodore 128 utilizó un enfoque similar.

Ejemplos

La mayoría de los sistemas modernos dividen la memoria en páginas de 4 a 64 KB de tamaño, a menudo con la capacidad de utilizar las llamadas páginas grandes de 2 MB o 1 GB de tamaño (a menudo ambas variantes son posibles). Las traducciones de páginas se almacenan en caché en un búfer de traducción (TLB). Algunos sistemas, principalmente diseños RISC más antiguos, quedan atrapados en el sistema operativo cuando no se encuentra la traducción de una página en el TLB. La mayoría de los sistemas utilizan un caminador de árboles basado en hardware. La mayoría de los sistemas permiten desactivar la MMU, pero algunos la desactivan cuando se capturan en el código del sistema operativo.

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

El IBM System/360 Modelo 67 , que se presentó en agosto de 1965, incluía una MMU llamada caja de traducción dinámica de direcciones (DAT). [15] [16] Tiene la característica inusual de almacenar 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. [16] Esto reduce la sobrecarga para el sistema operativo, que de otro modo necesitaría 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 del sistema operativo , más tarde llamada paravirtualización , sea más fácil.

A partir de agosto de 1972, el IBM System/370 tiene 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. También almacena los datos accedidos. y bits 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 2000, se introdujo la arquitectura z/de 64 bits , con el espacio de direcciones ampliado a 64 bits; esos continúan almacenando los bits sucios y a los que se accede fuera de la tabla de páginas.

VAX

Las páginas VAX tienen 512 bytes, [17] : 199  , que 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, se considera que el sistema 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: [17] : 200–201 

Espacio P0
Se utiliza para memoria por proceso de uso general, como montones.
Espacio P1
(O espacio de control) que también es por proceso y generalmente se usa para supervisor, ejecutivo, kernel , pilas de usuarios y otras estructuras de control por proceso administradas 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, incluidas las tablas de páginas.
espacio S1
Que no se utiliza y está "Reservado para Digital ". [17] : 200-201 

Las tablas de páginas son grandes matrices lineales. [17] : 209–215  Normalmente, esto sería un gran desperdicio cuando se usan direcciones en ambos extremos del rango posible, pero las tablas de páginas para el espacio P0 y P1 se almacenan en el espacio S0 paginado. [17] : 211–212  Por lo tanto, existe efectivamente un árbol de dos niveles , que permite que las aplicaciones tengan un diseño de memoria escasa sin desperdiciar mucho espacio en entradas de la tabla de páginas no utilizadas. A diferencia de las entradas de la tabla de páginas en la mayoría de las MMU, las entradas de la tabla de páginas en la MMU VAX carecen de un bit de acceso. [17] : 203–205  Los sistemas operativos que implementan paginación deben encontrar alguna manera de emular el bit al que se accede si quieren operar de manera eficiente. Por lo general, el sistema operativo desasignará periódicamente las páginas para que los fallos de página no presente se puedan utilizar 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 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 heredadas también definían una página pequeña de 1 KB . ARM usa una tabla de páginas de dos niveles si usa páginas de 4 KB y 64 KB , o solo una tabla de páginas de un nivel para secciones de 1 MB y secciones de 16 MB .

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

DIC Alfa

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

El código PAL OpenVMS AXP y el código PAL DEC OSF/1 recorren una tabla de páginas con estructura de árbol de tres niveles. Las direcciones se dividen en un conjunto de bits no utilizados (que contienen el mismo valor que el bit superior 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 de 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 de árbol tienen el mismo tamaño. [19] : 3-2–3-3  [20] : 3-1–3-2  OpenVMS AXP PALcode admite bits de permiso de lectura y escritura completos para los modos de usuario, supervisor, ejecutivo y kernel, y también admite fallas en la lectura También se admiten bits /write/execute. [19] : 3-3–3-6  El código DEC OSF/1 PAL admite bits de permiso de lectura y escritura completos para los modos de usuario y kernel, y también admite fallas en bits de lectura/escritura/ejecución. [20] : (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. Se ignoran los 32 bits superiores de una dirección. 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 de hoja del árbol y 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. [21] : 3-2–3-4  El código PAL AXP de Windows NT admite que una página sea accesible sólo desde el modo kernel o desde el modo usuario y kernel, y también admite una falla en el bit de escritura. [21] : 3-5 

MIPS

La arquitectura MIPS admite de una a 64 entradas en el TLB. El número de entradas TLB se puede configurar en la configuración de la CPU antes de la síntesis. Las entradas de TLB son duales. Cada entrada 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 máscara de página no se almacenan en la VPN2. Cada entrada TLB tiene su propio tamaño de página, que puede tener cualquier valor desde 1 KB hasta 256 MB en múltiplos de cuatro. Cada PFN en una entrada TLB tiene un atributo de almacenamiento en caché, un bit de estado sucio y válido. Una VPN2 tiene un bit de estado global y una ID asignada al sistema operativo que participa en la coincidencia de entrada de TLB de 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 máscara de página.

Se genera una excepción de recarga de TLB cuando no hay entradas en el TLB que coincidan con la dirección virtual asignada. Se genera una excepción TLB no válida cuando hay una coincidencia pero la entrada está marcada como no válida. Se genera una excepción modificada de TLB cuando una instrucción de almacenamiento hace referencia a una dirección asignada y el estado sucio de la entrada coincidente no está establecido. Si se produce una excepción TLB al procesar una excepción TLB, una excepción TLB de doble falla, 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.

Sol MMU

El Sun-1 original es una computadora de placa única construida alrededor del microprocesador Motorola 68000 e introducida en 1982. Incluye la unidad de administración de memoria Sun 1 original que proporciona traducción de direcciones, protección de memoria, uso compartido y asignación de memoria para múltiples procesos que se ejecutan en el UPC. Todo el acceso de la CPU a la RAM privada incorporada, la memoria Multibus externa, las E/S integradas y las E/S Multibus se ejecuta a través de la MMU, donde la traducción y protección de direcciones se realizan de manera 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. Las direcciones virtuales de la CPU se traducen en direcciones intermedias mediante el mapa de segmentos, que a su vez se traducen en direcciones físicas mediante 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 asignar hasta 16 contextos simultáneamente. El espacio máximo de direcciones lógicas para un contexto es 1024 páginas o 2 MB. La dirección física máxima que se puede asignar simultáneamente también es 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 segmento 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 un caché de contexto y reemplazando los contextos obsoletos según el uso menos reciente.

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

Las estaciones de trabajo Sun-2 son similares; están construidos alrededor del microprocesador Motorola 68010 y tienen una unidad de administració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. [23]

Las estaciones de trabajo Sun-3 , excepto Sun-3/80, Sun-3/460, Sun-3/470 y Sun-3/480, están construidas alrededor del Motorola 68020 y tienen una unidad de administración de memoria similar. El tamaño de la página aumenta a 8 KB . (Los modelos posteriores se basan en el Motorola 68030 y utilizan la MMU en chip del 68030).

Las estaciones de trabajo Sun-4 se basan en varios microprocesadores SPARC y tienen 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 normalmente ocupan 4 KB. Después de un error de TLB, la MMU PowerPC estándar comienza dos búsquedas simultáneas. Una búsqueda intenta hacer coincidir la dirección con uno de 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 asignar fragmentos lineales de memoria de hasta 256 MB y normalmente los utiliza un sistema operativo para asignar grandes porciones del espacio de direcciones para el uso propio del núcleo del sistema operativo. Si la búsqueda BAT tiene éxito, la otra búsqueda se detiene y se ignora.

La otra búsqueda, que no es compatible directamente con todos los procesadores de esta familia, se realiza a través de la llamada tabla de páginas invertida , que actúa como una extensión hash fuera del chip del TLB. Primero, los cuatro bits superiores de la dirección se utilizan para seleccionar uno de los 16 registros de segmento . Luego, 24 bits del registro de segmento reemplazan esos cuatro bits, produciendo una dirección de 52 bits. El uso de registros de segmento permite que múltiples procesos compartan la misma tabla hash .

La dirección de 52 bits se procesa mediante hash y luego se utiliza como índice en la tabla fuera del chip. Allí, se escanea un grupo de entradas de una tabla de ocho páginas en busca de una que coincida. Si ninguno coincide debido a colisiones hash excesivas , el procesador vuelve a intentarlo con una función hash ligeramente diferente . Si esto también falla, la CPU se queda atrapada en el sistema operativo (con MMU deshabilitada) para que el problema pueda resolverse. El sistema operativo necesita descartar una entrada de la tabla hash para dejar espacio para una nueva entrada. El sistema operativo puede generar la nueva entrada a partir de una tabla de páginas en forma de árbol más normal o de estructuras de datos por mapeo que probablemente sean más lentas y más eficientes en cuanto a espacio. La compatibilidad con el control de no ejecución se encuentra en los registros de segmento, lo que genera una granularidad de 256 MB .

Un problema importante con este diseño es la mala 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 ejecuta 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 los segmentos para retrasar este problema, o puede optar por sufrir el desperdicio de memoria asociado con las tablas hash por proceso. Los chips G1 no buscan entradas de la tabla de páginas, pero sí generan el hash, con la expectativa de que un sistema operativo busque la tabla hash estándar a través del software. El sistema operativo puede escribir en el 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 métodos. En los chips que lo hacen opcional o no lo admiten en absoluto, el sistema operativo puede optar por utilizar exclusivamente una tabla de páginas basada en árbol.

IA-32/x86

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

La CPU divide principalmente la memoria en páginas de 4 KB . Los registros de segmento, fundamentales para los diseños más antiguos de MMU 8088 y 80286 , 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 los núcleos del sistema operativo, que se realiza con el uso explícito del Registros de segmentos FS y GS. Todo acceso a la memoria implica un registro de segmento, elegido según el código que se ejecuta. El registro de segmento actúa como un índice en una tabla, lo que proporciona un desplazamiento que se agregará a la dirección virtual. Excepto cuando se utiliza FS o GS, el sistema operativo garantiza que el desplazamiento será cero.

Después de agregar el desplazamiento, la dirección se enmascara para que no tenga más de 32 bits. El resultado se puede buscar a través de una tabla de páginas estructurada en á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 directamente copiado 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 de el espacio de direcciones.

Las revisiones menores de la MMU introducidas con el Pentium han permitido páginas muy grandes de 4 MB omitiendo el nivel inferior del árbol (esto deja 10 bits para indexar el primer nivel de 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 que las direcciones físicas de 36 bits con 2+9+9 bits para tablas de páginas de tres niveles y los 12 bits más bajos se copien directamente al resultado. Las páginas grandes ( 2 MB ) también están disponibles omitiendo el nivel inferior del árbol (lo que da como resultado 2+9 bits para la jerarquía de tablas de dos niveles y los 9+12 bits restantes más bajos copiados directamente). Además, la tabla de atributos de la página permitía especificar la capacidad de caché buscando algunos bits altos en una pequeña tabla en la CPU.

Originalmente, el soporte de no ejecución solo se proporcionaba por segmento, lo que hacía que su uso fuera muy complicado. 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 máquinas con procesadores x86 que carecen del bit NX al establecer la longitud del segmento de código, con una pérdida de rendimiento y una reducción en el espacio de direcciones disponible. .

x86-64

La arquitectura de sistema heterogéneo (HSA) crea un espacio de direcciones virtuales unificado para CPU, GPU y DSP, dejando obsoletos 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 procesadores 386 o más nuevos. En modo largo, se ignoran todos los desplazamientos de segmentos, 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 no utilizados, nueve bits cada uno para cuatro niveles de árbol (para un total de 36 bits) y los 12 bits más bajos se copian 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 paginación y 21 bits de desplazamiento. Algunas CPU más nuevas también admiten una página de 1 GB con dos niveles de paginación y 30 bits de desplazamiento. [24]

CPUID se puede utilizar para determinar si se admiten 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 más 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 con versiones anteriores. 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 .

Alternativas

Serie Burroughs B5000, sistemas MCP B6500/Unisys

El Burroughs B5000 de 1961 fue el primer sistema comercial que admitía memoria virtual (después del Atlas ), aunque no tiene MMU. [25] Este, sus sucesores y el Burroughs B6500 y sus sucesores proporcionan las dos funciones de una MMU (direcciones de memoria virtual y protección de memoria) con un enfoque arquitectónico diferente.

Primero, en el mapeo de direcciones de memoria virtual, en lugar de necesitar una MMU, esas máquinas se basan en descriptores . El bit superior de una palabra de memoria de 48 bits en los sistemas Burroughs B5000/B5500/B5700 indica si la palabra es un operando (valor numérico o lógico) o es una palabra descriptiva/de control; Los descriptores son de sólo lectura para los procesos del usuario y sólo pueden ser actualizados por el sistema (hardware o sistema operativo). Las palabras de memoria en el sistema Burroughs B6500 y sus sucesores tienen 48 bits de datos y 3 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 las propiedades del bloque (es decir, su dirección física, su tamaño y si está presente en la memoria). Todas las referencias a códigos y datos se realizan mediante un descriptor; cuando se realiza una solicitud para acceder al bloque para lectura o escritura, el hardware verifica 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 en el 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, este es el primer acceso a este bloque y está asignado (un pbit inicial). Si el campo de dirección es distinto de cero, es una dirección de disco del bloque, que se ha implementado previamente, por lo que el bloque se recupera del disco y el pbit se establece en uno y la dirección de memoria física se actualiza para que apunte al bloque. en la 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 se puede monitorear a través de la cantidad de pbits. Los pbits iniciales indican asignaciones iniciales, pero un nivel alto de otros pbits indica que el sistema puede estar fallando.

Por lo tanto, toda la asignación de memoria es completamente automática (una de las características de los sistemas modernos [26] ) 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 descartan automáticamente. El esquema también es diferido , ya que un bloque no se asignará hasta que realmente se haga referencia a él. Cuando la memoria está casi llena, el MCP examina el conjunto de trabajo, intenta compactarlo (ya que el sistema está segmentado, no paginado), desasignar segmentos de sólo lectura (como segmentos de código que se pueden restaurar a partir de su copia original) y, como último recurso, transferir segmentos de datos sucios al disco.

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

Los bloques se pueden compartir entre procesos mediante descriptores de copia en la pila de procesos. Por tanto, algunos procesos pueden tener permiso de escritura, mientras que otros no. Un segmento de código es de solo lectura, por lo tanto reentrante y compartido entre procesos. Los descriptores de copia contienen un campo de dirección de 20 bits que proporciona el índice del descriptor maestro en la matriz de descriptores maestros. Esto también implementa un mecanismo 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.

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

Ver también

Referencias

  1. ^ Unidad de gestión de memoria en el Diccionario de informática gratuito en línea
  2. ^ Tanenbaum, Andrew S. (2009). Sistemas operativos modernos . Upper Saddle River (Nueva Jersey): Prentice-Hall. ISBN 978-0-13-600663-3.
  3. ^ abcdeFrank Uyeda (2009). "Conferencia 7: Gestión de la memoria" (PDF) . CSE 120: Principios de los sistemas operativos . Universidad de California en San Diego . Consultado el 4 de diciembre de 2013 .
  4. ^ abcdefghijklm Zehr, Gregg (noviembre de 1986). "Unidades de gestión de memoria para arquitecturas 68000" (PDF) . Byte . págs. 127-135.
  5. ^ Manual del procesador Spectra 70 70-46 (PDF) . RCA . Marzo de 1968. págs. 5–6 . Consultado el 15 de agosto de 2013 .
  6. ^ Manual de referencia, computadora SDS 940 (PDF) . Sistemas de datos científicos . 1966, págs. 8-10.
  7. ^ Manual de ingeniería de hardware para la placa CPU 2060 (PDF) . Microsistemas solares . 10 de mayo de 1987. págs. 121-129.
  8. ^ "Especificación de producto de la unidad de gestión de memoria Z8010 Z8000 MMU" (PDF) . Zilog . Abril de 1985.
  9. ^ "Libro de datos 1983/84" (PDF) . Zilog. págs. 215–234 . Consultado el 27 de abril de 2021 .
  10. ^ Schmidt, Stephen (abril de 1983). "Memoria virtual para microcomputadoras". Byte . vol. 8, núm. 4. págs. 234-235.
  11. ^ Guía del usuario de MultiFinder . Manzana. 1987, págs. 20-22, 24.
  12. ^ Decodificación de direcciones de memoria (informe técnico). Universidad de Nuevo México. 1996.
  13. ^ Campana, Gordon. "Una retrospectiva de lo que hemos aprendido del PDP-11".
  14. ^ MCU, Unidad de control de memoria, FREDDIE (Informe técnico). Atari. 1983.
  15. ^ "Archivos de IBM: System/360 Fechas y características". 03.ibm.com . 23 de enero de 2003 . Consultado el 3 de mayo de 2017 .
  16. ^ ab "Características funcionales del IBM System/360 Modelo 67, tercera edición" (PDF) . Febrero de 1972. GA27-2719-2 . Consultado el 29 de octubre de 2021 .
  17. ^ abcdef "Capítulo 4 Gestión de la memoria". Manual de referencia de arquitectura VAX (PDF) . Corporación de equipos digitales . 1987.ISBN _ 0-932376-86-X. EY-3459E-DP.
  18. ^ "Manual de referencia técnica de Cortex-A8" (PDF) . Infoventer.arm.com . Consultado el 3 de mayo de 2017 .
  19. ^ a b "Parte II-A / Software OpenVMS AXP". Arquitectura Alpha AXP (PDF) (Segunda ed.). Prensa Digital . 1995.ISBN _ 1-55558-145-5. EY-TI32E-DP.
  20. ^ abc "Software Parte II-B / DEC OSF / 1". Arquitectura Alpha AXP (PDF) (Segunda ed.). Prensa Digital . 1995.ISBN _ 1-55558-145-5. EY-TI32E-DP.
  21. ^ ab "Software Parte II-C / Windows NT AXP". Arquitectura Alpha AXP (PDF) (Segunda ed.). Prensa Digital . 1995.ISBN _ 1-55558-145-5. EY-TI32E-DP.
  22. ^ Manual del usuario de la placa Sun 68000, Sun Microsystems, Inc, febrero de 1983, revisión B
  23. ^ "Manual de arquitectura de Sun-2" (PDF) . Microsistemas solares . 15 de diciembre de 1983. págs. 9-12.
  24. ^ "Manual del programador de arquitectura AMD64 Volumen 2: Programación del sistema" (PDF) . Marzo de 2017 . Consultado el 5 de diciembre de 2017 .
  25. ^ Tanenbaum, Andrew S.; Herder, Jorrit N.; Bos, Herbert (mayo de 2006). "¿Podemos hacer que los sistemas operativos sean confiables y seguros?". Computadora . 39 (5): 44–51. CiteSeerX 10.1.1.112.3028 . doi :10.1109/MC.2006.156. S2CID  99779. 
  26. ^ Daniel HH Ingalls (agosto de 1981). "Principios de diseño detrás de Smalltalk". Revista Byte . Archivado desde el original el 27 de septiembre de 2007.