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

< Contornando Desastres >


E se, nas nossas tentativas de carregar programas e drivers nos UMB, algo deu errado? Bem, "dar errado", neste contexto, tem significados distintos que vão desde o programa se recusar a funcionar nos UMB até a máquina "pendurar".

Comecemos pelo pior: a máquina simplesmente se recusa a dar boot depois que um determinado driver ou residente foi para os UMB. Se isto acontecer, mantenha a calma que a situação está sob controle: coloque o disquete de boot no drive A e reinicialize a máquina (se o micro continuar empacado, pare de suar frio e lembre-se de reabilitar o boot do drive A no setup. Se continuar empacado depois disto, volte a suar frio). Depois, edite o Config.Sys ou Autoexec.Bat e remova dos UMB o último freguês, o mais provável responsável pelo problema. Dê novo boot do drive C e tente carregar os demais: uma batalha perdida não deita a guerra a perder.

Outra hipótese: a máquina dá boot, mas o residente ou driver teima em não funcionar. O que é relativamente comum, já que alguns fregueses (particularmente os drivers de dispositivos SCSI) não funcionam nos UMB. Menos mal: edite o Autoexec ou Config, faça-o retornar à memória convencional e continue com os demais.

Finalmente: tudo corria bem até um dado momento a partir do qual todos os novos fregueses se recusam a funcionar nos UMB. Neste caso, muito provavelmente o trecho da memória onde o sistema tenta carregá-los está sendo usado por algo que enganou Mem.Exe, fazendo-o pensar que o bloco está livre (quase que com certeza trata-se de código gravado em ROM nas placas adaptadoras). Neste caso, basta avisar ao Emm386.Exe para não usar esta área por meio do parâmetro "X", de "exclude". Por exemplo: suponha que tudo que se tenta carregar em um bloco aparentemente livre que começa em D8000h resulta em fiasco. Use o parâmetro "X" para excluir os 32K que começam no endereço D8000h e acabam em DFFFFh. A linha do Config.Sys que carrega o Emm386.Exe fica assim:

device=emm386.exe ram x=d800-dfff

(use endereços em hexadecimal e não inclua o último dígito, já que só podem ser usados endereços múltiplos de 16 bits). Funcionou? Muito bem. Agora, reduza em 4K o trecho excluído, entrando com o parâmetro X=d800-deff. Continue reduzindo, sempre de 4K em 4K até o problema surgir de novo. E use o último que funcionou. Não deu certo? Procure excluir outro trecho que Mem.Exe informa estar livre. Com paciência e engenhosidade, dá para se divertir um bocado brincando com endereços em hexa. O parâmetro "X" é muito útil. O difícil é identificar o trecho a ser excluído.

O Emm386.Exe também permite incluir trechos de memória com o parâmetro "I". Pois, por default, ele apenas procura blocos livres nos segmentos que começam em C0000h e D0000h, o que nos dá um máximo teórico de 128K. Como certamente parte deles está sendo usada por código em ROM, sobra relativamente pouco para os drivers e residentes. Com o parâmetro "I" pode-se ampliar a área dos UMB.

Mas depende do sistema. Por exemplo: os 128K iniciais, que correspondem aos segmentos A0000h e B0000h, pertencem à memória de vídeo. Se seu vídeo é VGA, desista deles: estão sendo totalmente usados. Mas o CGA usa apenas 16K que começam no endereço B8000h. Com ele, pode-se ganhar mais 112K incluindo os trechos dedicados à memória de vídeo e não utilizados. A linha do Config.Sys fica:

device=emm386.exe ram i=a000-b7ff i=bc00-bfff

(os parâmetros "I" e "X" podem ser usados mais de uma vez). Se sua placa de vídeo for EGA, ganhe 32K com i=b800-bfff. Se for Hercules, ganhe 64K com i=a000-afff. E se for a velha placa mono, você pode ganhar mais 124K com os parâmetros i=a000-afff i=b100-bfff. Mas, nesse caso, melhor trocar de placa.

Quem usa VGA tem que garimpar memória em outras plagas. E não há muita coisa disponível. A não ser que se abstenha de usar memória expandida - para cuja "moldura" o Emm386.Exe reserva 64K. Para quem usa Windows e carrega todos os demais programas a partir dele, a coisa fica fácil: Windows não usa memória expandida, mas pode simulá-la quando algum programa a requisita. Os usuários de Windows (e todos aqueles que têm certeza que nenhum de seus programas usa memória expandida - o que é mais comum do que parece) podem então ganhar mais 64K inibindo a emulação deste tipo de memória por meio do parâmetro "noems". A linha do Config.Sys fica:

device=emm386.exe noems

(o parâmetro noems substitui o parâmetro ram, já que não faz sentido usá-los juntos: ram habilita os UMB e a memória expandida, enquanto noems habilita os UMB e desabilita a memória expandida).

Os demais parâmetros não são mutuamente exclusivos e você pode misturá-los à vontade: use tantos "I" e "X" quanto for preciso, combinando-os com ram ou noems, conforme suas necessidades. Com um pouco de sorte, muito engenho e alguma arte você pode conseguir milagres. E chegar perto de 636.000 bytes livres de memória convencional (cerca de 620K, já que 1K vale 1024 bytes) - o máximo que consegui até agora. Tente. Se passar disto, considere-se um mago da memória. E me avise, para comemorarmos.

 

B. Piropo