Micro Cosmo
Volte
08/07/96

< Enganando o DOS >


Como vimos semana passada, estando em modo real para rodar o DOS, mesmo um 286, que alcança até 16Mb de memória com suas 24 linhas de endereçamento, “estoura” a memória assim que tentar acessar o primeiro endereço acima de 1Mb. Algo semelhante ao odômetro de seu carro quando chega a 99.999km e volta ao zero.

Mas acontece que o odômetro do carro conta os quilômetros de um em um. Já o contador de endereços do 286 “conta” as posições de memória usando o engenhoso esquema segmento/deslocamento que conhecemos, “partindo” cada endereço em um segmento e um deslocamento, ambos de 16 bits, e combinando-os de forma a montar um número de 20 bits. O modo de combiná-los é simples: acrescenta-se quatro zeros ao número binário que representa o segmento e soma-se o resultado ao deslocamento.

Isto abre uma possibilidade interessante. Veja lá: vamos encontrar a base do último segmento, o mais alto, de valor mais elevado. Para isto basta preencher todos os 16 bits do registrador de segmentos com o valor “um”. O que resulta, como sabemos, no número 65535. Agora, vamos multiplicá-lo por 16 (o que corresponde a acrescentar quatro zeros ao seu valor expresso em binário). O resultado será 1.048.560. Exatamente o valor obtido ao se subtrair 16 do número que representa 1Mb (não se esqueça que 1Mb é 1.024 x 1.024 bytes, e não um milhão de bytes). Se isto lhe pareceu complicado, esqueça os detalhes e guarde apenas o essencial: o valor mais alto para o qual o registrador de segmentos pode “apontar” corresponde a um segmento que se inicia apenas 16 bytes abaixo de 1 Mb.

Ora, mas em uma máquina que dispõe de mais de 1Mb de memória na placa-mãe, se eu conseguir usar este “ultimo” segmento, consigo enganar o DOS, romper a barreira de 1Mb e ganhar quase 64K de memória. E isto acontece porque como cada segmento contém 64K (não importando onde comece), se usarmos o segmento que começa apenas 16 bytes abaixo de 1Mb, seu final se estenderá quase 64K acima do primeiro mega (para ser exato, 64K menos 16 bytes). O que representa um ganho de quase 64K, um valor nada desprezível.

Só há um problema: para acessar qualquer endereço acima de 1Mb, usando ou não o esquema segmento/deslocamento, é preciso exprimir seu valor em binário e transportá- lo para as linhas de endereçamento. Valores superiores a 1Mb expressos em binário correspondem a números com mais de vinte dígitos. O que significa que será necessário usar mais de vinte linhas de endereçamento.

B. Piropo