# Memoria expandida

La memoria expandida o especificación de memoria expandida (Expanded Memory Specification, EMS) fue un método que proporcionaba memoria paginada extra a los programas de MS-DOS. Fue desarrollado alrededor de 1984.
Estos programas, que corrían en la IBM PC original, y sus sucesores como el IBM XT y el IBM AT, eran típicamente aplicaciones como hojas de cálculo y bases de datos que necesitaban una gran cantidad de memoria para trabajar correctamente.
El IBM PC y el IBM XT tenían una arquitectura de memoria de modo real, que solo permitía a los programas usar 1 mebibyte de espacio de dirección, de los cuales solo hasta 640 KiB estaba disponible como RAM normal para las aplicaciones. El resto entre 640 KiB y 1 MiB era reservado para periféricos, destacándose la memoria para las tarjetas de vídeo. El IBM AT, con su microprocesador Intel 80286 soportaba un modo protegido lo que le permitía direccionar hasta 16 MiB, pero este computador también usaba el MS-DOS, un sistema operativo que no usaba la memoria extendida (por arriba del mebibyte) directamente.
La idea detrás de la memoria expandida era usar, también para la memoria del programa, parte de los 384 KiB restantes normalmente dedicados a los periféricos. Para poder usar potencialmente mucho más memoria que los 384 KiB que el espacio de direccionamiento permitía, fue ideado un esquema de conmutación de bancos de memoria, donde solamente estarían accesibles a un mismo tiempo, porciones seleccionadas de la memoria adicional. Originalmente, era posible una sola ventana de 64 KiB de memoria, más adelante esto fue más flexible. Las aplicaciones tuvieron que ser escritas de una manera específica para tener acceso a la memoria expandida.

## Diferentes implementaciones
### Tarjetas de expansión

Esta inserción de una ventana de memoria en el espacio de dirección de los periféricos se podía lograr originalmente solamente a través de tarjetas de expansión específicas, enchufadas en el bus de expansión ISA de la computadora. Algunas famosas tarjetas de memoria expandida de los años 1980 fueron el RAMPage de AST Research, el IBM PS/2 80286 Memory Expansion Option, el AT&T Expanded Memory Adapter, y el Above Board de Intel. Dado el precio del RAM de hasta varios cientos de dólares por megabyte durante ese período, y la calidad y la reputación de las marcas mencionadas arriba, una tarjeta de memoria expandida era muy costosa.

### Tarjeta madre

Más adelante, algunas tarjetas madres de computadores basados en el Intel 80286 implementaron un esquema de memoria expandida que no requería tarjetas añadidas. Típicamente, interruptores por software determinaban cuánta memoria se debía usar como memoria expandida y cuánta debía ser usada como memoria extendida.

### Manejo de memoria nativo en el procesador

Comenzando en 1987, las características incorporadas de manejo de memoria del procesador Intel 80386 modelaron libremente el espacio de dirección cuando corrían software en modo real, haciendo innecesarias las soluciones de hardware. La memoria expandida se podía simular simplemente por software.

### DPMI

Una manera más eficiente de tener acceso al espacio de dirección más allá de 640 KB, en el 80286 y procesadores posteriores, fue usando el DOS Protected Mode Interface (DPMI, interfaz de modo protegido del DOS). Los DOS extenders eran drivers que permitieron a las aplicaciones correr en modo protegido. En lugar de intentar tener acceso a más memoria por medio de mecanismos de conmutación de memoria, los drivers cambiaban el procesador a modo protegido cuando corrían el programa de aplicación, y regresaban a modo real cuando accedían a servicios del MS-DOS. Esto permitió que los programas accedieran directamente toda la memoria que era configurada como memoria extendida.
El uso de la memoria expandida por las aplicaciones disminuyó a principios de los años 1990, a medida que los DOS Extenders llegaron a ser más predominantes.

### Emulación por software

