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

< Jogando o DOS Para o Alto >


Hoje vamos liberar um bocado da memória convencional, literalmente jogando para o alto a maior parte do próprio DOS. E para se beneficiar disto, nem é preciso um 386: basta um AT 286. Só ficam de fora os velhos XT com suas CPU 8088 ou 8086. Primeiro vamos ver, resumidamente, como isto é possível. Usando uma imagem simples: o odômetro de um automóvel, aquele dispositivo que fica no velocímetro e vai inexoravelmente contando os quilômetros percorridos desde zero até 99999km. Você já reparou o que ocorre quando chega aos cem mil? Como o contador só dispõe de cinco algarismos, acontece aquilo que, em informática, chamamos de "estouro" (overflow): o odômetro subitamente rejuvenesce o carro, que em um passe de mágica vira zero quilômetro de novo. A CPU 8088, para a qual foi desenvolvido o DOS, somente pode enxergar endereços de memória que vão de zero até a posição imediatamente anterior a 1Mb - da mesma forma que o odômetro conta quilômetros de zero até o imediatamente anterior a cem mil. E pelas mesmas razões: a CPU 8088 lê endereços através de vinte linhas de endereçamento, que podem conter um bit cada. E o maior endereço que "cabe" em vinte bits é o imediatamente anterior a 1Mb. Mas há ainda uma particularidade: por questões pertinentes à própria arquitetura interna da CPU 8088, a memória não pode ser manejada como um campo contínuo: ela é "partida" em pedaços (ou segmentos) de 64K. Para apontar para um endereço, o 8088 usa dois números, armazenados em dois registradores internos: o primeiro guarda o endereço da base de um segmento e o segundo um "deslocamento" (de no máximo 64K) em relação à base. Para achar o endereço, basta somar os dois. Confuso, mas eficaz. Agora, imaginem o que acontece caso se "aponte" o registrador de segmento para o endereço mais alto, aquele que antecede a 1Mb: a CPU vai tentar somar a ele o deslocamento, e há o inevitável "estouro". Como no odômetro, os endereços tentam voltar a zero. No mínimo, a máquina "pendura". No máximo, acontecem coisas muito estranhas devido ao conflito de endereços. Isto, naturalmente, em um 8088, que só tem vinte linhas de endereçamento, batizadas de A0 até A19 (o "A" significa "adress", ou endereço). Mas acontece que um 286 não está sujeito às mesmas limitações, já que, com suas 24 linhas de endereçamento, "enxerga" 16 Mb (um 386 ou 486 tem 32 linhas e "enxerga" 4 Gigabytes). E alguns técnicos muito espertos descobriram uma forma de "enganar" o DOS usando uma artimanha curiosa: "apontam" o registrador de segmento para o endereço mais alto, imediatamente antes de 1Mb. E, em um 286 ou superior, habilitam a vigésima primeira linha de endereçamento, a A20 (não se esqueça que micros começam a contar de zero). Pronto: o "estouro", ao invés de voltar a zero, segue fagueiro pelo território situado logo acima de 1Mb, antes inexoravelmente destinado à memória estendida, e portanto inacessível ao DOS. Que agora pode alcançá-lo usando a linha de endereçamento A20. É uma pena que não possa ir muito longe, pois um segmento se estende no máximo por 64K. Mas já é uma grande ajuda. Este primeiro segmento da memória estendida é a nossa velha conhecida área de memória alta, ou HMA. Que pode ser usada para carregar qualquer programa, driver ou mesmo parte do próprio DOS. Mas tem uma limitação: só atende a um único freguês. Isto quer dizer que se você carregou lá um programinha residente de 4K, desperdiçou 60K, todo o resto do segmento. Portanto, o bom senso indica que deve se carregar na HMA o maior dentre seus possíveis ocupantes. Que, salvo raras exceções, é o próprio DOS. Mas chega de blá-blá-blá: vamos ver como, na prática, se pode carregar o sistema na HMA. Como ela faz parte da memória estendida, é indispensável o concurso do gerenciador de memória estendida que acompanha o DOS, o Himem.Sys. E como, adiante, usaremos a mesma memória estendida para outros fins, o bom senso recomenda que o driver seja carregado antes de qualquer outra coisa. Então, verifique se a primeira linha de seu Config.Sys é: DEVICE=HIMEM.SYS Se não for, inclua-a. E copie o arquivo Himem.Sys para o diretório raiz do disco de boot (ou inclua sua via de diretório logo após o sinal de igual). E, se a linha já lá estiver mas não for a primeira, mova-a para o começo do arquivo. Pronto: seu driver de memória estendida está instalado e você já pode usar a HMA. Mas isto não basta, pois sabemos que ela pode ser ocupada por qualquer programa. E a queremos para o DOS. Então inclua, ainda no Config.Sys, em qualquer ponto depois da linha que carrega o Himem.Sys, uma outra que - por enquanto - deverá conter apenas: DOS=HIGH Pronto: isto é o suficiente para jogar para o alto a maior parte do código executável do sistema operacional, desimpedindo um belo naco da memória convencional. Agora, para ter a certeza que a coisa funcionou, dê novo boot - pois alterações no Config.Sys somente fazem efeito após o boot - e rode o Mem.Exe, como aprendemos semana passada. Repare na última linha: lá deve constar, fulgurante, a mensagem informando que o DOS agora está na HMA. Pois é isto. Se você examinar o manual do DOS, ou qualquer bom livro sobre o DOS 5, vai descobrir que o Himem.Sys também tem parâmetros. Mas não se preocupe com eles: na imensa maioria dos casos são absolutamente desnecessários, já que se destinam a fazer face a situações especialíssimas. Todas as probabilidades são que, ao incluir estas duas linhas no Config.Sys de sua máquina, você ganhará umas boas dezenas de kilobytes para carregar seus programas na memória convencional. Mas não é só: semana que vem vamos ver como jogar nos UMB um monte de drivers e residentes. Até lá.

B. Piropo