Proteção de memória

A memória que pertence a um processo é implicitamente protegida por seu espaço de endereço virtual privado. Além disso, Windows fornece proteção de memória usando o hardware de memória virtual. A implementação dessa proteção varia de acordo com o processador, por exemplo, as páginas de código no espaço de endereço de um processo podem ser marcadas somente leitura e protegidas contra modificações por threads do modo de usuário.

Para obter a lista completa de atributos, consulte Constantes de Proteção de Memória.

Proteção copy-on-Write

A proteção de cópia na gravação é uma otimização que permite que vários processos mapeiem seus espaços de endereço virtual, de modo que compartilhem uma página física até que um dos processos modifique a página. Isso faz parte de uma técnica chamada avaliação lenta, que permite ao sistema conservar a memória física e o tempo, não executando uma operação até que seja absolutamente necessário.

Por exemplo, suponha que dois processos carreguem páginas da mesma DLL em seus espaços de memória virtual. Essas páginas de memória virtual são mapeadas para as mesmas páginas de memória física para ambos os processos. Desde que nenhum dos processos seja gravado nessas páginas, eles podem mapear e compartilhar, as mesmas páginas físicas, conforme mostrado no diagrama a seguir.

boxes and arrows of process 1 and 2 pages mapped to same physical memory

Se o Processo 1 gravar em uma dessas páginas, o conteúdo da página física será copiado para outra página física e o mapa de memória virtual será atualizado para o Processo 1. Os dois processos agora têm sua própria instância da página na memória física. Portanto, não é possível que um processo escreva em uma página física compartilhada e para que o outro processo veja as alterações.

boxes and arrows of processes and physical memory remapping

Carregando aplicativos e DLLs

Quando várias instâncias do mesmo aplicativo baseado em Windows são carregadas, cada instância é executada em seu próprio espaço de endereço virtual protegido. No entanto, seus identificadores de instância (hInstance) normalmente têm o mesmo valor. Esse valor representa o endereço base do aplicativo em seu espaço de endereço virtual. Se cada instância puder ser carregada em seu endereço base padrão, ela poderá mapear e compartilhar as mesmas páginas físicas com as outras instâncias, usando a proteção de cópia na gravação. O sistema permite que essas instâncias compartilhem as mesmas páginas físicas até que uma delas modifique uma página. Se, por algum motivo, uma dessas instâncias não puder ser carregada no endereço base desejado, ela receberá suas próprias páginas físicas.

As DLLs são criadas com um endereço base padrão. Cada processo que usa uma DLL tentará carregar a DLL dentro de seu próprio espaço de endereço no endereço virtual padrão para a DLL. Se vários aplicativos puderem carregar uma DLL em seu endereço virtual padrão, eles poderão compartilhar as mesmas páginas físicas para a DLL. Se, por algum motivo, um processo não puder carregar a DLL no endereço padrão, ele carregará a DLL em outro lugar. A proteção de cópia na gravação força algumas páginas da DLL a serem copiadas em páginas físicas diferentes para esse processo, pois as correções para instruções de salto são escritas nas páginas da DLL e serão diferentes para esse processo. Se a seção de código contiver muitas referências à seção de dados, isso poderá fazer com que toda a seção de código seja copiada para novas páginas físicas.