Japp. MS Windows och de flesta Unix och Linux på moderna processorer med MMU delar upp hela minnet i "pages" (sidor). MMU:ns sidor är vanligtvis 4096 bytes, men kan ibland vara större.
För varje process finns en "page table" i operativsystemets minnet med mappningar från virtuell adress till fysisk adress för varje sida på virtuell adress i processen. Endast de högre bittarna används: de 12 lägre bittarna (för en storlek på 4096 = 2¹²) är oförändrade.
Dessa page tables brukar inte vara rena arrayer, utan trädstruktur i flera steg indexerad på virtuell adress, och organiserade så att varje del av en "page table" själv tar upp precis en sida. På det sättet tar dessa page tables inte upp jättemycket minne (men det blir ganska mycket ändå).
I en sidas info-struktur ("page table entry") brukar det finnas en bit som säger om sidan är giltig, och också bittar som säger om den är t.ex. skrivskyddat.
Försök till åtkomst till adress i en sida som är märkt som ogiltig eller som inte finns i tabellen leder till ett s.k. "Page fault": en "exception", liknande en "trap" eller interrupt till operativsystemet.
Försök till skrivning till skrivskyddad sida eller körning av program i exekverings-skyddad sida ger också "page fault".
Page tables ligger alltså i minnet, men processorn själv cache:ar delar av tabellen i sin TLB ("translation lookaside buffer"). De flesta processorer sköter åtkomst och cache:ning av page-tabellen i sin TLB automatiskt.
Förr i tiden, innan "paging" slagit igenom så använde processorer istället "segmentering" för minnesskydd.
Varje segment pekade på ett adress-omfång i det fysiska minnet: Start-adress och storlek. Det brukade vara uppdelade i t.ex. ett segment för kod, ett för data och ett för stack. Ett åtkomstförsök till en adress utanför ett segment ledde till ett "Segmentation Fault" eller "segfault".
Denna uppdelning och terminologi lever kvar även i moderna Unix och Linux, trots att de egentligen gör "paging". T.ex. när ett program försöker sig på en otillåten minnesåtkomst så reses signalen "SIGSEGV".
En annan detalj är att operativsystem ofta gör sidor "ogiltiga" med flit för att kunna mäta hur ofta program använder olika sidor: Detta brukar dock inte märkas av programmet, men det kan leda till kryptiska meddelanden på vissa ställen i t.ex. administrationsprogram i Windows.
När malloc() och operator new() (och motsvarande i andra språk än C och C++) ska allockera minne så försöker de först att använda minnesområden som programmet redan har men inte använder. (och det finns många olika invecklade algoritmer för att göra det ....)
Om det inte finns tillräckligt så måste det be om mer minne från operatiivsystemet.
I Unix och Linux brukar utökning av ett programs minne ske på ett av två sätt:
• Man ökar storlek på programmets datasegment. Se man-sidan för "brk". Detta "segment" består numera av en mängd hela sidor på löpande addresser i page table:n.
• Programmet minnesmappar nya sidor från filen "/dev/null". Se man-sidan för "mmap". (Ganska bakvänd konvention egentligen

). En minnesmappning sker i antal hela sidor på löpande adresser, utanför datasegmentet.
Varje bibliotek som länkas in i programmet när det startar brukar också minnesmappas, förresten.
Jag har inte stor koll på Windows, men jag tror att det fungerar enligt liknande principer men använder andra termer här och där.