El primer programa de manejo de memoria expandida (por emulación) fue probablemente Compaq Expanded Memory Manager (CEMM), disponible en noviembre de 1987 con el DOS 3.31 de Compaq. Una solución comercial popular con buenas características fue el QEMM de Quarterdeck. Un competidor fue el 386MAX de Qualitas. La funcionalidad fue incorporada más adelante en el MS-DOS 4.01 de 1989 y en el DR-DOS 5.0 de 1990, como el EMM386.
El software de manejo de memoria expandida ofrecía funcionalidad adicional pero estrechamente relacionada. Notablemente, podía crear Upper Memory Area (UMA) o áreas de memoria ordinaria (Upper Memory Blocks, UMB) en las partes no usadas de los 384 KB altos (entre 640 KB y 1 MB) del espacio de dirección del modo real y proveyeron herramientas para cargar pequeños programas, típicamente los TSR (Terminate and Stay Resident) usando los comandos ("loadhi" o "loadhigh").
La interacción entre la memoria extendida, la emulación de memoria expandida y los DOS Extenders terminó siendo regulada por las especificaciones XMS, VCPI y DPMI.
Ciertos programas de emulación, coloquialmente conocidos como LIMulators, no dependían para nada de la tarjeta madre o las características del 80386. En su lugar, reservaron 64 KB de RAM básica para la ventana de memoria expandida, donde copiaron datos a y desde la memoria extendida o el disco duro cuando los programas de aplicación solicitaban cambios de página. Esto era fácil de implementar programáticamente pero el desempeño era bajo. Esta técnica fue ofrecida por AboveDisk de Above Software y por varios programas shareware.

## Detalles

Una tarjeta de memoria expandida era un periférico de hardware, necesitaba un software de controlador de dispositivo, que exportaba sus servicios. Este controlador de dispositivo fue llamado "expanded memory manager" (manejador de memoria expandida). Su nombre fue variable; las tarjetas previamente mencionadas usaron respectivamente remm.sys (AST), ps2emm.sys (IBM), aemm.sys (AT&T) y emm.sys (Intel). Más adelante, la expresión llegó a ser asociada con soluciones solo de software que requerían el procesador 80386, por ejemplo el QEMM de Quarterdeck (ver abajo).
La memoria expandida era un término común para algunas variantes de tecnología incompatibles. La Expanded Memory Specification (EMS) (especificación de memoria expandida) fue desarrollada en común por Lotus, Intel, y Microsoft, así que esta especificación fue referida a veces como "LIM EMS". EEMS, un estándar competidor de manejo de memoria expandida, fue desarrollado por AST Research, Quadram y Ashton-Tate. Este estándar también permitió remapear alguno o todos los 640 KB de la parte baja de memoria, de modo que programas enteros pudieran ser conmutados dentro y fuera de la RAM extra. Los dos estándares fueron finalmente combinados como LIM EMS 4.0.

## Programación

Un bloque de 64 KiB, el page frame fue reservado en área de memoria superior o en memoria convencional. El page frame en sí mismo constaba de cuatro páginas EMS de 16 KiB, cada una de las cuales podía ser fijada independientemente para "apuntar" a algunas partes de la memoria expandida bajo el control del programa. Cambiar el llamado mapeo del page frame era costoso, así que en consecuencia se tenían que organizar los datos. Versiones posteriores de la especificación del LIM EMS no imponen más el uso de un page frame, pero esto fue apenas usado.
Usar memoria expandida era oneroso, y la tarea fue temida y odiada por todos los programadores de PC. No obstante, era una manera de usar más memoria, y para software exigente en memoria, usarla en una manera penosa era mejor que no usarla. Un desafío constante de diseño era determinar qué datos se debían almacenar en los fáciles de usar 640 KB bajos de la memoria, y qué datos se debían almacenar en la memoria expandida con su sobrecarga inherente de manejo.
Antes de la estandardización impuesta por el LIM EMS, cada tarjeta de memoria venía con su propio driver y con diferentes interfaces de programación de aplicaciones. Después de LIM EMS, Microsoft alteró ligeramente su implementación en el DOS 3.31, de modo que la memoria fuera alineada en límites de palabra en vez de límites de byte como determinada la especificación original, haciendo fallar en funcionar correctamente a algunas aplicaciones. En la práctica, los usuarios tuvieron que alterar la configuración de sus computadoras para usar el LIM EMS o Microsoft EMS de acuerdo a la aplicación que desearan usar.