dos y la memoria: cómo evolucionó su gestión

Fuentes: DOS Memory Management, os2museum.com

Dos y la Memoria: Cómo Evolucionó su Gestión

El sistema operativo DOS, fundamental en la historia de la computación personal, ha experimentado una notable evolución en su gestión de memoria, desde sus humildes comienzos hasta la necesidad de soportar mayores cantidades de RAM. Esta evolución, a menudo pasada por alto en la documentación técnica, revela una serie de soluciones ingeniosas y peculiaridades inherentes a la arquitectura del PC original.

Orígenes Simples, Limitaciones Iniciales

En sus primeras versiones, como DOS 1.x (lanzada en 1981), la gestión de memoria era prácticamente inexistente. Diseñado para máquinas con un máximo de 64KB de RAM, el sistema permitía a los programas COM acceder a la mayor parte de esta memoria al cargarse. Los programas de la época a menudo no requerían más de esa cantidad. Sin embargo, la rápida evolución del hardware, con la introducción del IBM PC/XT en marzo de 1983, que venía con 128KB de RAM de serie y modelos con 256KB apareciendo poco después, obligó a Microsoft a implementar un mecanismo para gestionar esta memoria adicional. La necesidad de soportar estas expansiones de memoria se hizo evidente rápidamente.

La Introducción de la Gestión de Memoria en DOS 2.0

La gestión de memoria de DOS 2.0, desarrollada aproximadamente en el verano de 1982, marcó un punto de inflexión. Esta versión, que ya estaba documentada en el manual de PC DOS 2.0 de enero de 1983, introdujo tres funciones clave: ALLOC (48h) para la asignación de memoria, DEALLOC (49h) para la liberación, y SETBLOCK (4Ah) para el redimensionamiento. Aunque el código fuente de ALLOC.ASM (disponible en GitHub) indica una fecha de creación del 30 de marzo de 1983, esto es incorrecto, ya que DOS 2.0 ya había sido lanzado antes de esa fecha. Estas funciones se integraron con las nuevas funciones de gestión de procesos (EXEC/EXIT/WAIT), donde la memoria asignada pertenece al proceso actual y se libera al finalizar este.

Estructura y Funcionamiento Interno

La memoria gestionada por DOS se organiza como un único bloque contiguo al inicio, que se subdivide en bloques más pequeños a medida que se asigna. Cada bloque está precedido por un encabezado, denominado “arena header” en el código fuente de DOS, o “memory control block” (MCB) en la literatura externa. Estos MCBs, que ocupan un párrafo completo (16 bytes), contienen información crucial como la firma (’M’ para bloques normales y ‘Z’ para el último), el propietario (normalmente el PID del proceso) y el tamaño del bloque en párrafos. La firma ‘M’ o ‘Z’ es vital; si se encuentra una firma diferente, indica una corrupción de memoria y el sistema se considera comprometido.

Un aspecto importante es que DOS gestiona la memoria en unidades de párrafos (16 bytes), una consecuencia de la arquitectura 8086. Esto permite el uso de cantidades de 16 bits para registrar la dirección de inicio y el tamaño de cada bloque, y también implica que la dirección de inicio del párrafo es también la dirección del segmento del bloque. Esto, a su vez, evita la limitación de 64KB por bloque.

Funciones Clave y su Comportamiento

La función ALLOC devuelve un puntero a la memoria asignada o un código de error y el tamaño del bloque de memoria libre más grande. Es común que los programas llamen a ALLOC dos veces: primero para obtener el tamaño máximo disponible y luego para asignar la memoria real. DEALLOC simplemente establece el propietario del bloque a cero para marcarlo como libre. SETBLOCK permite redimensionar un bloque, aunque no lo mueve en la memoria. Si el redimensionamiento falla, devuelve el tamaño máximo disponible.

Coalescencia: Un Desafío de Diseño

La coalescencia, o la fusión de bloques de memoria libres adyacentes, es un aspecto crucial para evitar la fragmentación. DOS implementa una estrategia peculiar: DEALLOC no realiza coalescencia, SETBLOCK sí lo hace cuando se redimensiona un bloque, y ALLOC realiza la coalescencia completa al procesar la cadena de MCBs. Esta estrategia, aunque inusual, asegura que ALLOC siempre encuentre el bloque libre más grande. La imposibilidad de coalescer durante DEALLOC se debe a la estructura de la cadena de MCBs, que solo permite acceder al bloque siguiente, no al anterior.

Estado Actual y Perspectivas

Aunque DOS es un sistema operativo obsoleto en muchos aspectos, su gestión de memoria ofrece una visión fascinante de las limitaciones y soluciones creativas de la época. La arquitectura de MCBs, la gestión por párrafos y la estrategia de coalescencia son ejemplos de cómo los ingenieros de Microsoft se adaptaron a las restricciones del hardware de 8 bits. El estudio de estos mecanismos proporciona una valiosa perspectiva sobre la evolución de la gestión de memoria en los sistemas operativos modernos, donde la complejidad ha aumentado exponencialmente, pero los principios fundamentales siguen siendo relevantes.