Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

This Unit: Virtual Memory

App App App •  The operating system (OS)


System software •  A super-application
CIS 501 Mem CPU I/O
•  Hardware support for an OS
•  Virtual memory
Computer Architecture •  Page tables and address translation
•  TLBs and memory hierarchy issues

Unit 6: Virtual Memory

Slides originally developed by Amir Roth with contributions by Milo Martin


at University of Pennsylvania with sources that included University of
Wisconsin slides by Mark Hill, Guri Sohi, Jim Smith, and David Wood.

CIS 501 (Martin): Virtual Memory 1 CIS 501 (Martin): Virtual Memory 2

Readings A Computer System: Hardware


•  Textbook (MA:FSPTCM) •  CPUs and memories
•  Section 2.3, 6.1.1 •  Connected by memory bus
•  I/O peripherals: storage, input, display, network, …
•  With separate or built-in DMA
•  Connected by system bus (which is connected to memory bus)

Memory bus System (I/O) bus


bridge
CPU/$ CPU/$ DMA DMA I/O ctrl
Memory

kbd display
Disk NIC
CIS 501 (Martin): Virtual Memory 3 CIS 501 (Martin): Virtual Memory 4
A Computer System: + App Software A Computer System: + OS
•  Application software: computer must do something •  Operating System (OS): virtualizes hardware for apps
•  Abstraction: provides services (e.g., threads, files, etc.)
+ Simplifies app programming model, raw hardware is nasty
•  Isolation: gives each app illusion of private CPU, memory, I/O
+ Simplifies app programming model
+ Increases hardware resource utilization

Application Application Application Application


Application sofware OS

Memory bus System (I/O) bus Memory bus System (I/O) bus
bridge bridge
CPU/$ CPU/$ DMA DMA I/O ctrl CPU/$ CPU/$ DMA DMA I/O ctrl
Memory Memory

kbd display kbd display


Disk NIC Disk NIC
CIS 501 (Martin): Virtual Memory 5 CIS 501 (Martin): Virtual Memory 6

Operating System (OS) and User Apps System Calls


•  Sane system development requires a split •  Controlled transfers to/from OS
•  Hardware itself facilitates/enforces this split

•  System Call: a user-level app “function call” to OS


•  Operating System (OS): a super-privileged process •  Leave description of what you want done in registers
•  Manages hardware resource allocation/revocation for all processes
•  SYSCALL instruction (also called TRAP or INT)
•  Has direct access to resource allocation features
•  Can’t allow user-level apps to invoke arbitrary OS code
•  Aware of many nasty hardware details
•  Aware of other processes •  Restricted set of legal OS addresses to jump to (trap vector)
•  Talks directly to input/output devices (device driver software) •  Processor jumps to OS using trap vector
•  Sets privileged mode
•  OS performs operation
•  User-level apps: ignorance is bliss
•  Unaware of most nasty hardware details •  OS does a “return from system call”
•  Unaware of other apps (and OS) •  Unsets privileged mode
•  Explicitly denied access to resource allocation features

CIS 501 (Martin): Virtual Memory 7 CIS 501 (Martin): Virtual Memory 8
Interrupts Virtualizing Processors
•  Exceptions: synchronous, generated by running app •  How do multiple apps (and OS) share the processors?
•  E.g., illegal insn, divide by zero, etc. •  Goal: applications think there are an infinite # of processors
•  Interrupts: asynchronous events generated externally
•  E.g., timer, I/O request/reply, etc. •  Solution: time-share the resource
•  Trigger a context switch at a regular interval (~1ms)
•  “Interrupt” handling: same mechanism for both
•  Pre-emptive: app doesn’t yield CPU, OS forcibly takes it
•  “Interrupts” are on-chip signals/bits
+ Stops greedy apps from starving others
•  Either internal (e.g., timer, exceptions) or from I/O devices
•  Architected state: PC, registers
•  Processor continuously monitors interrupt status, when one is high…
•  Save and restore them on context switches
•  Hardware jumps to some preset address in OS code (interrupt vector) •  Memory state?
•  Like an asynchronous, non-programmatic SYSCALL •  Non-architected state: caches, predictor tables, etc.
•  Timer: programmable on-chip interrupt •  Ignore or flush
•  Initialize with some number of micro-seconds •  Operating responsible to handle context switching
•  Timer counts down and interrupts when reaches 0 •  Hardware support is just a timer interrupt

CIS 501 (Martin): Virtual Memory 9 CIS 501 (Martin): Virtual Memory 10

