Sítio do Piropo

B. Piropo

< Coluna em Fórum PCs >
Volte
19/05/2008

< Vista: por que Vista32 >
<
não “enxerga” 4 GB? >


Boa parte das reclamações sobre o Vista têm a ver com o tema “memória”, seja primária (RAM), seja secundária (funcionamento do disco rígido). As mais comuns são:

- Mesmo que se instale 4 GB de memória RAM (o máximo suportado por um barramento de 32 linhas como os dos processadores “de 32 bits”) Vista não consegue usar toda a capacidade instalada;

- Windows Vista exige memória “demais”;

- Além disso, por mais que se aumente a capacidade de memória RAM instalada, Vista a consome quase toda (e alguns acrescentam que esse “uso excessivo” de memória torna o desempenho mais lento);

- Independente da capacidade de memória RAM disponível, o disco rígido parece não “parar” jamais, mantendo-se em funcionamento mesmo quando não se está carregando qualquer programa, gravando arquivos ou pesquisando dados (e alguns atribuem – erroneamente – esta aparentemente incessante atividade à necessidade de acesso ao arquivo de troca da memória virtual – que em Windows Vista chama-se “page file” – devido à insuficiência de memória RAM).

Resumindo: a impressão que se tem das reclamações sobre memória é que os usuários que as fazem acham que Vista precisa de muita memória porque não consegue administrá-la bem. Na verdade o que ocorre é exatamente o oposto: Vista requisita muita memória porque aperfeiçoou a forma pela qual Windows XP a administra e com isto conseguiu uma melhoria apreciável no desempenho. Mas vamos por partes.

Começando pelo primeiro ponto, como convém: qual o máximo de capacidade de memória RAM instalada que é efetivamente liberada para uso da versão Vista32?

No que diz respeito a este tópico devo começar, humildemente, corrigindo a mim mesmo e me desculpando pelo erro cometido. Pois embora na coluna “Vista exige muita máquina. Será?” eu tenha até mostrado figurinha e coisa e tal demonstrando que minha instalação de Vista32 reconhece a totalidade dos 4 GB de memória RAM instalada (o que é verdade) eu não informei – porque não me dei conta do que vou explicar adiante – que embora reconhecendo todos os 4 GB de memória instalada, a versão de 32 bits apenas é capaz de utilizar efetivamente para o código do sistema operacional, dados e programas, apenas uma fração dela, mais exatamente 3,25 GB.

A razão, por paradoxal que pareça, é essencialmente a mesma que impedia que programas DOS usassem mais de 640 KB de memória RAM: o restante, até o limite de 1 MB (o máximo de memória acessível por um barramento de endereços de 20 linhas como o do i8086/8088 para o qual o sistema foi desenvolvido) era memória reservada para fins específicos.

Destrinchemos.

O maior número que pode ser escrito com 20 bits (em binário, naturalmente) é a vigésima potência da base 2, que corresponde a 1.048.576 (1 M). Logo, endereços maiores que 1 M jamais poderiam ser acessados pelo simples fato de que não “caberiam” no barramento. E como, na época do desenvolvimento do DOS, 1 MB era uma capacidade de memória inimaginável (a maioria dos micros “de 8 bits” vinham com 16 KB de memória RAM e o primeiro PC da IBM foi fabricado com 64 KB que poderiam ser estendidos até, imaginem, 256 KB!) os responsáveis pelo desenvolvimento do DOS decidiram reservar os endereços que ocupavam os 384 K do final do espaço de endereçamento para uso exclusivo de tabelas e rotinas usadas pelas placas controladoras e por algumas funções do sistema operacional. Por isso sobraram apenas os 640 K iniciais para código e dados.

Já o máximo de memória acessível por um barramento de endereços de 32 bits (para o qual foram desenvolvidos os “sistemas operacionais de 32 bits”) é a trigésima segunda potência de 2, que corresponde a 4.294.967.296 (4 G), que é por conseguinte o maior endereço que “cabe” no barramento. Mas, também neste caso, uma parte (sempre a parte superior) do “campo de endereçamento” precisa ser reservada para uso do sistema.

Que uso?

Essencialmente, o mesmo uso que o DOS fazia do trecho superior do espaço de endereçamento do microprocessador i8080/8088 para o qual foi desenvolvido: comunicar-se com os dispositivos de Entrada/Saída, ou periféricos.

Vamos logo para o exemplo mais esclarecedor, o da controladora de vídeo.

Para exibir uma tela no vídeo é preciso “desenhá-la” antes na memória, ponto a ponto (ou pixel a pixel, para quem preferir). E isto gasta um bocado de memória. Por exemplo: uma singela tela SVGA clássica de 1024 x 768 pontos, onde cada ponto pode assumir 16 milhões de cores (número expresso com três bytes), precisará armazenar 1024 x 768 x 3 = 2.308 KB ou 2,25 MB (não esqueça: 1K = 1.024 e 1 M = 1.024 x 1.024 = 1.078.576).

