FreeBSD separates the physical page table topology from the VM system. All hard
per-process page tables can be reconstructed on the fly and are usually considered
throwaway. Special page tables such as those managing KVM are typically permanently
preallocated. These page tables are not throwaway.
FreeBSD associates portions of vm_objects with address ranges in virtual memory
through vm_map_t and vm_entry_t
structures. Page tables are directly synthesized from the vm_map_t/vm_entry_t/ vm_object_t hierarchy. Recall that I mentioned that physical pages
are only directly associated with a vm_object; that is not
quite true. vm_page_t's are also linked into page tables that
they are actively associated with. One vm_page_t can be linked
into several pmaps, as page tables
are called. However, the hierarchical association holds, so all references to the same
page in the same object reference the same vm_page_t and thus
give us buffer cache unification across the board.