Windows de 16 bits fue, ante todo, un sofisticado gestor de overlays: desde sus primeras versiones (1.x y 2.x) funcionaba sobre hardware 8086 y 80286, sin paginación y con una RAM muy escasa para el tamaño del sistema. Para que un PC típico pudiera mantenerlo en ejecución, Windows necesitaba conservar en memoria física solo los segmentos más activos y descartar o recargar bajo demanda los menos utilizados. Ese mecanismo, inspirado en parte por el modo protegido del Intel 286, se mantuvo como base incluso cuando Windows 3.1 pasó a ejecutarse exclusivamente en modo protegido.
La unidad básica son los segmentos, bloques contiguos de hasta 64 KB. Como pueden moverse o descartarse, no se identifican por su dirección física de segmento 8086, sino por handles opacos de 16 bits, similares a los selectores del modo protegido x86. El diseñador de la gestión de memoria de Windows 1.0, Steve Wood, tomó el 286 como referencia consciente.
Para trabajar con un segmento, la aplicación solicita memoria con GlobalAlloc y, para acceder a ella, debe llamar a GlobalLock, que devuelve una dirección de segmento válida y bloquea el segmento (impide su movimiento). Tras terminar, se invoca GlobalUnlock; cuando el contador de bloqueos llega a cero, Windows puede mover o descartar el segmento. Mantener la dirección obtenida tras desbloquearlo es una fuente clásica de bugs sutiles.
El formato de ejecutable New Executable (NE), heredado del DOS 4 multitarea, organiza el archivo como segmentos independientes en disco, lo que permite cargarlos, recargarlos y reubicarlos individualmente. Ese mismo formato sustenta los mecanismos de import y export: la ventana de procedimientos, por ejemplo, se exporta para que Windows pueda fijar su prólogo y cargar el segmento de datos de la aplicación en DS.
Los segmentos admiten dos atributos clave: fijos o movibles (los fijos, como los de rutinas de interrupción, no pueden reubicarse; los movibles permiten compactar la memoria y reducir la fragmentación) y descartables o no descartables (los de código y recursos suelen ser descartables porque son de solo lectura; los de datos, al ser modificables, normalmente no). La elección adecuada de estos atributos es esencial para escribir aplicaciones robustas en Win16. El artículo cierra con una introducción al enlace dinámico (DLL), cuya base es precisamente el formato NE.
