Virtuele adresruimten
Processors gebruiken virtuele adressen bij het lezen of schrijven naar geheugenlocaties. Tijdens deze bewerkingen vertaalt de processor het virtuele adres in een fysiek adres.
Er zijn verschillende voordelen voor toegang tot geheugen met behulp van virtuele adressen:
Een programma kan een aaneengesloten bereik van virtuele adressen gebruiken voor toegang tot een grote, niet-aaneengesloten geheugenbuffer in fysiek geheugen.
Een programma kan een bereik van virtuele adressen gebruiken om toegang te krijgen tot een geheugenbuffer die groter is dan het beschikbare fysieke geheugen. Wanneer het fysieke geheugen laag is, worden pagina's van fysiek geheugen (meestal 4 kilobytes) opgeslagen in een schijfbestand. Het systeem verplaatst indien nodig pagina's met gegevens of code tussen fysiek geheugen en de schijf.
De virtuele adressen die door verschillende processen worden gebruikt, worden geïsoleerd. De code in het ene proces kan het fysieke geheugen dat wordt gebruikt door een ander proces of het besturingssysteem niet wijzigen.
Het bereik van virtuele adressen dat beschikbaar is voor een proces wordt de virtuele adresruimte van het procesgenoemd. Elk gebruikersmodusproces heeft een eigen virtuele adresruimte.
Een 32-bits proces heeft doorgaans een virtuele adresruimte binnen het bereik van 2 gigabyte 0x00000000 tot 0x7FFFFFFF.
Een 64-bits proces op 64-bits Windows heeft een virtuele adresruimte binnen het 128-terabyte bereik van 0x000'00000000 tot 0x7FFF'FFFFFFFF.
Een bereik van virtuele adressen wordt soms een bereik van virtuele geheugengenoemd. Zie geheugen- en adresruimtelimietenvoor meer informatie.
In het volgende diagram ziet u enkele belangrijke functies van virtuele adresruimten.
In het diagram ziet u de virtuele adresruimten voor twee 64-bits processen: Notepad.exe en MyApp.exe. Elk proces heeft een eigen virtuele adresruimte, variërend van 0x000'0000000 tot 0x7FF'FFFFFFFFFF. Elk gearceerd blok vertegenwoordigt één pagina (4 kilobytes in grootte) van virtueel of fysiek geheugen. Het Kladblok-proces maakt gebruik van drie aaneengesloten pagina's met virtuele adressen, te beginnen bij 0x7F7'939500000. Deze drie aaneengesloten pagina's van virtuele adressen zijn echter toegewezen aan niet-aaneengesloten pagina's in fysiek geheugen. Beide processen gebruiken ook een pagina met virtueel geheugen die begint bij 0x7F7'93950000, maar deze virtuele pagina's worden toegewezen aan verschillende pagina's van fysiek geheugen.
Gebruikersruimte en systeemruimte
Processen zoals Notepad.exe en MyApp.exe worden uitgevoerd in de gebruikersmodus. Kernonderdelen van het besturingssysteem en veel stuurprogramma's worden uitgevoerd in de meer bevoegde kernelmodus. Zie gebruikersmodus en kernelmodusvoor meer informatie over processormodi.
Elk gebruikersmodusproces heeft een eigen virtuele privéadresruimte, maar alle code die wordt uitgevoerd in de kernelmodus deelt één virtuele adresruimte met de naam systeemruimte. De virtuele adresruimte voor een gebruikersmodusproces wordt gebruikersruimtegenoemd.
In 32-bits Windows is de totale beschikbare virtuele adresruimte 2^32 bytes (4 gigabyte). Normaal gesproken worden de lagere 2 gigabytes gebruikt voor gebruikersruimte en worden de bovenste 2 gigabytes gebruikt voor systeemruimte.
In 32-bits Windows kunt u opgeven (tijdens het opstarten) dat er meer dan 2 gigabyte beschikbaar is voor gebruikersruimte. Dit betekent echter dat er minder virtuele adressen beschikbaar zijn voor systeemruimte. U kunt de grootte van de gebruikersruimte vergroten tot maximaal 3 gigabyte, waardoor er slechts 1 gigabyte voor systeemruimte overblijft. Als u de grootte van de gebruikersruimte wilt vergroten, gebruikt u BCDEdit /set increaseuserva.
In 64-bits Windows is de theoretische hoeveelheid virtuele adresruimte 2^64 bytes (16 exabytes), maar slechts een klein deel van het bereik van 16 exabyte wordt daadwerkelijk gebruikt.
Code die wordt uitgevoerd in de gebruikersmodus heeft toegang tot gebruikersruimte, maar niet tot systeemruimte. Met deze beperking voorkomt u dat code in de gebruikersmodus gegevensstructuren van beveiligde besturingssystemen leest of wijzigt. Code die wordt uitgevoerd in de kernelmodus heeft toegang tot zowel gebruikersruimte als systeemruimte. Dat wil gezegd: code die wordt uitgevoerd in de kernelmodus heeft toegang tot systeemruimte en de virtuele adresruimte van het huidige gebruikersmodusproces.
Stuurprogramma's die in de kernelmodus worden uitgevoerd, moeten voorzichtig zijn bij het rechtstreeks lezen van of schrijven naar adressen in de gebruikersruimte. In het volgende scenario ziet u waarom.
Een gebruikersmodusprogramma initieert een aanvraag om bepaalde gegevens van een apparaat te lezen. Het programma biedt het beginadres van een buffer om de gegevens te ontvangen.
Een apparaatstuurprogramma-routine, die wordt uitgevoerd in de kernelmodus, start de leesoperatie en geeft de controle terug aan de aanroeper.
Later onderbreekt het apparaat de momenteel actieve thread om aan te geven dat de leesbewerking is voltooid. Routines voor kernelmodusstuurprogramma's verwerken de interrupt op deze willekeurige thread, die deel uitmaakt van een willekeurig proces.
Op dit moment mag het stuurprogramma de gegevens niet naar het beginadres schrijven dat het gebruikersmodusprogramma heeft opgegeven in stap 1. Dit adres bevindt zich in de virtuele adresruimte van het proces dat de aanvraag heeft gestart, wat waarschijnlijk niet hetzelfde is als het huidige proces.
Gepaginade pool en niet-gepaginade pool
In de gebruikersruimte kunnen alle fysieke geheugenpagina's indien nodig naar een schijfbestand worden gepaginad. In de systeemruimte kunnen sommige fysieke pagina's worden uitgepaginad en andere niet. Systeemruimte heeft twee regio's voor het dynamisch toewijzen van geheugen: gepaginade pool en niet-gepaginade pool.
Geheugen dat is toegewezen in een gepaginade pool, kan indien nodig worden uitgepaginad naar een schijfbestand. Geheugen dat is toegewezen in een niet-gepagineerde pool, kan nooit naar een schijfbestand worden gepagineerd.