They were introduced by Gerald J. Popek and Robert P. Goldberg in their 1974 article "Formal Requirements for Virtualizable Third Generation Architectures".
Their analysis derives such characteristics using a model of "third generation architectures" (e.g., IBM 360, Honeywell 6000, DEC PDP-10) that is nevertheless general enough to be extended to modern machines.
This model includes a processor that operates in either system or user mode, and has access to linear, uniformly addressable memory.
It is assumed that a subset of the instruction set is available only when in system mode and that memory is addressed relative to a relocation register.
A conventional third-generation computer is recursively virtualizable if: Some architectures, like the non-hardware-assisted x86, do not meet these conditions, so they cannot be virtualized in the classic way.
One approach, known as patching, adopts techniques commonly used in dynamic recompilation: critical instructions are discovered at run-time and replaced with a trap into the VMM.
Various mechanisms, such as the caching of emulation code or hardware assists, have been proposed to make the patching process more efficient.
A different approach is that of paravirtualization, which requires guest operating systems to be modified (ported) before running in the virtual environment.
[11] They can be categorized in two groups: The introduction of the AMD-V and Intel VT-x instruction sets in 2005 allows x86 processors to meet the Popek and Goldberg virtualization requirements.
Unfortunately, even on an architecture that meets Popek and Goldberg's requirements, the performance of a virtual machine can differ significantly from the actual hardware.
This led the IBM engineers to introduce a number of hardware assists, which roughly doubled the performance of the System/370 virtual machines.