Delen via


Geheugenbeveiliging

Geheugen dat deel uitmaakt van een proces, wordt impliciet beveiligd door de privé-virtuele adresruimte. Daarnaast biedt Windows geheugenbeveiliging met behulp van de hardware van het virtuele geheugen. De implementatie van deze beveiliging varieert met de processor, bijvoorbeeld codepagina's in de adresruimte van een proces kunnen worden gemarkeerd als alleen-lezen en beveiligd tegen wijziging door threads in de gebruikersmodus.

Zie Geheugenbeveiligingsconstantenvoor de volledige lijst met kenmerken.

Beveiliging voor kopiëren op schrijven

Copy-on-write-beveiliging is een optimalisatie waarmee meerdere processen hun virtuele adresruimten kunnen toewijzen, zodat ze een fysieke pagina delen totdat een van de processen de pagina wijzigt. Dit maakt deel uit van een techniek genaamd luie evaluatie, waardoor het systeem fysiek geheugen en tijd kan besparen door geen bewerking uit te voeren totdat dit absoluut noodzakelijk is.

Stel dat twee processen pagina's uit hetzelfde DLL-bestand laden in hun virtuele geheugenruimten. Deze virtuele geheugenpagina's worden toegewezen aan dezelfde fysieke geheugenpagina's voor beide processen. Zolang geen van beide processen naar deze pagina's schrijft, kunnen ze toewijzen aan en delen, dezelfde fysieke pagina's, zoals wordt weergegeven in het volgende diagram.

vakken en pijlen van proces 1 en 2 pagina's die zijn toegewezen aan hetzelfde fysieke geheugen

Als proces 1 naar een van deze pagina's schrijft, wordt de inhoud van de fysieke pagina gekopieerd naar een andere fysieke pagina en wordt de virtuele geheugenkaart bijgewerkt voor Proces 1. Beide processen hebben nu hun eigen exemplaar van de pagina in fysiek geheugen. Daarom is het niet mogelijk dat één proces naar een gedeelde fysieke pagina schrijft en voor het andere proces om de wijzigingen te zien.

vakken en pijlen van processen en het opnieuw toewijzen van fysiek geheugen

Toepassingen en DLL's laden

Wanneer meerdere exemplaren van dezelfde Windows-toepassing worden geladen, wordt elk exemplaar uitgevoerd in een eigen beveiligde virtuele adresruimte. De instantiehandgrepen (hInstance) hebben echter meestal dezelfde waarde. Deze waarde vertegenwoordigt het basisadres van de toepassing in de virtuele adresruimte. Als elk exemplaar kan worden geladen in het standaardbasisadres, kan deze worden toegewezen aan en dezelfde fysieke pagina's delen met de andere exemplaren, met behulp van copy-on-write-beveiliging. Met het systeem kunnen deze exemplaren dezelfde fysieke pagina's delen totdat een van deze exemplaren een pagina wijzigt. Als een van deze exemplaren om een of andere reden niet kan worden geladen in het gewenste basisadres, ontvangt deze zijn eigen fysieke pagina's.

DLL's worden gemaakt met een standaardbasisadres. Elk proces dat gebruikmaakt van een DLL probeert het DLL-bestand in zijn eigen adresruimte te laden op het standaard virtuele adres voor het DLL-bestand. Als meerdere toepassingen een DLL kunnen laden op het standaard virtuele adres, kunnen ze dezelfde fysieke pagina's voor het DLL-bestand delen. Als een proces om een of andere reden het DLL-bestand niet kan laden op het standaardadres, wordt de DLL ergens anders geladen. Beveiliging tegen kopiëren op schrijven dwingt sommige van de DLL-pagina's te worden gekopieerd naar verschillende fysieke pagina's voor dit proces, omdat de oplossingen voor jumpinstructies worden geschreven op de pagina's van het DLL-bestand en deze verschillen voor dit proces. Als de codesectie veel verwijzingen naar de gegevenssectie bevat, kan dit ertoe leiden dat de hele codesectie naar nieuwe fysieke pagina's wordt gekopieerd.