Endereçando além de 4GB com sistemas operacionais Windows de 32bits

Por Elcio Favare

Nos últimos anos uma série de sistemas foi colocada no mercado, principalmente corporativo, com suporte para quantidades muito além de 4GB, como 8GB, 12GB, 16GB ou mais megabytes de memória RAM. A pergunta é como, uma vez que os processadores são desenhados para endereçar apenas 32bits de endereço de memória.

O subsistema memória RAM é fundamental na arquitetura dos computadores, é lá onde os softwares são executados, sendo normalmente carregados a partir dos dados armazenados nos discos rígidos. Para o processador acessar a determinado conjunto de dados na memória, ele usa um barramento de endereçamento (Address Bus) que identifica a posição de memória onde este conjunto de dados está armazenado.

Apesar de vermos equipamentos com muitos gibabytes de capacidade além dos 4GB, o fato é que nos sistemas de 32bits o processador deveria apenas conhecer os endereços de memória até 4GB, ou 2^32 bits. A seguir podemos entender então como grandes quantidades de memória são endereçadas por processadores de 32bits com versões de Windows de 32bits.

Nota: Cada vez mais é comum processadores de 64bits no mercado, mas existe uma base instalada de equipamentos com tecnologia de hardware e Windows de 32bits grande e que estão, ou poderão passar a estar, com mais do que 4GB de memória RAM instalada. Esta é a razão para este artigo.

Quanta memória RAM pode ser endereçada?

Os sistemas 32bits baseados na arquitetura IA-32 podem endereçar até 64GB de memória RAM, com o uso das instruções Physical Address Extensions-PAE contidas no processador. O PAE é uma extensão do barramento de endereços de memória, desenhado pela Intel em plataformas IA-32 (Pentium Pro e superiores; a AMD possui recurso similar) que permitem aos processadores aumentar o número de bits utilizados para o endereçamento de memória de 32bits para 36bits, (2^36 bits = 64GB). A ativação do PAE no Windows é possível em versões específicas do sistema operacional como veremos a seguir.

Vale aqui lembrar que processador de 32bits é aquele processador com barramento de dados (data bus) de 32bits, processado blocos de dados de 32bits. O barramento responsável pelo endereçamento de memória é o barramento de endereços (address bus), este é o barramento que foi estendido para 36bits, similar ao Intel 8086, que era um processador de 16bits com um barramento de endereçamento de 24bits, possibilitando endereçar até 16MB.

Cc668496.Enderecando01(pt-br,TechNet.10).gif

As versões Windows Server 2003 Datacenter Edition de 32bits permitem o endereçamento de até 37bits, ou seja, 128GB em hardwares que suportem este limite.

Suporte a Memória nos Sistemas Operacionais Windows

Os sistemas operacionais baseados na tecnologia Microsoft Windows NT sempre permitiram acesso direto a memória às aplicações que usam endereçamento de 32bits (4GB). O PAE x86, disponível nas versões Windows Server 2003 Enterprise Edition e Windows Server 2003 Datacenter Edition (e também em versões anteriores do Windows Server), permite que o modo de endereçamento seja alterado de 32bits para 64bits possibilitando que o sistema operacional, drivers de dispositivos e aplicações enderecem a memória adicional, endereços acima de 4GB. O acesso direto aos endereços acima de 4GB pelas aplicações é realizado através de uma API específica do Windows, denominada Address Windowing Extensions (AWE).

Quando o PAE é habilitado no sistema, toda a memória física é considerada memória de uso geral (general purpose memory). O sistema operacional passa a utilizar esta memória para o gerenciamento de memória virtual sem maiores alterações. Como as apenas as aplicações que realmente utilizam grandes quantidades de memória necessitam do AWE, não são grandes as alterações a serem realizadas no desenho destas aplicações.

O Windows considera que toda a memória é memória virtual, seja ela RAM ou o arquivo de paginação, oferecendo área de alocação para as aplicações e gerenciando onde os dados serão armazenados.

Ao se habilitar o PAE, através da entrada /PAE no arquivo boot.ini nas versões Windows Server 2003 Enterprise Edition e Windows Server 2003 Datacenter Edition, é habilitado a versão Ntkrnlpa.exe do kernel (ou o Ntkrnlpamp.exe em sistemas multiprocessados). A versão do kernel para uso com o PAE é copiada por padrão durante a instalação do sistema operacional.

Com o uso do PAE x86, é possível fazer com que o software executivo do Windows (também conhecido como Kernel) seja capaz de utilizar toda a memória física disponível entre 4GB e 64GB (apesar de endereçar até 64bits, ainda persistem os 36bits de endereçamento máximo do processador), podendo reduzir as operações de paginação e permitindo o aumento de desempenho em cenários onde várias aplicações estão alocadas em um mesmo computador, como em casos de consolidação ou quando aplicações intensivas no uso de memória estão em execução.

