Virtual addresses buy four things, not one
The popular explanation, "virtual memory lets you use more memory than you have", is the least interesting of its benefits. Indirection between the address a program uses and the address the DRAM chip sees buys four properties at once:
- Isolation. A pointer in process A simply cannot name a byte in process B, because A's page tables never map it. This is enforced by hardware on every single access.
- Relocation. The linker can place your code at a fixed virtual address and the loader is free to put it anywhere physical.
- Overcommit and laziness. A mapping can exist with no physical page behind it until first touch.
- Uniform permissions. Read, write, execute, and user versus kernel access are bits in the translation itself, checked for free.
The cost of all four is that every load and store now requires a translation.

