Compartilhar via


Espaços de endereço virtual

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ãotiguoso 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 é 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 um 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 virtual.

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 Notepad 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 diferentes páginas de memória física.

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

Processos como Notepad.exe e MyApp.exe são executados no modo de usuário. Componentes principais do sistema operacional e muitos drivers são executados no modo kernel mais privilegiado. Para obter mais informações sobre os modos de processador, consulte o modo de usuário e o 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 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 disponível total 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 de 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 as 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 que estão em execução no modo kernel devem tomar cuidado ao ler ou gravar diretamente em endereços no espaço do usuário. O cenário a seguir ilustra o porquê.

  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 está concluída. As rotinas de driver no modo kernel lidam com a interrupção neste 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 fornecido pelo programa de modo de usuário 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ão paginado

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

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

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

nós de dispositivo e pilhas de dispositivo

Modo de usuário e modo kernel