Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Processorer använder virtuella adresser när de läser eller skriver till minnesplatser. Under dessa åtgärder översätter processorn den virtuella adressen till en fysisk adress.
Det finns flera fördelar med att komma åt minnet med hjälp av virtuella adresser:
Ett program kan använda ett sammanhängande intervall med virtuella adresser för att få åtkomst till en stor, icke-sammanhängande minnesbuffert i fysiskt minne.
Ett program kan använda ett intervall med virtuella adresser för att komma åt en minnesbuffert som är större än det tillgängliga fysiska minnet. När det fysiska minnet är lågt sparar minneshanteraren sidor med fysiskt minne (vanligtvis 4 kilobyte i storlek) till en diskfil. Systemet flyttar sidor med data eller kod mellan fysiskt minne och disken efter behov.
De virtuella adresser som används av olika processer är isolerade. Koden i en process kan inte ändra det fysiska minne som används av en annan process eller operativsystemet.
Det intervall med virtuella adresser som är tillgängliga för en process kallas processens virtuella adressutrymme. Varje användarlägesprocess har ett eget privat virtuellt adressutrymme.
En 32-bitarsprocess har vanligtvis ett virtuellt adressutrymme inom intervallet 2 gigabyte 0x00000000 via 0x7FFFFFFF.
En 64-bitarsprocess i Windows av 64-bitstyp har ett virtuellt adressutrymme inom intervallet från 0x000'00000000 till 0x7FFF'FFFFFFFF, vilket ligger inom ramen för 128 terabyte.
Ett intervall med virtuella adresser kallas ibland för ett intervall med virtuellt minne. Mer information finns i minnes- och adressutrymmesgränser.
Följande diagram illustrerar några viktiga funktioner i virtuella adressutrymmen.
Diagrammet visar de virtuella adressutrymmena för två 64-bitarsprocesser: Notepad.exe och MyApp.exe. Varje process har ett eget virtuellt adressutrymme, allt från 0x000'00000000 till 0x7FF'FFFFFFFF. Varje skuggat block representerar en sida (4 kilobyte i storlek) för virtuellt eller fysiskt minne. Anteckningar-processen använder tre sammanhängande sidor med virtuella adresser, från och med 0x7F7'93950000. Dessa tre sammanhängande sidor med virtuella adresser mappas dock till icke-sammanhängande sidor i fysiskt minne. Båda processerna använder också en sida med virtuellt minne som börjar på 0x7F7'93950000, men dessa virtuella sidor mappas till olika sidor med fysiskt minne.
Användarutrymme och systemutrymme
Processer som Notepad.exe och MyApp.exe köras i användarläge. Kärnoperativsystemkomponenter och många drivrutiner körs i det mer privilegierade kernelläget. Mer information om processorlägen finns i Användarläge och kernelläge.
Varje process i användarläge har ett eget privat virtuellt adressutrymme, men all kod som körs i kernelläge delar ett enda virtuellt adressutrymme som kallas systemutrymme. Det virtuella adressutrymmet för en användarlägesprocess kallas användarutrymme.
I 32-bitars Windows är det totala tillgängliga virtuella adressutrymmet 2^32 byte (4 gigabyte). Normalt används de lägre 2 gigabyteen för användarutrymme och de övre 2 gigabyteen används för systemutrymme.
I 32-bitars Windows kan du ange (vid starttid) att mer än 2 gigabyte är tillgängliga för användarutrymme. Det innebär dock att färre virtuella adresser är tillgängliga för systemutrymme. Du kan öka storleken på användarutrymmet till så mycket som 3 gigabyte, vilket bara ger 1 gigabyte för systemutrymme. Om du vill öka storleken på användarutrymmet använder du BCDEdit /set increaseuserva.
I 64-bitars Windows är den teoretiska mängden virtuellt adressutrymme 2^64 byte (16 exabyte), men endast en liten del av intervallet på 16 exabyte används faktiskt.
Kod som körs i användarläge kan komma åt användarutrymme men inte systemutrymme. Den här begränsningen förhindrar att kod i användarläge läser eller ändrar skyddade operativsystemsdatastrukturer. Kod som körs i kernelläge kan komma åt både användarutrymme och systemutrymme. Det vill: kod som körs i kernelläge kan komma åt systemutrymmet och det virtuella adressutrymmet för den aktuella användarlägesprocessen.
Drivrutiner som körs i kernelläge måste vara försiktiga när de läser från eller skriver direkt till adresser i användarutrymmet. Följande scenario illustrerar varför.
Ett användarlägesprogram initierar en begäran om att läsa data från en enhet. Programmet tillhandahåller startadressen för en buffert för att ta emot data.
En enhetsdrivrutin som körs i kernelläge startar läsåtgärden och returnerar kontrollen till anroparen.
Senare avbryter enheten den tråd som körs för att indikera att läsåtgärden är klar. Drivrutinsrutiner i kernelläge hanterar avbrottet på den här godtyckliga tråden, som tillhör en godtycklig process.
I det här läget får drivrutinen inte skriva data till den startadress som användarlägesprogrammet angav i steg 1. Den här adressen finns i det virtuella adressutrymmet för den process som initierade begäran, vilket sannolikt inte är detsamma som den aktuella processen.
Sidindelad pool och icke-sidindelad pool
I användarutrymmet kan alla fysiska minnessidor bläddras ut till en diskfil efter behov. I systemutrymmet kan vissa fysiska sidor vara utsidesade och andra inte. Systemutrymmet har två regioner för dynamisk allokering av minne: sidindelad pool och osidindelad pool.
Minne som allokeras i den sidiga poolen kan bläddras ut till en diskfil efter behov. Minne som allokeras i en ej-sidindelad pool kan aldrig flyttas till en diskfil.