Después de hablaros de la memoria RAM y también de la memoria caché, hoy nos toca hablaros de lo que es una unidad de manejo de memoria o MMU, una pieza de hardware esencial para cualquier hardware que ejecute un sistema operativo complejo y que fue clave para la aparición de la multitarea en los ordenadores personales. Si bien no se trata de un componente del que se suela hablar mucho a día de hoy, sigue siendo un elemento esencial y clave a día de hoy, desde los móviles más sencillos hasta el centro de datos más potente, no hay ningún sistema informático que a día de hoy carezca de una MMU.
Direccionamiento virtual versus físico
Para poder entender el funcionamiento de una MMU hemos de ir primero a lo más básico, que es explicar el direccionamiento virtual y en qué se diferencia del direccionamiento físico.
La dirección física es la dirección real en la memoria RAM donde se almacenan los datos y las instrucciones; engloba en exclusiva toda la memoria física. Así, pues, si tengo una CPU de 8 bits donde cada palabra es de ese tamaño y el direccionamiento es de 16 bits, entonces habrá 65536 direcciones distintas en dicho direccionamiento, el cual será exclusivo de la memoria RAM. Hemos de partir que en un mismo sistema puede haber diferentes memorias RAM para propósitos específicos (audio, vídeo). Cada una de ellas tiene su propio direccionamiento físico, ya que es gestionado directamente por el hardware que se encarga de la comunicación entre el microprocesador y dicha memoria.
table id=64 /]
Si hablamos de direccionamiento virtual, entonces hablamos de la forma en la que una MMU maneja la memoria de un microprocesador, y le permite a un microprocesador acceder más allá de su memoria RAM asignada. Por ejemplo, una CPU con una MMU, ya sea integrada o periférica, podrá ver el contenido de unidades de memoria secundaria (discos duros, SSD, tarjetas de memoria, unidades de disco óptico, disqueteras) como si formasen parte del mismo direccionamiento que la RAM. La primera CPU doméstica en traer una MMU fue el 80286 en el IBM PC AT, la cual podía manejar hasta 1 GB de memoria virtual y funcionaba por segmentos.
¿Qué es una MMU?
En términos sencillos, una MMU es una pieza de hardware que se encarga de trasladar las direcciones de memoria virtual que utilizan los programas en direcciones físicas reales sin que la CPU tenga que intervenir para ello. Sin embargo, esta descripción tan simple esconde una de las piezas más poderosas como esenciales en cualquier ordenador moderno. Sin ella, los entornos multitarea donde decenas de procesos de diferentes programas comparten el acceso a la memoria no serían posibles. Por lo que su aparición, primero en los miniordenadores y luego en los ordenadores personales, se dio tan rápido como la potencia de estos permitía ejecutar varios programas a la vez, es decir, la llamada multitarea.
Si bien la memoria y el direccionamiento virtual son anteriores a una MMU, sin ella el coste computacional es altísimo. Dado que esto implica que por cada acceso a memoria se requiere más trabajo para validar y traducir direcciones, lo que ralentiza el rendimiento. Por lo que esta unidad es crucial para ahorrarle este trabajo a la CPU. No solo eso, el aislamiento entre procesos no se puede gestionar eficientemente desde el microprocesador, generando fallos o conflictos. En sistemas complejos, la falta de una unidad de manejo de memoria limita la capacidad de multitarea, dado que a medida que se aumenta la cantidad de procesos, también lo hace la cantidad de direcciones a traducir.
Relación con la memoria caché
Si bien la aparición de las MMU fue anterior a la integración de la memoria caché, desde el momento en que el acceso a la RAM une estrechamente ambos componentes en un microprocesador, uno no es ajeno al otro. Más bien, para entender la forma en la que un microprocesador accede a memoria, hemos de entender también ambos elementos, ya que son inseparables. La relación entre la memoria caché y la MMU es clara, desde que el momento en que la caché está relacionada en contenido y direccionamiento con la RAM del sistema, es obvio que ambos componentes van a estar interrelacionados, por lo que la relación entre la caché y el uso de memoria virtual es muy estrecha.
- En algunos sistemas, la traducción de direcciones por parte de la MMU se realiza antes de acceder a la caché.
- Mientras que en otros se realiza después de recorrer los diferentes niveles de caché. , lo que afecta al diseño y rendimiento.
La memoria virtual puede apuntar a información almacenada en la memoria secundaria, como un disco duro o un SSD. Cuando ocurre un cache miss, si los datos no se encuentran en la RAM, el sistema debe buscarlos en esta memoria secundaria. En este punto, entra en acción otro tipo de MMU, encargado de gestionar el acceso a los componentes y periféricos del sistema. Esta unidad permite la comunicación eficiente entre la CPU y los dispositivos de almacenamiento, asegurando que los datos se recuperen correctamente.
Sin la MMU no habría sistemas operativos multitarea
El direccionamiento virtual, gestionado por la MMU, es esencial para poder ejecutar un sistema operativo multitarea, donde no solo se ejecuta un programa, sino que se mantienen varios al mismo tiempo usando los recursos de procesamiento y memoria del sistema. En dichos entornos aparecen una serie de problemas que no ocurren en sistemas que ejecutan una sola aplicación. Es más, antes de la aparición de los sistemas operativos con multitarea real, el sistema operativo no era un programa como tal, sino una serie de rutinas en la BIOS que los programas usaban para comunicarse con el hardware.
Esto obligaba a crear rutinas por software en el sistema operativo para aplicar el direccionamiento virtual y el traslado de direcciones, lo que suponía un consumo enorme de recursos del microprocesador. Por lo que la idea de la MMU es la de liberar por completo a la CPU de la repetitiva tarea, de tener que realizar dicha tarea de forma continua, ya que cada acceso a memoria tiene que trasladarse. A principios de los 80, pese a la capacidad del Motorola 68000 en separar dos espacios de memoria, esta no tenía una unidad de manejo de memoria integrada, lo que era una carga como microprocesador.
Si bien para los ordenadores domésticos, el tener una MMU no se hizo indispensable hasta muchos años más tarde, en estaciones de trabajo donde se usaban sistemas operativos multitarea se terminó haciendo indispensable tener una unidad de este tipo en el hardware, ya que su presencia marcaba una diferencia muy grande en el rendimiento.
La excepción: el Commodore Amiga
El Commodore Amiga original y sus derivados uso como CPU un Motorola 68000 y un sistema operativo multitarea bastante robusto para la época. Sin embargo, el sistema carecía de una MMU a nivel de hardware. ¿Cómo lo consiguieron? Dicho microprocesador era capaz de operar con dos direccionamientos en la memoria RAM, uno con privilegios donde se ejecutaban las rutinas de la BIOS y otro para las aplicaciones, en vez de que todo se ejecutase bajo un mismo direccionamiento de memoria. Es decir, se aislaba el sistema de las aplicaciones para una mayor seguridad.
Esta capacidad fue bien empleada por los ingenieros de software del Commodore Amiga, quienes crearon una ilusión de un sistema operativo multitarea, el cual consistía en darle un tiempo de CPU a cada aplicación que se encontraba activa e ir saltando con ello de un programa a otro. Es decir, en todo momento no hay varias aplicaciones ejecutándose al mismo tiempo, solo una, pero con un sistema muy bien pensado para hacer ver que ocurren muchas cosas al mismo tiempo.
¿Cómo funciona una MMU?
Una vez que hemos descrito qué hace una MMU nos toca hablar de cómo funciona. Si bien su trabajo no es otro que el de traducir las direcciones virtuales en direcciones físicas, su funcionamiento se basa en una serie de elementos clave. El primero de ellos es la AGU (Address Generation Unit), la cual se trata de una ALU modificada que se encarga de calcular las direcciones de memoria que utilizan las instrucciones. Por lo que la AGU y la MMU funcionan de forma conjunta de la siguiente manera:
- La AGU calcula la dirección virtual basada en los registros del procesador.
- La dirección virtual se envía a la TLB (Translation Lookaside Buffer) de la MMU para una traducción rápida.
- Si la dirección no está en la TLB, la MMU consulta la tabla de páginas en la RAM para encontrar la dirección física.
- La dirección física resultante se usa para acceder a la memoria real.
La tabla de traducción de direcciones (TLB o Translation Lookaside Buffer)
En un sistema con memoria virtual, las direcciones virtuales generadas por los programas deben ser traducidas a direcciones físicas antes de acceder a la memoria. Para ello se utiliza una tabla de páginas (TLB), que contiene un mapeo entre ambas direcciones. Esto significa que el acceso a la memoria no es directo. Pues bien, las MMU usan una caché interna de alta velocidad, la cual almacena las direcciones de memoria más usadas. Este mecanismo evita el acceso continuo a la RAM, reduce la latencia y ahora traducciones continuas de las direcciones de memoria.
Por lo que se trata de una memoria local totalmente gestionada por la unidad de manejo de memoria, la cual no necesita ser gestionada por el programa ni el sistema operativo.
- La CPU genera la dirección de memoria virtual a traducir por la MMU.
- La unidad de gestión de memoria realiza un chequeo al TLB interno para comprobar si se encuentra en ella:
- Si la entrada está en la TLB, la dirección física correspondiente se recupera de inmediato y el acceso a la memoria física ocurre sin necesidad de consultar la tabla de páginas.
- Si la entrada no está en la TLB, la CPU consulta la tabla de páginas en la memoria principal para obtener la traducción.
- Una vez encontrada, la entrada se almacena en la TLB para futuros accesos.
La TLB no almacena toda la traducción de direcciones, ya que sí que llegase a cierto tamaño sería demasiado lenta, solo lo hace con las direcciones más usadas y recientes. Por lo que en ese sentido funciona como una memoria caché tradicional, aunque orientada a la gestión de la memoria virtual. Por lo que la Page Table completa se encuentra en la memoria RAM
Tipos de acceso a la memoria virtual
Existen tres técnicas distintas de traducción de direcciones virtuales a físicas: mapeo directo, mapeo asociativo y mapeo asociativo de conjuntos. Todas ellas utilizan tanto el TLB como la Page Table que se encuentra en la RAM del sistema para trasladar las direcciones de memoria físicas a virtuales. Dependiendo del sistema, una MMU usará uno u otro tipo de direccionamiento virtual.