Virtualizing Main Memory Virtual Memory (VM)


•  How do multiple apps (and the OS) share main memory? Program •  Programs use virtual addresses (VA)
•  Goal: each application thinks it has infinite memory code heap stack •  0…2N–1
•  VA size also referred to as machine size

•  E.g., 32-bit (embedded) or 64-bit (server)
•  One app may want more memory than is in the system
•  App’s insn/data footprint may be larger than main memory
•  Memory uses physical addresses (PA)
•  Requires main memory to act like a cache
•  0…2M–1 (typically M<N, especially if N=64)
•  With disk as next level in memory hierarchy (slow) …
•  2M is most physical memory machine supports
•  Write-back, write-allocate, large blocks or “pages” Main Memory
•  No notion of “program not fitting” in registers or caches (why?) •  VA!PA at page granularity (VP!PP)
•  Solution: •  By “system”
•  Part #1: treat memory as a “cache” •  Mapping need not preserve contiguity
•  Store the overflowed blocks in “swap” space on disk •  VP need not be mapped to any PP
Disk
•  Part #2: add a level of indirection (address translation) •  Unmapped VPs live on disk (swap)

CIS 501 (Martin): Virtual Memory 11 CIS 501 (Martin): Virtual Memory 12
Virtual Memory (VM) Virtual Memory (VM)
•  Virtual Memory (VM): •  Programs use virtual addresses (VA)
•  Level of indirection •  VA size (N) aka machine size (e.g., Core 2 Duo: 48-bit)
•  Application generated addresses are virtual addresses (VAs) •  Memory uses physical addresses (PA)
•  Each process thinks it has its own 2N bytes of address space •  PA size (M) typically M<N, especially if N=64
•  Memory accessed using physical addresses (PAs) •  2M is most physical memory machine supports
•  VAs translated to PAs at some coarse granularity (page) •  VA!PA at page granularity (VP!PP)
•  OS controls VA to PA mapping for itself and all other processes •  Mapping need not preserve contiguity
•  Logically: translation performed before every insn fetch, load, store •  VP need not be mapped to any PP
•  Unmapped VPs live on disk (swap) or nowhere (if not yet touched)
•  Physically: hardware acceleration removes translation overhead

OS App1 App2 OS App1 App2


… … … VAs … … …
OS controlled VA!PA mappings
PAs (physical memory) Disk
CIS 501 (Martin): Virtual Memory 13 CIS 501 (Martin): Virtual Memory 14

VM is an Old Idea: Older than Caches Uses of Virtual Memory


•  Original motivation: single-program compatibility •  More recently: isolation and multi-programming
•  IBM System 370: a family of computers with one software suite •  Each app thinks it has 2N B of memory, its stack starts 0xFFFFFFFF,…
+  Same program could run on machines with different memory sizes •  Apps prevented from reading/writing each other’s memory
–  Prior, programmers explicitly accounted for memory size •  Can’t even address the other program’s memory!
•  Protection
•  But also: full-associativity + software replacement •  Each page with a read/write/execute permission set by OS
•  Memory tmiss is high: extremely important to reduce %miss •  Enforced by hardware
•  Inter-process communication.
Parameter I$/D$ L2 Main Memory •  Map same physical pages into multiple virtual address spaces
thit 2ns 10ns 30ns •  Or share files via the UNIX mmap() call
tmiss 10ns 30ns 10ms (10M ns) OS App1 App2
Capacity 8–64KB 128KB–2MB 64MB–64GB … … …
Block size 16–32B 32–256B 4+KB
Assoc./Repl. 1–4, LRU 4–16, LRU Full, “working set”

CIS 501 (Martin): Virtual Memory 15 CIS 501 (Martin): Virtual Memory 16
Address Translation Address Translation Mechanics I
virtual address[31:0] VPN[31:16] POFS[15:0] •  How are addresses translated?
translate don’t touch •  In software (for now) but with hardware acceleration (a little later)
physical address[25:0] PPN[27:16] POFS[15:0]
•  Each process allocated a page table (PT)
•  Software data structure constructed by OS PT
•  VA!PA mapping called address translation •  Maps VPs to PPs or to disk (swap) addresses
•  Split VA into virtual page number (VPN) & page offset (POFS) •  VP entries empty if page never referenced
•  Translate VPN into physical page number (PPN) •  Translation is table lookup

