the Popek-Goldberg requirements
/ POH-pek GOLD-berg /
In 1974 two researchers, Gerald Popek and Robert Goldberg, wrote down the rules a CPU must obey for trap-and-emulate virtualization to even be possible. It is the closest thing this field has to a theorem, and it answers a sharp question: given a processor's instruction set, can you build an efficient hypervisor on it, or not? Their answer reduces the whole question to how the instruction set treats two categories of instruction.
Their classification: a privileged instruction is one that traps if executed in user mode but runs if executed in kernel mode (the normal mechanism the operating system relies on). A sensitive instruction is one that either changes how the hardware is configured (control-sensitive) or behaves differently depending on the current privilege or configuration (behavior-sensitive) - in short, any instruction that 'cares' about the machine state a hypervisor must virtualize. The headline theorem is then beautifully simple: a machine is classically virtualizable (you can build an efficient trap-and-emulate hypervisor) if and only if every sensitive instruction is also a privileged instruction. If that holds, you run the guest unprivileged, every dangerous instruction traps, and the hypervisor emulates it. If some sensitive instruction is NOT privileged, it slips through without trapping - and your hypervisor is blind to it.
This is exactly why classic 32-bit x86 was not classically virtualizable: it had a notorious set of seventeen-or-so sensitive instructions that were not privileged. The textbook example is popf, which loads the flags register; in kernel mode it can change the interrupt-enable flag, but run in user mode it silently ignores that part instead of trapping - so a guest's attempt to change interrupt state just vanished, undetected. Faced with this, engineers used binary translation (rewrite the guest's risky instructions on the fly, as VMware did) or paravirtualization (modify the guest to call the hypervisor explicitly, as Xen did), until Intel VT-x and AMD-V added a hardware mode that effectively makes x86 satisfy the requirements.
The x86 instruction popf is the textbook offender: in kernel mode it can clear the interrupt-enable flag, but in user mode it silently drops that change instead of faulting. A trap-and-emulate hypervisor running the guest in user mode never sees the guest's attempt, so it cannot virtualize it.
popf is sensitive but not privileged on classic x86 - the exact gap that broke trap-and-emulate.
The theorem gives a sufficient condition for CLASSICAL trap-and-emulate efficiency; it does not say x86 was un-virtualizable in any absolute sense - binary translation, paravirtualization, and later hardware assistance all worked around it. 'Not classically virtualizable' is precise; 'impossible' would be false.