Hemos de partir del hecho de que una dirección virtual, al igual que una dirección física, se compone de una serie de bits. Pues bien, en el mapeado directo, la dirección virtual se compone de dos mitades: la primera nos indica en qué página virtual se encuentra la información, y la segunda mitad el desplazamiento dentro de esa misma página. Por ejemplo, si la dirección virtual es de 16 bits y cada página es de 4 KB (212), entonces esto significa que:
- Los 4 primeros bits nos permiten escoger la página, en este caso tendríamos 16 en total, ya que 24 = 16, esto corresponde a la palabra o el desplazamiento.
- En cuanto a los últimos 12 bits, corresponden al interior de la Page Table.
Si bien es el más fácil de implementar, la cantidad de entradas que ha de tener la Page Table no es pequeña, el tamaño es de 2N donde N es la potencia de 2 que indica el tamaño de la página. Por lo que en el caso del ejemplo tendríamos una Page Table de 4 KB para poder manejar 64 KB.
Mapeo asociativo
Debido a las limitaciones en lo que al tamaño de memoria se refiere, se propuso otro método, el cual es totalmente inverso en lo que al rendimiento se refiere, ya quepide mucha menos memoria. A cambio, requiere mayor potencia computacional. Por lo que al usar mapeado asociativo, se suele implementar una MMU que le ahorre a la CPU todo el proceso a la hora de traducir las direcciones.