E onde ficam armazenados esses bytes? Ora, na memória de vídeo, naturalmente.

Mas os circuitos integrados (“chips”) da memória de vídeo ficam na controladora (“placa”) de vídeo, não na placa-mãe. Portanto os dados correspondentes aos pontos da tela não ocuparão qualquer posição (física) da memória principal, ou memória RAM.

Mas acontece que há programas (por exemplo, qualquer editor de imagens de terceira categoria) que fazem modificações na tela independentemente do sistema operacional. Como, por exemplo, desnudar certas divas da MPB e transformá-las em seres de corpos esculturais, inconspurcados por uma celulite sequer, para expor suas fotos em revistas especializadas (não em MPB, no caso das fotos). E para que um programa possa alterar o conteúdo de uma posição de memória é preciso que tenha acesso a ela.

Mas se posições de memória somente podem ser acessadas através de seus endereços e somente as posições da MP têm endereços, como fazer com que um programa tenha acesso a uma “posição de memória” que está, fisicamente, fora da memória principal?

Pois é aí que a porca torce o rabo (para as novas gerações, que não conhecem o ditado, convém esclarecer que a frase não se refere às divas da MPB acima citadas, embora algumas de fato o torçam para tirar as fotos). Para atribuir endereços às posições de memória situadas na controladora de vídeo de modo que os programas possam acessá-las é preciso, literalmente, “roubar” estes endereços (lógicos) do espaço de endereçamento da memória RAM, ou MP.

A isto se chama “mapear” a memória. Funciona assim: os chips (físicos), com suas posições de memória que guardam os pontos que formam a imagem, estão na placa de vídeo. Mas o sistema se refere a eles como se eles estivessem ocupando um trecho da MP situado próximo ao final do espaço de endereçamento. Ou seja: endereços (lógicos) de MP são usados para “apontar” (ou “se referir a”) posições de memória (físicas) situadas em uma placa controladora de E/S (no caso, a placa de vídeo).

Nos tempos do velho DOS e do barramento de endereço de 20 bits, os endereços usados para “mapear” o vídeo situavam-se acima de 640 K (o trecho de 640 K a 768 K era reservado para o vídeo, embora nem todo fosse usado). Hoje, nos tempos dos barramentos de 32 bits, estes endereços situam-se bastante acima dos 4 G.

Se você usa Windows XP ou mesmo Windows Vista em uma máquina com, digamos, 2 GB de memória RAM instalada, mesmo que você use uma placa controladora de vídeo com, por exemplo, 512 MB de memória de vídeo, isso não terá qualquer influência no uso de sua memória RAM. Como os endereços das posições de memória RAM se estendem de zero até 2 G e os 512 MB de memória de vídeo serão “mapeados” em (ou seja, ocuparão os endereços de) um trecho do espaço (lógico) de endereçamento próximo aos 4 G, uns não interferirão com os outros.

Agora imagine que você tenha povoado os quatro “slots” de memória de sua placa-mãe instalando neles quatro módulos de 1 GB em uma máquina com Windows Vista32. Que por acaso usa uma controladora de memória com 256 MB de memória de vídeo.

Em princípio, uma coisa nada tem a ver com a outra. A memória (física) de vídeo está instalada na controladora de vídeo. Já a memória (física) RAM está instalada na placa-mãe. E ambas poderiam viver felizes para sempre em total harmonia não fosse a necessidade de “mapear” a memória de vídeo nos endereços (lógicos) próximos ao final do espaço de endereçamento. Que, neste caso, estão ocupados por posições de memória (físicas) situadas nos chips de memória RAM.

Isso ocorre porque, nesta situação particular, o espaço de endereçamento (que em sistemas operacionais “de 32 bits” não pode exceder 4 G) está totalmente ocupado com memória física. Afinal, todos os 4 GB possíveis foram instalados e cada byte ocupa um endereço. Onde encontrar endereços “vazios”?

Sim, você adivinhou: não há endereços vazios. Com 4 GB de memória RAM (física) instalada na placa-mãe, todos os endereços do espaço (lógico) de endereçamento estão ocupados.

Não obstante a memória de vídeo ainda precisa ser mapeada. Não há como evitar isso já que, se não o for, o software não pode se comunicar com o vídeo e nenhuma alteração na tela seria possível.

A saída é “roubar” endereços (lógicos) de trechos de memória próximos ao final do espaço de endereçamento mesmo que estejam ocupados com memória física. Estes endereços (lógicos) serão atribuídos às posições de memória (física) instalada na placa de vídeo, que assim poderão ser acessadas pelo software.