vpn
•  POFS is not translated
•  VA!PA = [VPN, POFS] ! [PPN, POFS] struct {
int ppn;
int is_valid, is_dirty, is_swapped;
•  Example above } PTE;
struct PTE page_table[NUM_VIRTUAL_PAGES];
•  64KB pages ! 16-bit POFS
•  32-bit machine ! 32-bit VA ! 16-bit VPN int translate(int vpn) {
if (page_table[vpn].is_valid)
•  Maximum 256MB memory ! 28-bit PA ! 12-bit PPN Disk(swap)
return page_table[vpn].ppn;
}
CIS 501 (Martin): Virtual Memory 17 CIS 501 (Martin): Virtual Memory 18

Page Table Size Multi-Level Page Table (PT)


•  How big is a page table on the following machine? •  One way: multi-level page tables
•  32-bit machine •  Tree of page tables (“trie”)
•  4B page table entries (PTEs) •  Lowest-level tables hold PTEs
•  4KB pages •  Upper-level tables hold pointers to lower-level tables
•  Different parts of VPN used to index different levels
•  32-bit machine ! 32-bit VA ! 4GB virtual memory
•  4GB virtual memory / 4KB page size ! 1M VPs •  Example: two-level page table for machine on last slide
•  1M VPs * 4B PTE ! 4MB •  Compute number of pages needed for lowest-level (PTEs)
•  4KB pages / 4B PTEs ! 1K PTEs/page
•  How big would the page table be with 64KB pages? •  1M PTEs / (1K PTEs/page) ! 1K pages
•  How big would it be for a 64-bit machine? •  Compute number of pages needed for upper-level (pointers)
•  1K lowest-level pages ! 1K pointers
•  1K pointers * 32-bit VA ! 4KB ! 1 upper level page
•  Page tables can get big
•  There are ways of making them smaller
CIS 501 (Martin): Virtual Memory 19 CIS 501 (Martin): Virtual Memory 20
Multi-Level Page Table (PT) Multi-Level Page Table (PT)
•  20-bit VPN VPN[19:10] VPN[9:0] 2nd-level •  Have we saved any space?
PTEs
•  Upper 10 bits index 1st-level table •  Isn’t total size of 2nd level tables same as single-level
1st-level
•  Lower 10 bits index 2nd-level table pt “root” “pointers” table (i.e., 4MB)?
•  Yes, but…
struct {
int ppn;
int is_valid, is_dirty, is_swapped; •  Large virtual address regions unused
} PTE;
struct { struct PTE ptes[1024]; } L2PT; •  Corresponding 2nd-level tables need not exist
struct L2PT *page_table[1024]; •  Corresponding 1st-level pointers are null
int translate(int vpn) {
index1 = (vpn >> 10); // upper 10 bits
index2 = (vpn & 0x3ff); // lower 10 bits •  Example: 2MB code, 64KB stack, 16MB heap
struct L2PT *l2pt = page_table[index1]; •  Each 2nd-level table maps 4MB of virtual addresses
if (l2pt != NULL &&
l2pt->ptes[index2].is_valid) •  1 for code, 1 for stack, 4 for heap, (+1 1st-level)
return l2pt->ptes[index2].ppn; •  7 total pages = 28KB (much less than 4MB)
}

CIS 501 (Martin): Virtual Memory 21 CIS 501 (Martin): Virtual Memory 22

Page-Level Protection Address Translation Mechanics II


•  Page-level protection •  Conceptually
•  Piggy-back page-table mechanism •  Translate VA to PA before every cache access
•  Map VPN to PPN + Read/Write/Execute permission bits •  Walk the page table before every load/store/insn-fetch
•  Attempt to execute data, to write read-only data? –  Would be terribly inefficient (even in hardware)
•  Exception ! OS terminates program
•  Useful (for OS itself actually) •  In reality
•  Translation Lookaside Buffer (TLB): cache translations
struct { •  Only walk page table on TLB miss
int ppn;
int is_valid, is_dirty, is_swapped, permissions;
} PTE; •  Hardware truisms
struct PTE page_table[NUM_VIRTUAL_PAGES];
•  Functionality problem? Add indirection (e.g., VM)
int translate(int vpn, int action) { •  Performance problem? Add cache (e.g., TLB)
if (page_table[vpn].is_valid &&
!(page_table [vpn].permissions & action)) kill;

}
CIS 501 (Martin): Virtual Memory 23 CIS 501 (Martin): Virtual Memory 24
Translation Lookaside Buffer Serial TLB & Cache Access
•  Translation lookaside buffer (TLB) •  “Physical” caches
CPU CPU
•  Small cache: 16–64 entries •  Indexed and tagged by physical addresses
VA •  Associative (4+ way or fully associative) VA +  Natural, “lazy” sharing of caches between apps/OS
TLB TLB +  Exploits temporal locality in page table TLB TLB •  VM ensures isolation (via physical addresses)
PA •  What if an entry isn’t found in the TLB? PA •  No need to do anything on context switches
•  Multi-threading works too
I$ D$ •  Invoke TLB miss handler I$ D$ +  Cached inter-process communication works
•  Single copy indexed by physical address
L2 L2 –  Slow: adds at least one cycle to thit
“tag” “data”
VPN PPN •  Note: TLBs are by definition “virtual”
Main VPN PPN Main •  Indexed and tagged by virtual addresses
Memory VPN PPN Memory •  Flush across context switches
•  Or extend with process identifier tags (x86)

