Limites no endereçamento da memória

Assim como no caso dos HDs, existiram diversos limites com relação ao endereçamento da memória RAM durante a história dos micros PCs, causados por limitações do sistema operacional, limitações do chipset e limitações dos processadores. Mesmo os processadores e sistemas operacionais de 64 bits possuem limites com relação à quantidade máxima de memória que pode ser endereçada, embora muito mais elevados. As versões originais do Athlon 64 são capazes de endereçar até 1 terabyte de memória RAM (independentemente da placa-mãe usada) e este limite pode ser expandido no futuro. O grande problema são os processadores e os sistemas operacionais de 32 bits.

Tudo começou com o limite de 640 KB de memória do processador 8088, usado nos primeiros PCs. Na verdade, o 8088 utilizava um total de 20 bits para o endereçamento da memória, divididos em 16 bits “nativos”, que permitiam endereçar páginas de 64 KB e mais 4 bits adicionais, que permitiam endereçar 16 páginas, totalizando 1 MB.

Por decisão da equipe de desenvolvimento, apenas os primeiros 640 KB (chamados de memória convencional) ficavam disponíveis para uso do sistema operacional e aplicativos. Os 384 KB restantes (chamados de memória extendida) eram usados para endereçar a memória presente em outros dispositivos, como o BIOS da placa-mãe e a memória da placa de vídeo.

Na época dos primeiros PCs, a memória RAM era muito cara, de forma que não era comum o uso de mais do que 256 KB, mas, mesmo que fosse utilizado 1 MB completo, apenas os primeiros 640 KB ficariam disponíveis. Os 384 KB adicionais podiam ser utilizados para fazer cache do BIOS e da memória da placa de vídeo (o que melhorava o desempenho), mas não para uso geral.

Para manter compatibilidade com os aplicativos antigos, mesmo os processadores atuais são capazes de operar em modo real, onde simulam o funcionamento de um 8088, acessando apenas os primeiros 640 KB de memória. É dentro deste limite que rodam o MS-DOS e aplicativos antigos. Quando o Windows, Linux ou qualquer sistema operacional é carregado, o processador passa para o modo protegido, onde é capaz de acessar toda a memória disponível.

Desde o 386, todos os processadores utilizam 32 bits para o endereçamento da memória, o que permite endereçar até 4 GB. Esse limite é chamado de VAS (Virtual Address Space) e indica justamente o total de memória que o sistema é capaz de endereçar, incluindo não apenas a memória RAM, mas também a memória da placa de vídeo e outros dispositivos. O problema reside justamente aí.

Imagine que você resolvesse montar um PC topo de linha, usando 4 GB de memória RAM e duas placas de vídeo GeForce 7950 GX2 em SLI. A 7950 GX2 possui nada menos do que 1 GB de memória RAM, de forma que duas placas totalizam 2 GB. Como a memória das placas de vídeo consomem espaço do Virtual Address Space, o sistema seria capaz de acessar apenas os primeiros 2 GB da memória (um pouco menos na prática, já que mais alguns blocos serão reservados a outros dispositivos), de forma que usar 4 GB acabam sendo um desperdício de dinheiro.

Isso ocorre não apenas ao utilizar um processador de 32 bits, mas também ao utilizar um processador de 64 bits em conjunto com um sistema operacional de 32 bits, incluindo o Windows XP e as versões de 32 bits do Vista.

De uma forma geral, não é recomendável utilizar mais do que 3 GB ao utilizar um sistema operacional de 32 bits, pois é justamente a área entre os 3 e 4 GB do Virtual Address Space que são utilizadas pelo processador para endereçar a memória de dispositivos diversos. Assim como dois corpos não podem ocupar o mesmo espaço ao mesmo tempo, dois dispositivos não podem compartilhar a mesma área de endereços, o que faz com que porções da memória RAM que invadam áreas reservadas a outros dispositivos simplesmente não sejam vistas pelo sistema.

