# Memória expandida

Memória expandida era um sistema de comutação de bancos introduzido por volta de 1984 e que disponibilizava mais memória para programas corporativos volumosos em ambiente MS-DOS. Tais programas eram geralmente planilhas eletrônicas e SGBDs executados no IBM PC original e em seus sucessores, como o IBM PC-XT e o IBM PC/AT. O IBM PC e o IBM XT possuíam arquitetura de memória em modo real, a qual somente permitia aos programas usar até 1 megabyte do espaço de endereçamento, sendo que apenas 640 KiB estavam disponíveis para a RAM normal (o espaço restante até 1 MiB ficava reservado para periféricos, particularmente como memória da placa de vídeo). O IBM AT, que usava a UCP Intel 80286, dava suporte ao modo protegido, mas também ao MS-DOS, um SO de modo real que não usava a memória estendida (acima de 1 MiB) diretamente.
A ideia por trás da memória expandida era também usar parte dos 384 KiB restantes, normalmente destinados a comunicação com os periféricos, como memória para programas. Para acomodar potencialmente mais memória do que permitiriam alocar os 384 KiB de espaço livre, foi inventado um esquema de comutação de bancos, onde somente partes selecionadas da memória adicional estavam acessíveis a um dado tempo. Originalmente, uma única "janela" de 64 KiB estava disponível; posteriormente, isto tornou-se mais flexível. Aplicativos tinham de ser escritos de um modo específico para que pudessem acessar a memória expandida.
A Expanded Memory Specification (EMS ou "Especificação de Memória Expandida") foi desenvolvida em conjunto pela Lotus, Intel e Microsoft, de forma que às vezes ela era também denominada "LIM EMS". O EEMS, um padrão de gerenciamento de memória expandida concorrente, foi desenvolvido pela AST Research, Quadram e Ashton-Tate. Ela também permitia remapear parte ou todos os 640 KiB de memória baixa, de forma que programas inteiros pudessem ser chaveados dentro e fora da RAM extra. Os dois padrões terminaram sendo combinados na especificação LIM EMS 4.0.

## Diferentes implementações
### Placas de expansão

O acréscimo de uma janela de memória no espaço de endereçamento dos periféricos só podia ser realizada originalmente através de placas de expansão específicas, inseridas num slot ISA do PC. Placas de expansão de memória famosas na década de 1980 foram a AST RAMpage, IBM PS/2 80286 Memory Expansion Option, AT&T Expanded Memory Adapter e a Intel Above Board. Dado o preço da RAM nessa época, de até várias centenas de dólares por megabyte, e a qualidade e a reputação das marcas citadas, uma placa de expansão de memória custava bastante caro.
Sendo um periférico, uma placa de expansão de memória precisava de um driver de dispositivo para interfacear seus serviços. Tais drivers eram denominados "gerenciadores de memória expandida" e seu nome era variável; as placas anteriormente mencionadas usavam remm.sys (AST), ps2emm.sys (IBM), aemm.sys (AT&T) e emm.sys (Intel), respectivamente. Posteriormente, a expressão foi associada com soluções exclusivamente de software via microprocessador 80386. Por exemplo, o QEMM da Quarterdeck.

### Placas-mãe

Posteriormente, algumas placas-mãe de microcomputadores baseados no Intel 80286 implementaram um esquema de memória expandida que não exigia o uso de placas de expansão. Tipicamente, programas residentes determinavam quanta memória deveria ser usada como memória expandida e quanta deveria ser usada como memória estendida.

### Emulação por software

A partir de 1987, os recursos nativos de gerenciamento de memória do microprocessador Intel 80386 permitiam a modelagem livre do espaço de endereçamento ao executar programas antigos em modo real, o que tornava as soluções de hardware desnecessárias. A memória expandida podia ser simulada por software.
O primeiro emulador de gerenciamento de memória expandida foi provavelmente o CEMM, disponibilizado em novembro de 1987 com o Compaq DOS 3.31. Uma solução comercial popular e cheia de recursos foi o QEMM da Quarterdeck. Seu antagonista era o 386MAX da Qualitas. A funcionalidade foi mais tarde incorporada ao MS-DOS 4.01 em 1989 e ao DR-DOS 5.0 em 1990, como EMM386.
Os programas gerenciadores de memória expandida em geral, ofereciam funcionalidades adicionais, mas interrelacionadas. Notadamente, eles podiam criar áreas de memória comum (UMBs) em partes não usadas dos 384 KiB superiores do espaço de endereçamento em modo real e forneciam ferramentas para nelas carregar pequenos programas, tipicamente TSRs (comandos "loadhi" ou "loadhigh").
A interação entre memória estendida, emulação de memória expandida e extensões do DOS acabou por ser regulamentada pelas especificações XMS, VCPI e DPMI.
Certos programas de emulação, chamados coloquialmente de LIMuladores, não dependiam de forma alguma da placa-mãe ou dos recursos do 80386. Em vez disso, reservavam 64 KiB de RAM-base na janela de memória expandida, onde copiavam dados de e para a memória estendida ou HD quando aplicativos solicitavam chaveamento de páginas. A nível de programação, isso era fácil de implementar, mas a performance era baixa. Esta técnica era oferecida pelo AboveDisk da Above Software e por vários programas shareware.