Escritos
B. Piropo
Anteriores:
< Trilha Zero >
Volte de onde veio
11/01/1993

< Memórias e Memórias >


Para aproveitar os recursos de gerenciamento de memória incorporados ao MS-DOS a partir da versão 5.0, é preciso saber como a memória é utilizada e onde os programas podem nela se alojar. E conhecer os diversos "tipos" de memória. Acontece que o tema já foi destrinchado em seus mínimos detalhes aqui mesmo na Trilha Zero, em uma longa série de colunas. Mas isto foi nos idos de 91. Então vamos hoje resumi-las para informar a quem pegou o bonde andando e, já que o assunto é memória, refrescar a dos demais. O DOS foi desenvolvido sob encomenda, em 1981, para o PC, o primeiro computador pessoal lançado pela IBM. E foi, portanto, moldado às características da máquina. Na época, a CPU mais avançada era o 8086, um chip de 16 bits. Mas a IBM não quis arriscar: para aproveitar os componentes de então, quase todos de 8 bits, preferiu usar uma versão simplificada, o 8088, semelhante ao 8086, mas que se comunicava com a memória através de um barramento de 8 bits e uma linha de endereçamento de 20 bits (hoje o 8088 provavelmente se chamaria 8086-SX). Por isto o PC jamais conseguiu "enxergar" nada acima de 1Mb, o maior endereço que "cabe" em 20 bits. E o DOS foi desenvolvido com este limite em mente. Naqueles tempos, memória era muito cara. Alguns computadores pessoais vinham com 4K de RAM e olhe lá. Uma máquina com 16K era um luxo. O PC botou pra quebrar: veio logo com 64K, um absurdo. E a turma que desenvolveu o DOS foi ainda mais liberal: destacou o décuplo disto para programas. Assim nasceu o triste limite de 640K: o trecho que vai desde aí até 1Mb foi reservado exclusivamente para o próprio sistema operacional. Por esta razão, até hoje os programas somente podem ser carregados nos endereços desde zero até 640K (para os puristas: 640K - 1). Trecho que ficou conhecido como "memória convencional" e que, por muitos anos, foi a única opção disponível: tudo tinha que ser carregado ali, desde programas até drivers, residentes e o próprio sistema operacional. O que gerou um enorme congestionamento. Mas a necessidade faz milagres: três empresas, premidas pelo limite de 640K, engendraram um subterfúgio para "enganar" o DOS: incorporaram ao sistema um driver que separa um segmento de 64K no trecho reservado, acima dos 640K mas abaixo de 1Mb, que o DOS "enxerga". Este segmento denomina-se "moldura". O driver, usando uma placa adicional de memória ou os chips da própria placa mãe, armazena dados em endereços que ele pode gerenciar, embora inacessíveis ao DOS. E executa uma fantástica prestidigitação: copia dados dali para a moldura tão rapidamente que o DOS nem percebe. Quando são necessários dados armazenados fora da moldura, o driver vai buscá-los e os copia lá, onde o DOS pode vê-los. O padrão, já na versão 4.0, chamou-se LIM, iniciais das empresas que o desenvolveram, Lotus, Intel e Microsoft. E a memória que ele gerencia foi denominada "memória expandida". Note que a memória expandida pode esticar o limite de memória mesmo das máquinas com CPU 8088 ou equivalentes. Mas apenas para dados: elas não podem executar código ali armazenado. Portanto, nos XT, com CPU 8088 ou similar, a memória expandida é inútil para carregar programas. Mas as CPU evoluíram. Em 1984 a IBM lançou o primeiro AT, com a CPU 80286 da Intel, um chip que se comunica com a memória mediante um barramento de 16 bits e linhas de endereçamento de 24 bits, ampliando o limite de memória da máquina para 16Mb, o maior número que "cabe" em 24 bits. Quem tinha grana para tanto (os primeiros AT eram caríssimos) correu para o AT, pretendendo fugir do limite de 1Mb. E teve uma cruel decepção: o 80286, de fato, pode enxergar todos os 16Mb, mas o DOS permanecia enclausurado no primeiro mega. Portanto, quem continuava usando o DOS ficou mais ou menos na mesma. Mas não exatamente: a memória acima de 1Mb, ainda interditada ao DOS, pode ser usada, se bem que de forma um tanto limitada, apelando para o "modo protegido", uma característica do 80286. Mas somente para armazenar dados, não o código executável de programas. O trecho da memória situado acima de 1Mb ficou conhecido como "memória estendida". Note que, desde o ponto de vista da máquina, ela é memória RAM como qualquer outra. Quem faz a distinção é apenas o DOS. Durante muito tempo os únicos usos decentes para a memória estendida foram cache de disco, spoolers de impressora e discos RAM, carregados com seus drivers respectivos. Um uso pífio para um recurso ainda caro. Mas há uma exceção: o primeiro segmento acima de 1Mb. Este trecho, por razões que não cabem detalhar aqui (na verdade, um bug do 80286), pode ser acessado "enganando-se" o DOS. Desde que a máquina disponha de mais de 20 linhas de endereçamento, ou seja, use CPU 80286 ou superior. Este segmento foi denominado de "HMA", ou "memória alta", e pode ser utilizado para algumas gracinhas. A mais interessante das quais é carregar ali parte do código executável do próprio DOS. Uma enorme vantagem, já que até então o sistema tinha que ser carregado lá embaixo, na memória convencional, disputando com os programas um terreno precioso. As coisas somente melhoraram de fato quando foi lançado o 386, que com seus 32 bits pode endereçar até 4 gigabytes e simular um número virtualmente ilimitado de seus irmãos menores, os 8088, ensejando a execução de multitarefas. E muito mais. Entre outras coisas, permite que drivers e residentes sejam carregados em blocos baldios da memória acima dos 640K, trecho reservado perdulariamente pelo DOS para si mesmo. E desperdiçados, já que em geral menos da metade dos 384K disponíveis são usados. Estes blocos são chamados de UMB, ou "blocos de memória superior" e podem representar mais um notável alívio para os programas, que até então tinham que dividir seus exíguos 640K com residentes e drivers. É claro que o DOS não bobeou. Já que sua própria concepção o proíbe de transpor o limite de 640K para a memória convencional, buscou todos os meios e modos para esvaziá-la de tudo que pudesse ser jogado em outras regiões, liberando o maior espaço possível para programas, aproveitando-se das características da CPU 386. Mas estes recursos somente foram incorporados à versão 5.0. Portanto, se você usa o DOS 5.0 em um 386 ou 486, pode conseguir um notável aumento da memória convencional disponível para seus programas usando basicamente dois recursos: carregar parte do DOS na HMA (e ganhar quase 64K de memória convencional) e jogar nos UMB todos ou grande parte dos drivers e residentes (e neste caso o ganho depende da memória ocupada por eles). Logo veremos como saber quanta memória nossa máquina deixa livre para programas, onde os drivers e residentes são carregados e como fazer para carregá-los fora da memória convencional. Aguardem.

B. Piropo