O problema é que as posições de memória RAM (física) instaladas na placa-mãe cujos endereços foram “seqüestrados” para serem usados pela memória da placa de vídeo já não podem ser endereçadas. Resultado: mesmo presentes na placa-mãe, estas posições não poderão ser acessadas seja pelo software, seja pelo sistema operacional, já que não há outra forma de acessar memória RAM que não por seu endereço e aquelas posições de memória RAM já não mais possuem endereços (ou melhor: possuem, mas não podem usá-los porque eles foram atribuídos a posições de memória situadas alhures).

Infelizmente não é apenas a memória de vídeo que se serve do mapeamento. Embora seja ela a responsável pelo maior consumo de endereços lógicos, outros dispositivos também apelam para o mesmo alvitre, como controladoras de rede, áudio, controladoras SATA e tudo o que está ligado ao barramento PCI.

Isso não ocorre apenas com Vista32, naturalmente. Qualquer sistema operacional “de 32 bits” mapeia a memória usada para se comunicar com dispositivos de E/S “roubando” endereços do trecho superior do espaço de endereçamento (sempre acima de 2 GB – e é por isso que Windows 98 não consegue acessar mais de 2 MB de memória RAM: no caso de Win 98, acima de 2 M todos os endereços estão reservados para mapeamento).

Figura 1: Endereços mapeados.

Quer ver que dispositivos de E/S conectados à sua máquina ocupam endereços mapeados na MP? Seja em Windows XP, seja em Windows Vista, carregue o utilitário de informações do sistema (acione o menu Iniciar e digite “msinfo32.exe” seguido de ENTER na caixa “Executar” do XP ou use a caixa “Iniciar pesquisa” do Vista para localizar o programa e o execute clicando em seu nome), expanda a chave “Recursos de hardware” e clique no ramo “Memória” para mostrar uma janela parecida com a da Figura 1 (que foi obtida em uma máquina rodando Vista64 mas que serve igualmente para ilustrar o tema já que os endereços “mapeados” se situam na mesma faixa). Veja, na coluna “Dispositivo” do painel direito, a lista de dispositivos que usam endereços de memória. E, na coluna “Recurso”, veja a faixa de endereços atribuída (“mapeada”) a cada um deles (em hexadecimal). Repare como quase todos se situam bem acima de 0xC0000000, que corresponde a 3 GB (os que se situam abaixo deste endereço são obrigados a isso por questões de compatibilidade com antigos padrões de acesso a periféricos).

Por todas estas razões, em Vista32, os endereços correspondentes ao trecho final do espaço lógico de endereçamento são reservados para uso exclusivo do mapeamento de endereços de dispositivos de E/S. Sobram apenas 3,25 G de endereços para serem atribuídos às posições de memória RAM. Por isto, mesmo que você disponha de, digamos, 4 GB de memória (física) RAM instalados na placa-mãe, apenas os primeiros 3,25 GB poderão ser usados. O resto até pode ser reconhecido (ou seja, ter sua presença identificada) por Vista32 SP1, mas não poderá ser usado pelos programas ou pelo sistema operacional.

Alguns comentários às colunas anteriores citaram uma funcionalidade denominada Physical Address Extension, ou PAE, que permite a sistemas de 32 bits usarem mais de 4 GB de memória física. De fato, a funcionalidade existe e mais informações sobre ela podem ser encontradas no artigo “Physical Address Extension” da < http://msdn.microsoft.com/en-us/library/default.aspx > MSDN. Mas ela depende de características do hardware e seu objetivo não é contornar o problema de mapeamento de memória, mas habilitar funções avançadas como o DEP (Data Execution Prevention) e NUMA (Non-Uniform Memory Access), portanto mesmo com o PAE habilitado a memória dos dispositivos de E/S continuará sendo mapeada nos mesmos endereços correspondentes ao final dos primeiros 4 G (note que a função do PAE é permitir acesso a endereços de memória RAM acima dos 4 G, portanto não resolve o problema de máquinas com apenas 4 GB de memória física instalada).

Portanto, espero ter esclarecido devidamente o primeiro ponto: Vista32 SP1 reconhece os 4 GB de memória instalada porque eles estão efetivamente instalados (a versão Vista32 sem o SP1 reconhecia apenas o trecho de memória acessível). Mas o fato de reconhecê-los não significa que possa ter acesso a eles. Ficam efetivamente acessíveis ao sistema apenas os primeiros 3,25 GB de RAM instalada. O restante permanece lá, porém inútil, já que seus endereços foram reservados para mapeamento de memória de dispositivos de E/S – estejam ou não estes dispositivos instalados.

Na próxima coluna discutiremos o assunto “memória demais” e veremos se são realmente demasiadas as exigências de Vista.

 

B. Piropo