Tecnologias relacionadas ao PAE x86

Para compreender o funcionamento do PAE x86, é importante conhecer também o funcionamento de algumas outras tecnologias como o Memory Manager, Page Table, 4-gigabyte tuning (4GT) e o Application Windowing Extensions (AWE).

Memory Manager

O Memory Manager é o componente que traduz os endereços de memória virtual utilizados pelo sistema operacional e aplicações em localizações reais de memória. A tradução da memória real para a virtual é transparente para as aplicações. Processos em execução no User Mode não possuem acesso direto a memória real, e não sabem onde realmente o dado reside. Um processo em User Mode pode solicitar um bloco de memória para escrever, mas o dado pode ser gravado em um espaço na memória RAM ou no arquivo de paginação (paging file, também conhecido como arquivo de swap). O arquivo de paginação é um arquivo no disco rígido que é usado pelo Memory Manager para armazenar dados que não cabem na memória real, movendo blocos da memória real para a virtual, assim como o contrário, sempre que necessário.

Mesmo em sistemas com grandes quantidades de memória onde o PAE x86 está habilitado, caso ocorra falta de memória, o Memory Manager irá alocar no arquivo de paginação os dados que não puderem ser alocados em memória física. Com a ativação do PAE x86, os sistemas operacionais passam endereçar dados sob o formato de endereços de 64bits com limite máximo de 36bits (ou 64GB), devido a quantidade de bits disponíveis pela arquitetura x86.

Page Table Entries

Sendo o Memory Manager responsável pela tradução, rastreamento, e organização da memória real e virtual, tanto para aplicações quanto para o kernel do Windows, é necessário que estas operações sejam indexadas, assim o Memory Manager pode saber se determinado dado está na memória física ou virtual. Quando este dado é solicitado, o Memory Manager verifica no índice (ou Page Table) buscando uma entrada (Page Table Entry) que aponte o local onde este dado está ou deve ser armazenado.

Esta tabela de índices usada pelo Memory Manager é carregada no espaço de memória alocado pelo kernel durante a carga do sistema operacional. Na prática o Memory Manager usa a Page Table para criar um mapa de endereços de 64bits, endereçando diretamente os endereços até 4GB e consultando esta tabela de referência para os ponteiros de endereços entre 4GB e 64GB.

Application Windowing Extensions (AWE)

Devido ao espaço de endereços virtuais de uma aplicação se estender a apenas 2GB (3GB com o modo 4GT habilitado) nos ambiente 32bits, para aumentar o desempenho das aplicações que necessitam de um método para mapear grandes porções de dados e mantê-los em memória física por todo o tempo, foi desenvolvido um modo de acesso para até 64GB de memória não paginada (física) através de uma API denominada Application Windowing Extensions (AWE).

Com o AWE, as aplicações podem reservar seções da memória física que não podem ser paginadas, exceto pela por solicitação da própria aplicação. O AWE mantém os dados alocados permanentemente na memória sem que esta seja paginada uma vez que o Memory Manager não gerencia esta memória, apenas executando as solicitações da API AWE.

Diferente do PAE, que deve ser habilitado no boot.ini, o AWE não necessita de ativação, estando disponível para o uso por aplicações desenhadas para este fim.

4-gigabyte Tunning (4GT)

O 4-gigabyte Tunnig (também conhecido como 4GT, memory tunning ou /3GB) é uma das tecnologias que permitem aumentar a quantidade de memória disponível para aplicações (User Mode).

O 4GT permite que aplicações que utilizem memória RAM de maneira intensiva em versões 32bits do Microsoft Windows Server 2003 Enterprise Edition ou Windows Server 2003 Datacenter Edition usem 50% a mais de memória virtual, tornando disponível para o Kernel Mode (ou Windows Executive Mode) menos memória do que o padrão.

Nota: O 4GT não é necessário em sistemas Windows de 64bits.

Entretanto existem algumas limitações de cenários para o uso do 4GT, como pode ser visto a seguir;

  • Processador baseado na arquitetura x86 (Intel EM64T e AMD64 são processadores x64).

  • 2GB ou mais de memória RAM (existem cenários onde a partir de 1GB recomenda-se a ativação do 4GT).

  • Microsoft Windows Server 2003 Enterprise Edition ou Windows Server 2003 Datacenter Edition.

  • PAE habilitado em equipamentos com mais de 16GB.

  • Necessidade de suportar aplicações ou serviços que utilizem mais de 1GB de memória para o Kernel, por exemplo, manter determinado número de conexões simultâneas ao sistema.

O 4GT altera a forma como o Memory Manager aloca a memória virtual no sistema, a figura abaixo ilustra esta arquitetura em um equipamento com 4GB ou mais de memória RAM.

