Compartilhar via


Espaços de endereço virtuais

Os processadores usam endereços virtuais ao ler ou gravar em locais de memória. Durante essas operações, o processador converte o endereço virtual em um físico.

Há vários benefícios para acessar a memória usando endereços virtuais:

  • Um programa pode usar um intervalo contíguo de endereços virtuais para acessar um buffer de memória grande e não contíguo na memória física.

  • Um programa pode usar um intervalo de endereços virtuais para acessar um buffer de memória maior que a memória física disponível. Quando a memória física está baixa, o gerenciador de memória salva páginas de memória física (normalmente 4 quilobytes de tamanho) em um arquivo de disco. O sistema move páginas de dados ou código entre a memória física e o disco, conforme necessário.

  • Os endereços virtuais usados por processos diferentes são isolados. O código em um processo não pode alterar a memória física que está sendo usada por outro processo ou pelo sistema operacional.

O intervalo de endereços virtuais que está disponível para um processo é conhecido como espaço de endereço virtual do processo. Cada processo de modo de usuário tem seu próprio espaço de endereço virtual privado.

  • Um processo de 32 bits normalmente tem um espaço de endereço virtual dentro do intervalo de 2 gigabytes 0x00000000 até 0x7FFFFFFF.

  • Um processo de 64 bits no Windows de 64 bits tem um espaço de endereço virtual dentro do intervalo de 128 terabytes 0x000'000000000 até 0x7FFF'FFFFFFFF.

Um intervalo de endereços virtuais às vezes é chamado de intervalo de memória virtual. Para obter mais informações, consulte Limites de memória e espaço de endereço.

O diagrama a seguir ilustra alguns dos principais recursos de espaços de endereço virtuais.

Diagrama mostrando os espaços de endereço virtual para dois processos de 64 bits, Notepad.exe e MyApp.exe.

O diagrama mostra os espaços de endereço virtual para dois processos de 64 bits: Notepad.exe e MyApp.exe. Cada processo tem seu próprio espaço de endereço virtual, variando de 0x000'0000000 a 0x7FF'FFFFFFFF. Cada bloco sombreado representa uma página (4 quilobytes de tamanho) de memória virtual ou física. O processo do Bloco de Notas usa três páginas contíguas de endereços virtuais, começando em 0x7F7'93950000. No entanto, essas três páginas contíguas de endereços virtuais são mapeadas para páginas não contíguas na memória física. Além disso, ambos os processos usam uma página de memória virtual começando em 0x7F7'93950000, mas essas páginas virtuais são mapeadas para páginas diferentes de memória física.

Espaço do usuário e espaço do sistema

Processos como Notepad.exe e MyApp.exe são executados no modo de usuário. Os principais componentes do sistema operacional e muitos drivers são executados no modo kernel mais privilegiado. Para obter mais informações sobre modos de processador, consulte Modo de usuário e modo kernel.

Cada processo de modo de usuário tem seu próprio espaço de endereço virtual privado, mas todo o código executado no modo kernel compartilha um único espaço de endereço virtual chamado espaço do sistema. O espaço de endereço virtual para um processo de modo de usuário é chamado de espaço do usuário.

No Windows de 32 bits, o espaço de endereço virtual disponível total é de 2^32 bytes (4 gigabytes). Normalmente, os 2 gigabytes inferiores são usados para o espaço do usuário e os 2 gigabytes superiores são usados para o espaço do sistema.

Diagrama ilustrando a divisão do espaço de endereço virtual total disponível no Windows de 32 bits no espaço do usuário e no espaço do sistema.

No Windows de 32 bits, você pode especificar (no momento da inicialização) que mais de 2 gigabytes estão disponíveis para o espaço do usuário. No entanto, isso significa que menos endereços virtuais estão disponíveis para o espaço do sistema. Você pode aumentar o tamanho do espaço do usuário para até 3 gigabytes, deixando apenas 1 gigabyte para o espaço do sistema. Para aumentar o tamanho do espaço do usuário, use BCDEdit /set increaseuserva.

No Windows de 64 bits, a quantidade teórica de espaço de endereço virtual é de 2^64 bytes (16 exabytes), mas apenas uma pequena parte do intervalo de 16 exabytes é realmente usada.

O código em execução no modo de usuário pode acessar o espaço do usuário, mas não o espaço do sistema. Essa restrição impede que o código do modo de usuário leia ou altere estruturas de dados do sistema operacional protegido. O código em execução no modo kernel pode acessar o espaço do usuário e o espaço do sistema. Ou seja, o código em execução no modo kernel pode acessar o espaço do sistema e o espaço de endereço virtual do processo atual do modo de usuário.

Os drivers em execução no modo kernel devem ter cuidado ao ler diretamente ou gravar em endereços no espaço do usuário. O cenário a seguir ilustra o motivo.

  1. Um programa de modo de usuário inicia uma solicitação para ler alguns dados de um dispositivo. O programa fornece o endereço inicial de um buffer para receber os dados.

  2. Uma rotina de driver de dispositivo, em execução no modo kernel, inicia a operação de leitura e retorna o controle ao chamador.

  3. Posteriormente, o dispositivo interrompe o thread em execução no momento para indicar que a operação de leitura foi concluída. As rotinas de driver no modo kernel lidam com a interrupção nesse thread arbitrário, que pertence a um processo arbitrário.

  4. Neste ponto, o driver não deve gravar os dados no endereço inicial que o programa de modo de usuário forneceu na Etapa 1. Esse endereço está no espaço de endereço virtual do processo que iniciou a solicitação, o que provavelmente não é o mesmo que o processo atual.

Pool paginado e pool nãopagado

No espaço do usuário, todas as páginas de memória física podem ser paginada em um arquivo de disco, conforme necessário. No espaço do sistema, algumas páginas físicas podem ser paginada e outras não. O espaço do sistema tem duas regiões para alocar memória dinamicamente: pool paginado e pool nãopagado.

A memória alocada no pool paginado pode ser paginada em um arquivo de disco, conforme necessário. A memória alocada no pool nãopagado nunca pode ser paginada em um arquivo de disco.

Diagrama que mostra a diferença entre a alocação de memória no pool paginado.

Nós de dispositivo e pilhas de dispositivos

Modo de usuário e modo kernel