Você pode verificar as áreas de memória reservadas através do gerenciador de dispositivos do Windows, usando a opção Exibir > Recursos por tipo > Memória:

Os endereços fornecidos aqui estão em hexa, mas você pode usar a própria calculadora do Windows para convertê-los em números decimais. No caso, por exemplo, tenho a placa de vídeo utilizando os endereços C8000000 a CFFFFFFF, que correspondem aos bytes de 3.355.443.200 a 3.489.660.927 e uma série de dispositivos a partir do “Recursos da placa-mãe” que ocupam praticamente todos os endereços do byte 3.758.096.384 ao 4.294.967.295 (que corresponde justamente ao final da área de 4 GB endereçada pelo sistema). Se instalasse uma placa 3D offboard, com 256 MB, ela ocuparia os bytes de 3.221.225.472 a 3.489.660.927, que correspondem justamente aos 256 MB da placa.

Se você se contentar em utilizar uma placa de vídeo low-end, pode ficar com até 3.5 GB de endereços disponíveis, dependendo do sistema operacional usado.

No caso das versões de 32 bits do Vista, por exemplo, o limite máximo (segundo o http://support.microsoft.com/kb/929605) é de 3.12 GB. Ou seja, na maioria dos casos, não vale a pena pagar por mais 4 GB de memória, já que apenas uma pequena parte do último GB seria utilizada. Melhor se contentar com 3 GB.

Mesmo ao utilizar um processador de 64 bits, combinado com um sistema operacional de 64 bits, um grande volume de endereços entre os 3 e 4 GB de memória continuam reservados, de forma a manter compatibilidade com os programas de 32 bits, fazendo com que, novamente, pelo menos 512 MB entre os 3 e 4 GB da memória não sejam usados. A vantagem nesse caso é que você pode instalar mais de 4 GB de memória. Com 8 GB, por exemplo, você ficaria com de 7 a 7.5 GB utilizáveis.

Algumas placas de 64 bits oferecem a opção “Memory Hole Remapping” (ou similar) no setup. Ao ativar esta opção, as áreas de memória reservadas aos dispositivos é movida para uma área mais alta do Virtual Address Space (que nos processadores de 64 bits é muito maior), liberando a maior parte da memória antes inacessível por causa deles.

Outras placas suportam o Memory Hoisting (da palavra “hoist”, que significa levantar ou suspender), um recurso que segue outro princípio, deixando os endereços dos dispositivos onde estão e remapeando os trechos de memória subscritos por eles para áreas mais altas do espectro de endereços, permitindo que o sistema tenha acesso a elas.

Uma observação é que estas duas opções causam muitos problemas de compatibilidade com aplicativos, por isso você só deve utilizá-las caso realmente faça questão de ter acesso à toda a memória instalada.

Além das limitações relacionadas ao Virtual Address Space, existem outros limites de memória, impostos pelo chipset ou por limitações do sistema operacional usado.

A maioria dos chipsets antigos, para placas soquete 7, por exemplo, eram capazes de endereçar apenas 128 ou 256 MB de memória RAM. O chipset Intel i815, usado em uma grande parte das placas para processadores Pentium III e Celeron era capaz de endereçar apenas 512 MB, enquanto o 915GL (para o Pentium 4) era capaz de endereçar 2 GB. Até pouco tempo atrás, o suporte a 4 GB ou mais de memória estava restrito a alguns chipsets destinados a servidores.

O Windows 95/98/SE é capaz de endereçar até 512 MB de memória RAM. Programas como o cacheman permitem utilizar estas versões antigas do Windows em PCs com mais de 512 MB de RAM, mas o desempenho acaba sendo pior do que com apenas 512.

O Windows XP e as versões de 32 bits do Vista são capazes de endereçar 4 GB, de forma que o limite fica por conta do Virtual Address Space. O maior problema são as versões “populares” do Windows, onde o limite é artificialmente reduzido, de forma a restringir o uso do sistema aos PCs de baixo custo. O XP Starter possui um limite de 256 MB, enquanto o Vista Starter está limitado a 1 GB.

Nas versões de 64 bits do Vista, os limites são estendidos, mas ainda existem limitações. O Vista Home Basic está limitado a 8 GB, o Home Premium a 16 GB e as demais versões (Business, Enterprise e Ultimate) a 128 GB.

A memória swap não entra na conta, pois ela é acessada através de um componente especializado incluído no processador, chamado de MMU (Memory Management Unit) que permite justamente que dados armazenados na memória RAM física sejam movidos para a memória swap (que é na verdade um arquivo ou partição no HD), conforme necessário.

Graças ao MMU é possível complementar os 3 ou 3.5 GB de memória RAM física com uma quantidade indefinida de memória swap, limitada apenas ao máximo suportado pelo sistema operacional. A principal questão é que o uso da memória swap é muito limitado em um PC atual, já que ela é muito lenta.

Uma dúvida comum é com relação ao uso do PAE (Physical Address Extension), uma extensão para processadores de 32 bits, presente desde o Pentium Pro, que adiciona 4 bits adicionais ao endereçamento da memória, permitindo que o processador seja capaz de acessar até 16 páginas de 4 GB cada, totalizando 64 GB. Cada programa continua restrito a um máximo de 4 GB, mas o sistema pode alocar diferentes páginas para aplicativos diferentes, utilizando assim toda a memória disponível.

O PAE é muito usado em servidores, embora esteja sendo rapidamente substituído pelo uso de processadores e sistemas operacionais de 64 bits. Ele é suportado pelo Windows Server 2003 e pelo Windows 2000, onde pode ser ativado através da opção “/PAE” no arquivo boot.ini, mas não é uma solução viável para quem precisa usar mais do que 4 GB de memória em um desktop, devido a uma série de problemas relacionados a drivers.

O PAE apresenta endereços de 64 bits aos drivers, o que torna necessário que eles sejam modificados para utilizar o sistema. Como o uso do PAE sempre foi limitado a servidores, muitos dispositivos não possuem drivers compatíveis e nem sempre é fácil encontrar os disponíveis. Existem ainda problemas de compatibilidade com diversos aplicativos. Atualmente, é muito mais simples migrar para as versões de 64 bits do Vista (ou mesmo para o XP de 64 bits) do que passar a utilizar o PAE, de forma que é melhor não perder tempo com ele no caso dos desktops.

Outro problema fundamental do PAE é a questão do desempenho. O processador continua sendo capaz de acessar apenas 4 GB de memória por vez e precisa chavear continuamente entre as páginas disponíveis. Além de demorar um certo tempo, cada chaveamento faz com que os dados armazenados nos caches precisem ser completamente substituídos, o que prejudica de forma perceptível o desempenho. Ou seja, tentar usar o PAE em um desktop para acessar mais memória e assim melhorar o desempenho é simplesmente contra produtivo. 🙂

Uma observação importante é que todas as versões do Windows XP, a partir do SP2 tem o PAE desativado, justamente para evitar problemas de compatibilidade. Nele, a opção “/PAE” no boot.ini simplesmente não faz nada.

No caso do Linux, o modo de acesso à memória é escolhido durante a compilação do Kernel.

Ao utilizar um processador de 32 bits, o Linux oferece suporte nativo a até 4 GB de memória usando o modo normal de operação do processador e a até 64 GB usando o PAE. Ou seja, ele simplesmente acompanha o suporte disponível no hardware, sem nenhuma limitação adicional.

Para melhorar o desempenho do sistema em máquinas antigas, que utilizam 1 GB de memória ou menos, existe uma terceira opção, onde o Kernel endereça apenas 1 GB de memória, sendo que 896 MB ficam disponíveis para os aplicativos e o restante é reservado para uso do Kernel. Neste modo de operação, o comando “free” vai reportar que existem apenas 896 MB de memória disponível, mesmo que você possua 1 GB ou mais.

É possível escolher entre as três opções ao compilar o Kernel, na opção “Processor Type and Features > High Memory Support”. Até por volta de 2005, muitas distribuições vinham com o suporte a apenas 1 GB ativado por padrão, mas atualmente a grande maioria utiliza a opção “4 GB”. É possível mudar a opção ao recompilar o Kernel manualmente.

A desvantagem de ativar o suporte a 4 GB é que o sistema ficará um pouco mais lento em micros com menos de 1 GB de memória (justamente por isso existe a primeira opção). O suporte a 64 GB só pode ser ativado caso você esteja usando um processador com suporte ao PAE, além de uma placa-mãe compatível.

Naturalmente, tudo isso se aplica apenas ao usar uma distribuição com um Kernel compilado para processadores de 32 bits. Ao usar uma versão de 64 bits, o Kernel acessa toda a memória disponível, limitado apenas ao volume de memória suportado pelo chipset ou processador.

Voltando ao mundo Windows, existe mais uma limitação importante, que é o limite de 2 GB por aplicativo. Os 3, 3.12 ou 3.5 GB de memória que um sistema de 32 bits é capaz de endereçar é repartida entre todos os programas abertos, mas no caso do Windows, cada programa sozinho não pode usar mais do que 2 GB.

Isso acontece por que, assim como o sistema operacional, os programas de 32 bits endereçam a memória utilizando endereços de 32 bits e por isso são capazes de endereçar 4 GB de memória. No Windows, metade da faixa de endereços de cada programa é reservada para uso do kernel, sobretudo para a comunicação entre o sistema operacional e o aplicativo. Com isso, cada aplicativo fica com apenas metade da sua área de endereços disponível, o que limita seu uso de memória a 2 GB.

Isso vem se tornando uma limitação importante em alguns games e aplicativos pesados, que podem exceder este limite nos momentos de maior atividade. Pior, além de não acessarem toda a memória disponível, os aplicativos de 32 bits freqüentemente travam sem aviso ao romper a barreira dos 2 GB, exibindo alguma mensagem de erro genérica.

Este limite está profundamente enraizado no sistema, de forma que é quase impossível que ele venha a ser removido em futuras versões. Ele afeta tanto quem utiliza as versões de 32 bits do Windows (com mais de 2 GB de memória RAM instalada), quanto quem roda programas de 32 bits sobre as versões de 64 bits do Windows (neste caso o limite se aplica apenas aos aplicativos de 32 bits, naturalmente).

Uma forma de amenizar o problema, caso você esteja enfrentando problemas de travamento em algum game pesado, por exemplo, é modificar a divisão de endereços entre o aplicativo e o kernel.

No Windows XP é possível reservar 3 GB para os aplicativos através da opção “/3gb” no arquivo boot.ini. Entretanto, usá-la causa problemas de estabilidade em um número muito grande de programas, por isso ela não é necessariamente uma boa idéia. Além disso, apenas programas que explicitamente indicam que são capazes de acessar mais de 2 GB são autorizados pelo sistema a utilizar os endereços adicionais, o que reduz brutalmente o número de programas que são realmente capazes de se beneficiar do uso da opção.

No caso do Vista, é possível ajustar os valores de forma mais flexível através da opção “IncreaseUserVa” do BCDedit. Através dele você pode reservar, por exemplo, 2.2 ou 2.4 GB para os aplicativos. Usando valores mais baixos que os 3 GB do XP, você evita a maior parte dos problemas de estabilidade. De uma forma geral, funciona bem com a alocação de até 2.6 GB para os aplicativos. A partir daí você corre o risco de ver telas azuis.

Como você pode ver, o uso das opções permite apenas minimizar o problema. A única forma de se livrar dele completamente é rodar um sistema de 64 bits e usar apenas aplicativos de 64 bits sobre ele.

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X