Cc668496.Enderecando02(pt-br,TechNet.10).gif

Ao invés de dividir os 4GB de memória RAM disponíveis (supondo que o sistema possui 4GB de RAM ou mais e o 4GT habilitado) igualmente entre o Kernel Mode e o User Mode (2GB para cada), o 4GT disponibiliza 1GB a menos de memória RAM para o kernel, liberando assim, 1GB de memória RAM a mais para as aplicações.

Cc668496.Enderecando03(pt-br,TechNet.10).gif

O uso do 4GT nos sistemas Windows 2003 não é habilitado por padrão, ficando facultado ao engenheiro de sistemas responsável sua ativação em virtude do cenário e principalmente dos testes com as aplicações. Para habilitar o 4GT, deve-se incluir uma entrada /3GB no arquivo boot.ini. Esta chave altera a alocação de espaços em memória para o kernel do sistema e para aplicações. Ao iniciar uma aplicação o sistema operacional examina o cabeçalho do arquivo, se houver o flag "IMAGE_FILE_LARGE_ADDRESS_AWARE" e o /3GB está sendo usado, então a aplicação tem acesso ao espaço de memória liberado pelo 4GT.

Apenas as versões Microsoft Windows Server 2003 Enterprise Edition ou Windows Server 2003 Datacenter Edition podem usar o 4GT, outras versões, como o Windows Server 2003 Standard Edition permitem que a chave seja ativada, porém apesar da aparência, os endereços de memória restringidos pela chave (entre 2GB e 3GB) não ficam indisponíveis para uso das aplicações.

Em alguns casos, restringir o uso de memória em no máximo 1GB para o kernel pode ser problemático. Para endereçar as necessidades de quantidades intermediárias entre 2GB e 3GB, o Windows Server 2003 conta com um parâmetro auxiliar ao /3GB, também configurado no boot.ini, que permite ajustes. Este parâmetro, o /Userva permite que uma quantidade de memória expressa em MB seja informada ao sistema operacional durante a carga, ajustando assim a quantidade de memória para uso do kernel do sistema. A quantidade de memória deve ser expressa calculando a diferença entre a alocação padrão para as aplicações do 4GT (3072MB) e a memória adicional necessária ao kernel. Por exemplo, caso se deseje permitir mais 512MB para o kernel, deve-se subtrair 512 de 3072, ou seja, 2560 e adicionar ao boot.ini "/3GB /Userva=2560". Esta memória RAM adicional é reservada como espaço adicional para as entradas na tabela de paginação, mas o sistema não faz nenhuma alocação deste espaço até que seja necessário.

Outro ponto importante em sistemas com grandes quantidades de memória, é que deve haver espaço suficiente para armazenar um arquivo de despejo de memória de 2GB (despejo de memória do kernel) em sistemas com 4GB ou mais de memória RAM.

Usando o 4GT e o Physical Address Extensions no mesmo sistema

Em sistemas com 4GB ou mais de memória, o Memory Manager divide os quatro primeiros gigabytes em dois blocos de 2GB, um para Kernel Mode e outro para o User Mode. Desta forma, dependendo da quantidade de memória instalada além dos 4GB, ativar o PAE pode não significar que a aplicação realmente possa fazer uso desta memória.

Considerando um equipamento com 6GB RAM como exemplo, uma aplicação que precise de 5GB irá ter paginado pelo Memory Manager ao menos 1GB, além disto, podem ocorrer casos onde o sistema operacional, apesar de ter alocado, não está realmente utilizando os 2GB.

Uma forma de permitir que uma quantidade maior de memória seja utilizada pelas aplicações é ativar o PAE e o 4GT no sistema ao mesmo tempo, restringindo o acesso a apenas 1GB pelo kernel.

Entretanto, devido ao 4GT restringir o acesso do kernel a memória, o espaço disponível para o Page Table fica restrito (reduzindo a quantidade de memória não-paginável de 256MB para 128MB), permitindo entradas (Page Table Entries) até o limite máximo de 16GB de endereçamento de memória, mesmo que o sistema possua, por exemplo, 32GB de memória RAM instalada. Além disso, é importante testar as aplicações com carga (simulando acesso real) ao usar o 4GT, uma vez que o consumo de memória do modo kernel para manter as conexões com os clientes pode ser insuficiente, exigindo um ajuste mais apurado através do /Userva.

Conclusão

Apesar do lançamento e consolidação de arquiteturas de 64bits, a quantidade de sistemas de 32bits ainda é grande, e é preciso compreender o funcionamento do subsistema de memória para tirar melhor proveito dos recursos, aumentando a confiabilidade e o desempenho dos sistemas atuais.

Para mais informações de como usar os ajustes avançados de memória nos sistemas operacionais Windows, consulte o Microsoft Technet e Knowledge Base e o Help do Windows Server 2003.