Schematic of the operation of an MMU
Modern MMUs typically divide the virtual
address space (the range of addresses used by the processor) into
pages, each having a size which is a power of 2, usually a few
kilobytes, but they may be much larger. The bottom bits of the address (the offset within a page) are left unchanged. The upper address bits are the virtual page numbers.
Page table entries
Most MMUs use an in-memory table of items called a "
page table", containing one "
page table entry" (PTE) per page, to map virtual page numbers to physical page numbers in main memory. An associative cache of PTEs is called a
translation lookaside buffer (TLB) and is used to avoid the necessity of accessing the main memory every time a virtual address is mapped. Other MMUs may have a private array of memory
 or registers that hold a set of page table entries. The physical page number is combined with the page offset to give the complete physical address.
A PTE may also include information about whether the page has been written to (the "
dirty bit"), when it was last used (the "accessed bit," for a
least recently used (LRU)
page replacement algorithm), what kind of processes (
user mode or
supervisor mode) may read and write it, and whether it should be
Sometimes, a PTE prohibits access to a virtual page, perhaps because no physical
random access memory has been allocated to that virtual page. In this case, the MMU signals a
page fault to the CPU. The
operating system (OS) then handles the situation, perhaps by trying to find a spare frame of
RAM and set up a new PTE to map it to the requested virtual address. If no RAM is free, it may be necessary to choose an existing page (known as a "victim"), using some replacement
algorithm, and save it to disk (a process called "
paging"). With some MMUs, there can also be a shortage of PTEs, in which case the OS will have to free one for the new mapping.
The MMU may also generate illegal access error conditions or
invalid page faults upon illegal or non-existing memory accesses, respectively, leading to
segmentation fault or
bus error conditions when handled by the operating system.
In some cases, a page fault may indicate a
software bug, which can be prevented by using
memory protection as one of key benefits of an MMU: an operating system can use it to protect against errant programs by disallowing access to memory that a particular program should not have access to. Typically, an operating system assigns each program its own virtual address space.
An MMU also mitigates the problem of
fragmentation of memory. After blocks of memory have been allocated and freed, the free memory may become fragmented (discontinuous) so that the largest contiguous block of free memory may be much smaller than the total amount. With virtual memory, a contiguous range of virtual addresses can be mapped to several non-contiguous blocks of physical memory; this non-contiguous allocation is one of the benefits of
In some early
microprocessor designs, memory management was performed by a separate
integrated circuit such as the
VLSI VI475 (1986), the
Motorola 68851 (1984) used with the
Motorola 68020 CPU in the
Macintosh II, or the Z8015 (1985)
 used with the
Zilog Z8000 family of processors. Later microprocessors (such as the
Motorola 68030 and the
Zilog Z280) placed the MMU together with the CPU on the same integrated circuit, as did the
Intel 80286 and later
While this article concentrates on modern MMUs, commonly based on pages, early systems used a similar concept for
base-limit addressing that further developed into
segmentation. Those are occasionally also present on modern architectures. The
x86 architecture provided segmentation, rather than paging, in the
80286, and provides both paging and segmentation in the
80386 and later processors (although the use of segmentation is not available in 64-bit operation).