Partilhar 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 físico.

Há vários benefícios em 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 do 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 kilobytes 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 utilizados por diferentes processos 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 o 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'00000000 a 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 de espaço de endereço.

O diagrama a seguir ilustra alguns dos principais recursos dos 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 até 0x7FF'FFFFFFFF. Cada bloco sombreado representa uma página (4 kilobytes de tamanho) de memória virtual ou física. O processo do Bloco de Notas utiliza 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 mapeiam 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 que começa em 0x7F7'93950000, mas essas páginas virtuais são mapeadas para diferentes páginas de memória física.

Espaço do utilizador e espaço do sistema

Processos como Notepad.exe e MyApp.exe 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 os 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 de sistema. O espaço de endereço virtual para um processo de modo de usuário é chamado de espaço de usuário .

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

Diagrama ilustrando a divisão do espaço de endereço virtual total disponível no Windows de 32 bits em espaço do usuário e 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 espaço do usuário. No entanto, isso significa que menos endereços virtuais estão disponíveis para espaço no 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 utilizador, utilize 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 de modo de usuário leia ou altere estruturas de dados protegidas do sistema operacional. O código executado no modo kernel pode acessar o espaço do usuário e o espaço do sistema. Ou seja, o código executado 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 efetuar leitura ou escrita diretamente em endereços no espaço de utilizador. 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. Mais tarde, 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 de 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 em modo de utilizador forneceu na Etapa 1. Esse endereço está no espaço de endereço virtual do processo que iniciou a solicitaçã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 para um arquivo de disco conforme necessário. No espaço do sistema, algumas páginas físicas podem ser paginadas e outras não. O espaço do sistema tem duas regiões para alocar memória dinamicamente: pool paginado e pool não paginado.

A memória alocada no pool paginado pode ser paginada para um ficheiro de disco conforme necessário. A memória alocada no pool não paginado nunca pode ser paginada para 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