En este caso, la dirección virtual es un poco más compleja, ya que la página virtual no tiene una correspondencia 1:1 con un bloque de memoria concreto. Lo que se hace es asociar cada página creada a una dirección física en memoria en la tabla. De esta manera se mantiene el tamaño de la Page Table al mínimo necesario y se hace posible cambiar de lugar en memoria los datos de forma más eficiente, lo que le da una gran versatilidad a la hora de gestionar la memoria.
Mapeo conjunto-asociativo
El tercer tipo de direccionamiento virtual es el conjunto-asociativo, que se encuentra a medio camino entre el directo y el asociativo, tanto en requisitos de memoria como en procesamiento. La dirección de memoria virtual se compone de tres elementos: etiqueta, índice y desplazamiento.
- El índice funciona de manera similar al mapeo directo de memoria. Por lo que si el número de bits es S, el número de conjuntos en la tabla de páginas será 2^S.
- La etiqueta, por su parte, se asemeja al mapeo asociativo, ya que, una vez determinado el conjunto a través del índice, se efectúa una búsqueda para verificar si la entrada corresponde a la memoria que se busca.
Este tipo de direccionamiento permite una mayor flexibilidad que el mapeado directo, pues los bloques de memoria pueden estar distribuidos en varios conjuntos de la caché. Aunque reduce el riesgo de conflictos de mapeo, tiene un costo adicional en tiempo de acceso, ya que se necesita buscar dentro de varios bloques del mismo conjunto.
Segmentación versus Paginación
Históricamente, ha habido dos tipos de memoria virtual: segmentación y paginación. El primero en implementarse en ordenadores personales, gracias al 80286 del PC AT, fue el de bloques de tamaño variable o también conocido por segmentos. No obstante, fue el segundo, basado en bloques de tamaño fijo o páginas, el que terminó por dominar el mercado. Este cambio se debió a la dificultad para los programadores a la hora de desarrollar. Es más, aunque externas, la mayoría de la MMU para los 680×0, ya sean de la propia Motorola o chips a medida, trabajaban por páginas y no segmentos. Curiosamente, fue en 1985 con la salida del 80386 que se vio la primera CPU con unidad de gestión de memoria paginada.
No obstante, no sería hasta 1987 con la salida del IBM PS/2, el 68030 y sistemas como el Macintosh II que empezaron a verse ordenadores con una MMU paginada en varias plataformas. En cuanto al Commodore Amiga y el Atari ST, el primero carecía de una MMU en su hardware, el segundo tenía de una pieza de hardware de igual nombre, pero era incapaz de gestionar memoria virtual de ningún tipo, ya fuera por páginas o por segmentos, y solo se limitaba a generar direcciones de memoria.
En cuanto al motivo de abandonar la memoria virtual segmentada con el tiempo, era por el hecho de que era un dolor de cabeza. Para empezar requería dos palabras para acceder a memoria y provocaba agujeros de memoria en toda la RAM. Además, dado que los bloques eran de tamaño variable, reemplazar uno por otro era difícil, dado que podía haber conflictos. Y es que una técnica que se hace para ahorrar memoria es dividir los programas y cargar las partes que interesan tener a cada momento.
IO-MMU
La IO-MMU (Input/Output Memory Management Unit) es un tipo de MMU que se encarga de gestionar las operaciones de memoria realizadas por dispositivos de entrada y salida (E/S). Como por ejemplo, tarjetas gráficas, controladores de red, discos duros, etc. Su función principal es garantizar que estos dispositivos accedan únicamente a las áreas de memoria permitidas, mejorando la seguridad y la estabilidad del sistema.
Cuando una unidad DMA correspondiente a un dispositivo de E/S envía una solicitud de acceso a la RAM, puede que lo haga con direcciones de memoria, que podrían no alinearse con la organización interna de la memoria física. En este caso, la IO-MMU intercepta dichas solicitudes y las traduce mediante una TLB propia usando los mismos mecanismos que la MMU estándar. Todo ello para que los dispositivos accedan a las partes de la RAM que tienen permitidas. Además, al controlar el acceso de cada dispositivo a la memoria, la IO-MMU también previene ataques DMA. Hablamos de aquellos en los que un dispositivo malicioso intentaría acceder a áreas críticas o sensibles de la memoria. Esto es especialmente importante para mantener la integridad de datos en sistemas operativos y entornos virtualizados.