- Previously
- Modularity reduces complexity.
- Naming is necessary for modularity.
- Operating Systems
- Job: Enforce modularity on a single machine.
- Also: Multiplexing, isolation, cooperation, portability, performance, ...
- To enforce modularity on a single machine, need to:
- Protect programs' memory from each other.
- Allow programs to communicate.
- Allow programs to share a single CPU.
- Virtualization is how we do that.
- Today: Virtualize memory. Assume one CPU per program and that programs don't need to communicate.
- Job: Enforce modularity on a single machine.
- Virtual Memory
- Two components: Main memory, CPU.
- CPU holds instruction pointer (EIP).
- Naive method: Two programs can just point to each other's memory (bad).
- Another method: Force programs to only use particular blocks of memory by having them address only part of the space. Complicated.
- Virtual memory addressing: Let each program address the full 32-bit space. MMU translates virtual to physical addresses.
- Page Tables
- Idea 1: Store physical addresses, use virtual addresses as an index into that table.
- Problem: Table is too big.
- Solution: Virtual address = page number + offset. MMU maps virtual page numbers to physical page numbers. Keeps offset the same.
- Page table entries contain other stuff. Among that stuff:
- Present bit
- This bit lets us know if a page resides in RAM or storage. That's how the OS deals with not actually having 2^32* (number of programs) physical addresses in RAM: Pages can live on disk when necessary.
- R/W bit
- U/S bit
- These bits let the OS know when to trigger page faults.
- Present bit
- Hierarchical Page Tables
- "Normal" page tables (described above) still use a lot of space.
- Page tables have to be allocated all at once or not at all.
- Hierarchical page tables solve this by creating a hierarchy of page tables and allocating each table only when it's needed.
- Virtual addresses get divided into multiple parts, one part per level in the hierarchy + an offset.
- Downside? Speed. Multiple lookups instead of one. More page faults.
- Kernel
- Virtualized memory doesn't protect the page table.
- Kernel mode vs. user mode does this.
- Switch between user and kernel modes via interrupts.
- Abstraction
- Some things can't be virtualized (disk, network, ...).
- OS abstractions (system calls) make these things portable.
- System calls are implemented as interrupts.
- Virtual Memory as Naming
- Virtual memory is just a naming scheme.
- Gives us hiding, controlled sharing, indirection.
Next lectures: Get rid of our initial assumptions (one CPU per program, etc.).