Unidad de gestión de memoria
Una unidad de gestión de memoria (MMU), a veces llamada unidad de gestión de memoria paginada (PMMU), es una unidad de hardware de computadora que tiene todas las referencias de memoria pasadas a través de sí misma, principalmente realizando la traducción de direcciones de memoria virtual a direcciones físicas.
Una MMU realiza de forma eficaz la gestión de la memoria virtual, gestionando al mismo tiempo la protección de la memoria, el control de caché, el arbitraje de bus y, en arquitecturas informáticas más sencillas (especialmente los sistemas de 8 bits), la conmutación de bancos.
Resumen
Las MMU modernas normalmente dividen el espacio de direcciones virtuales (el rango de direcciones utilizadas por el procesador) en páginas, cada una con un tamaño de potencia de 2, generalmente unos pocos kilobytes, pero pueden ser mucho más grandes. 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.
Entradas de la tabla de páginas
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, para asignar números de página virtuales a números de página físicos en la memoria principal. 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. Otras MMU pueden tener una matriz privada de memoria o registros que contienen un conjunto de entradas de la tabla de páginas. El número de página física se combina con el desplazamiento de página para dar la dirección física completa.
Un PTE también puede incluir información sobre si se ha escrito en la página (el "bit sucio"), cuándo se usó por última vez (el "bit de acceso" para un algoritmo de reemplazo de página usado menos recientemente (LRU), qué tipo de procesos (modo de usuario o modo de supervisor) pueden leerlo y escribirlo, y si debe almacenarse en caché.
A veces, un PTE prohíbe el acceso a una página virtual, quizás porque no se ha asignado memoria física de acceso aleatorio (RAM) a esa página virtual. En este caso, la MMU señala un fallo de página a la CPU. Luego, el sistema operativo (SO) maneja la situación, tal vez tratando de encontrar un marco de RAM de repuesto y configurando un nuevo PTE 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"), usar algún algoritmo de reemplazo y guardarla en el disco (un proceso llamado "paginación").;). Con algunas MMU, también puede haber escasez de PTE, en cuyo caso el sistema operativo tendrá que liberar uno para la nueva asignación.
La MMU también puede generar condiciones de error de acceso ilegal o fallas de página no válida en accesos de memoria ilegales o inexistentes, respectivamente, lo que genera fallas de segmentación o condiciones de error de bus cuando las maneja el sistema operativo.
Beneficios
En algunos casos, una falla de página puede indicar un error de software, que se puede prevenir usando la protección de la memoria como uno de los beneficios clave de una MMU: un sistema operativo puede usarla para proteger contra programas erróneos al no permitir el acceso a la memoria que un programa en particular no debería tener acceso. Por lo general, un sistema operativo asigna a cada programa su propio espacio de direcciones virtuales.
Una MMU también mitiga el problema de la fragmentación de la memoria. Una vez que se han asignado y liberado bloques de memoria, la memoria libre puede fragmentarse (discontinuidad) 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.
En algunos de los primeros diseños de microprocesadores, la gestión de la memoria la realizaba un circuito integrado independiente, como VLSI Technology VI475 (1986), Motorola 68851 (1984) utilizado con la CPU Motorola 68020 en Macintosh II, o Z8010 y Z8015 (1985) 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.
Si bien este artículo se concentra en las MMU modernas, generalmente basadas en páginas, los primeros sistemas usaban un concepto similar para el direccionamiento de límite de base que se convirtió en segmentación. Ocasionalmente también están presentes en las arquitecturas modernas. La arquitectura x86 proporcionó segmentación, en lugar de paginación, en el 80286, y proporciona paginación y segmentación en los procesadores 80386 y posteriores (aunque el uso de la segmentación no está disponible en la operación de 64 bits).
Ejemplos
La mayoría de los sistemas modernos dividen la memoria en páginas que tienen un tamaño 4–64 KB, a menudo con la capacidad de usar las llamadas páginas enormes de 2 MB o 1 GB de tamaño (a menudo, ambas variantes son posibles). Las traducciones de página se almacenan en caché en un búfer de búsqueda de traducción (TLB). Algunos sistemas, principalmente los diseños RISC más antiguos, se interceptan en el sistema operativo cuando no se encuentra una traducción de página en el TLB. La mayoría de los sistemas utilizan un caminante de árboles basado en hardware. La mayoría de los sistemas permiten que la MMU se deshabilite, pero algunos la deshabilitan cuando se intercepta en el código del sistema operativo.
VAX
Las páginas VAX tienen 512 bytes, 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 juntas. 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. Ellos son:
- P0 space
- Se utiliza para la memoria de uso general por proceso como montones.
- P1 espacio
- (O espacio de control) que también es per-proceso y se utiliza típicamente para supervisor, ejecutivo, núcleo, pilas de usuario y otras estructuras de control por proceso gestionadas por el sistema operativo.
- Espacio S0
- (O espacio del sistema) que es global para todos los procesos y almacena código y datos del sistema operativo, ya sea en página o no, incluyendo los portátiles.
- Espacio S1
- Lo cual no es usado y "Reservado a Digital".
Las tablas de páginas son grandes arreglos lineales. Normalmente, esto sería un gran desperdicio cuando las direcciones se usan en ambos extremos del rango posible, pero la tabla de páginas para las aplicaciones se almacena en la memoria paginada del núcleo. Por lo tanto, existe efectivamente un árbol de dos niveles, lo que permite que las aplicaciones tengan un diseño de memoria escasa sin desperdiciar mucho espacio en las entradas de la tabla de páginas no utilizadas. La VAX MMU se destaca por carecer de un bit de acceso. Los sistemas operativos que implementan la paginación deben encontrar alguna forma de emular el bit accedido si quieren operar de manera eficiente. Por lo general, el sistema operativo eliminará 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 de ARM. La arquitectura actual define PTE para describir páginas 4 KB y 64 KB, 1 MB y supersecciones 16 MB; las versiones heredadas también definían una página diminuta de 1 KB. ARM usa una tabla de páginas de dos niveles si usa páginas 4 KB y 64 KB, o simplemente una tabla de páginas de un nivel para Secciones 1 MB y secciones 16 MB.
Las actualizaciones de TLB se realizan automáticamente mediante el hardware de recorrido de la tabla de páginas. Los PTE incluyen permisos de acceso de lectura/escritura basados en privilegios, información de almacenamiento en caché, un bit NX y un bit no seguro.
IBM System/360 Modelo 67, IBM System/370 y sucesores
El IBM System/360 Model 67, que se presentó en agosto de 1965, incluía una MMU llamada cuadro de traducción dinámica de direcciones (DAT). 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). Hacen referencia a la memoria física en lugar de a la memoria virtual, y se accede a ellas mediante instrucciones de propósito especial. Esto reduce la sobrecarga para el sistema operativo, que de otro modo tendría que propagar los bits sucios y accedidos desde las tablas de páginas a una estructura de datos más orientada físicamente. Esto facilita la virtualización a nivel del sistema operativo, más tarde llamada paravirtualización.
A partir de agosto de 1972, 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 de System/360 Model 67. También almacena los bits accedidos y sucios fuera de la tabla de páginas. A principios de 1983, la arquitectura System/370-XA amplió el espacio de direcciones virtuales a 31 bits y, en 2000, se introdujo la arquitectura z/ de 64 bits, con el espacio de direcciones ampliado a 64 bits; esos continúan almacenando los bits accedidos y sucios fuera de la tabla de páginas.
DEC Alfa
El procesador DEC Alpha divide la memoria en páginas de 8 KB. Después de una falla de TLB, el código de máquina de firmware de bajo nivel (aquí llamado PALcode) recorre una tabla de páginas con estructura de árbol de tres niveles. Las direcciones se dividen de la siguiente manera: 21 bits sin usar, 10 bits para indexar el nivel de raíz del árbol, 10 bits para indexar el nivel medio del árbol, 10 bits para indexar el nivel de hoja del árbol y 13 bits que pasan a la dirección física sin modificación. Se admiten bits completos de permiso de lectura/escritura/ejecución.
MIPS
La arquitectura MIPS admite de una a 64 entradas en la TLB. El número de entradas de TLB se puede configurar en la configuración de la CPU antes de la síntesis. Las entradas de TLB son duales. Cada entrada de TLB asigna un número de página virtual (VPN2) a cualquiera de los dos números de marco de página (PFN0 o PFN1), según el 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 VPN2. Cada entrada de 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 uno válido. Una VPN2 tiene un bit de estado global y un ID asignado al sistema operativo que participa en la coincidencia de entrada de TLB de dirección virtual, si el bit de estado global se establece 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 no válida de TLB cuando hay una coincidencia pero la entrada se marca 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 ocurre una excepción de TLB al procesar una excepción de TLB, una excepción de 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.
Dom 1
La Sun 1 original es una computadora de placa única construida alrededor del microprocesador Motorola 68000 y presentada 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 de memoria y asignación de memoria para múltiples procesos en ejecución 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 ejecuta a través de la MMU, donde la traducción y la protección de direcciones se realizan de manera uniforme. La MMU se implementa en hardware en la placa de la CPU.
La MMU consta de un registro de contexto, un mapa de segmento y un mapa de página. Las direcciones virtuales de la CPU se traducen en direcciones intermedias por el mapa de segmento, que a su vez se traducen en direcciones físicas por el mapa de página. El tamaño de la página es 2 KB y el tamaño del segmento es 32 KB, lo que da 16 páginas por segmento. Se pueden mapear hasta 16 contextos simultáneamente. El espacio máximo de direcciones lógicas para un contexto es 1024 páginas o 2 MB. La dirección física máxima que se puede asignar simultáneamente también es 2 MB.
El registro de contexto es importante en un sistema operativo multitarea porque permite que la CPU cambie entre procesos sin recargar toda la información del estado de traducción. El registro de contexto de 4 bits puede cambiar entre 16 secciones del mapa de segmentos bajo el control del supervisor, lo que permite mapear 16 contextos simultáneamente. Cada contexto tiene su propio espacio de direcciones virtuales. Se puede compartir el espacio de direcciones virtuales y las comunicaciones entre contextos escribiendo los mismos valores en los mapas de segmentos o páginas de diferentes contextos. Se pueden manejar contextos adicionales al tratar el mapa de segmento como un caché de contexto y reemplazar los contextos desactualizados en base a los menos usados recientemente.
El registro de contexto no hace distinción entre los 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 se asignen en la página 0 de contexto, así como la pila de supervisor válida.
PowerPC
En PowerPC G1, G2, G3 y G4, las páginas normalmente son 4 KB. Después de un fallo de TLB, la MMU de PowerPC estándar inicia dos búsquedas simultáneas. Una búsqueda intenta hacer coincidir la dirección con uno de los cuatro u ocho registros de traducción de direcciones de bloques de datos (DBAT), o cuatro u ocho registros de traducción de direcciones de bloques de instrucciones (IBAT), según corresponda. Los registros BAT pueden 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 kernel del sistema operativo. uso propio. Si la búsqueda de 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 denominada "tabla de páginas invertida" que actúa como una extensión hash fuera del chip de la 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 codifica y luego se usa 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 de hash excesivas, el procesador vuelve a intentarlo con una función de hash ligeramente diferente. Si esto también falla, la CPU entra en el sistema operativo (con MMU deshabilitada) para que el problema se resuelva. 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 similar a un árbol más normal o de estructuras de datos por mapeo que probablemente sean más lentas y más eficientes en cuanto al espacio. La compatibilidad con el control de no ejecución se encuentra en los registros de segmento, lo que lleva a una granularidad de 256 MB.
Un problema importante con este diseño es la ubicación de caché deficiente 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 la reutilización de valores de segmento para demorar el enfrentar esto, o puede optar por sufrir el desperdicio de memoria asociado con las tablas hash por proceso. Los chips G1 no buscan entradas en la tabla de páginas, pero 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 la TLB. Los chips G2, G3 y los primeros G4 usan hardware para buscar en la tabla hash. Los últimos chips permiten que el sistema operativo elija cualquiera de los dos métodos. En los chips que hacen que esto sea opcional o no lo admitan en absoluto, el sistema operativo puede optar por utilizar exclusivamente una tabla de páginas basada en árboles.
IA-32/x86
La arquitectura x86 ha evolucionado durante mucho tiempo manteniendo la compatibilidad total con el software, incluso para el código del sistema operativo. Por lo tanto, la MMU es extremadamente compleja, con muchos modos operativos diferentes posibles. 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 de MMU 8088 y 80286 más antiguos, no se usan 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 CPU para kernels de sistema operativo, que se realiza con el uso explícito del Registros de segmento FS y GS. Todo acceso a la memoria implica un registro de segmento, elegido de acuerdo con el código que se está ejecutando. El registro de segmento actúa como un índice en una tabla, que proporciona un desplazamiento para agregar a la dirección virtual. Excepto cuando se utiliza FS o GS, el sistema operativo garantiza que el desplazamiento sea cero.
Después de agregar el desplazamiento, la dirección se enmascara para que no tenga más de 32 bits. El resultado puede consultarse a través de una tabla de páginas con estructura de árbol, con los bits de la dirección divididos de la siguiente manera: 10 bits para la rama del árbol, 10 bits para las hojas de la rama y los 12 bits más bajos 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.
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 con los 10+12 bits restantes copiados directamente al resultado). Las revisiones menores de la MMU introducidas con 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 12 bits más bajos que se copian directamente en el resultado. Las páginas grandes (2 MB) también están disponibles saltándose el nivel inferior del árbol (lo que da como resultado 2+9 bits para la jerarquía de tabla de dos niveles y los restantes 9+12 bits más bajos copiado directamente). Además, la tabla de atributos de la página permitió la especificación de la capacidad de almacenamiento en caché al buscar algunos bits altos en una pequeña tabla en la CPU.
Originalmente, el soporte sin ejecución solo se brindaba por segmento, lo que lo hacía muy incómodo de usar. 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 la compatibilidad no ejecutable por página en procesadores x86 de máquinas 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
x86-64 es una extensión de 64 bits de x86 que elimina casi por completo la segmentación a favor del modelo de memoria plana que utilizan casi todos los sistemas operativos para los procesadores 386 o más nuevos. En el modo largo, se ignoran todos los desplazamientos de segmento, excepto los segmentos FS y GS. Cuando se utiliza con páginas de 4 KB, el árbol de la tabla de páginas tiene cuatro niveles en lugar de tres.
Las direcciones virtuales se dividen de la siguiente manera: 16 bits sin usar, nueve bits cada uno para cuatro niveles de árbol (para un total de 36 bits) y los 12 bits más bajos se copian directamente en el 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 compensación. Algunas CPU más nuevas también admiten una página 1 GB con dos niveles de paginación y 30 bits de compensación.
El CPUID se puede usar para determinar si las páginas de 1 GB son compatibles. 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 son signos extendidos a los bits superiores. 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.
Sistemas Unisys MCP (Burroughs B5000)
El Burroughs B5000 de 1961 fue el primer sistema comercial compatible con memoria virtual (después del Atlas), aunque no tiene MMU. Proporciona las dos funciones de una MMU (direcciones de memoria virtual y protección de memoria) con un enfoque arquitectónico diferente..
Primero, en el mapeo de direcciones de memoria virtual, en lugar de necesitar una MMU, los sistemas MCP están basados en descriptores. Cada bloque de memoria asignado recibe un descriptor maestro con las propiedades del bloque (es decir, el tamaño, la dirección y si está presente en la memoria). Cuando se 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) presente el bloque. Si el campo de dirección es cero, este es el primer acceso a este bloque y se asigna (un pbit de inicio). Si el campo de dirección no es cero, es una dirección de disco del bloque, que se ha implementado previamente, por lo que el bloque se obtiene del disco y el pbit se establece en uno y la dirección de memoria física se actualiza para apuntar 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 de inicio indican asignaciones iniciales, pero un alto nivel de otros pbits indica que el sistema puede estar desmoronándose.
Toda la asignación de memoria es, por lo tanto, completamente automática (una de las características de los sistemas modernos) y no hay 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 perezoso, ya que no se asignará un bloque hasta que se haga referencia a él. Cuando la memoria está casi llena, el MCP examina el conjunto de trabajo, intenta la compactación (dado que el sistema está segmentado, no paginado), desasigna segmentos de solo lectura (como segmentos de código que pueden restaurarse a partir de su copia original) y, como resultado último recurso, rodando segmentos de datos sucios al disco.
Otra forma en que el B5000 proporciona una función de MMU es 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 intrínsecamente seguro y, por lo tanto, no necesita una MMU para proporcionar este nivel de protección de la memoria. Los descriptores son de solo lectura para los procesos de usuario y solo pueden ser actualizados por el sistema (hardware o MCP). (Las palabras cuya etiqueta es un número impar son de solo lectura; los descriptores tienen una etiqueta de 5 y las palabras de código tienen una etiqueta de 3).
Los bloques se pueden compartir entre procesos a través de descriptores de copia en la pila de procesos. Por lo 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 el descriptor maestro necesita actualizarse cuando cambia el estado de un bloque.
El único otro aspecto es el rendimiento: ¿los sistemas basados en MMU o no basados en MMU ofrecen un mejor rendimiento? Los sistemas MCP pueden implementarse sobre hardware estándar que tiene una MMU (por ejemplo, una PC estándar). Incluso si la implementación del sistema usa la MMU de alguna manera, esto no será del todo visible en el nivel de MCP.
Contenido relacionado
Lavavajillas
Gingham
QUIC