CIS 501 (Martin): Virtual Memory 25 CIS 501 (Martin): Virtual Memory 26

Parallel TLB & Cache Access Parallel TLB & Cache Access
tags data
?
•  Two ways to look at VA CPU
tag [31:12] index [11:5] [4:0]
VPN [31:16] page offset [15:0]
•  Cache: tag+index+offset PPN[27:16] page offset [15:0]
•  TLB: VPN+page offset •  What about
VA parallel access?
== TLB I$ D$ TLB PA
== •  Only if…
•  Parallel cache/TLB… (cache size) / (associativity) ! page size
•  If address translation == L2 •  Index bits same in virt. and physical addresses!
doesn’t change index
•  Access TLB in parallel with cache
•  That is, VPN/index ==
TLB Main •  Cache access needs tag only at very end
must not overlap
Memory +  Fast: no additional thit cycles
TLB hit/miss cache +  No context-switching/aliasing problems
cache hit/miss
•  Dominant organization used today
virtual tag [31:12] index [11:5] [4:0]
VPN [31:16] page offset [15:0]
•  Example: Core 2, 4KB pages,
32KB, 8-way SA L1 data cache
data •  Implication: associativity allows bigger caches
CIS 501 (Martin): Virtual Memory address 27 CIS 501 (Martin): Virtual Memory 28
TLB Organization TLB Misses
•  Like caches: TLBs also have ABCs •  TLB miss: translation not in TLB, but in page table
•  Capacity •  Two ways to “fill” it, both relatively fast
•  Associativity (At least 4-way associative, fully-associative common)
•  What does it mean for a TLB to have a block size of two? •  Software-managed TLB: e.g., Alpha, MIPS
•  Two consecutive VPs share a single tag •  Short (~10 insn) OS routine walks page table, updates TLB
•  Like caches: there can be L2 TLBs +  Keeps page table format flexible
–  Latency: one or two memory accesses + OS call (pipeline flush)

•  Example: AMD Opteron •  Hardware-managed TLB: e.g., x86, recent SPARC, ARM
•  32-entry fully-assoc. TLBs, 512-entry 4-way L2 TLB (insn & data) •  Page table root in hardware register, hardware “walks” table
•  4KB pages, 48-bit virtual addresses, four-level page table +  Latency: saves cost of OS call (avoids pipeline flush)
–  Page table format is hard-coded
•  Rule of thumb: TLB should “cover” L2 contents
•  In other words: (#PTEs in TLB) * page size ! L2 size •  Trend is towards hardware TLB miss handler
•  Why? Consider relative miss latency in each…
CIS 501 (Martin): Virtual Memory 29 CIS 501 (Martin): Virtual Memory 30

Page Faults Summary


•  Page fault: PTE not in TLB or page table •  OS virtualizes memory and I/O devices
•  ! page not in memory
•  Or no valid mapping ! segmentation fault •  Virtual memory
•  Starts out as a TLB miss, detected by OS/hardware handler
•  “infinite” memory, isolation, protection, inter-process communication
•  OS software routine: •  Page tables
•  Choose a physical page to replace •  Translation buffers
•  “Working set”: refined LRU, tracks active page usage •  Parallel vs serial access, interaction with caching
•  If dirty, write to disk •  Page faults
•  Read missing page from disk
•  Takes so long (~10ms), OS schedules another task
•  Requires yet another data structure: frame map
•  Maps physical pages to <process, virtual page> pairs
•  Treat like a normal TLB miss from here

CIS 501 (Martin): Virtual Memory 31 CIS 501 (Martin): Virtual Memory 32

You might also like