I am trying to understand how a virtual machine monitor (VMM) virtualizes the CPU.
My understanding right now is that the CPU issues a protection fault interrupt when a
I'm not an expert on computer architecture. But I have several opinions for your consideration:
load/store
from protected memory etc.system calls
. And if user program calls them, it will cause an exception (throws a software interrupt), which
vectors to a kernel handler, trap
to kernel modes and switch contexts.trap
to kernel mode. Depending on what happened it would be one of several traps, such as a memory access violation, an illegal instruction violation, or a register access violation. The trap switches the processor’s execution to kernel mode and switches control to the operating system, which then decides on a course of action. The address is defined by the trap vector, which is set up when the operating system starts up.In no particular order:
Your confusion is mainly caused by the fact that the operating systems community does not have standardized vocabulary. Here are some terms that get slung around that sometimes mean the same thing, sometimes not: exception, fault, interrupt, system call, and trap. Any individual author will generally use the terms consistently, but different authors define them differently.
There are 3 different kinds of events that cause entry into privileged mode.
int
on the x86). (More generally in the x86 manuals these are called traps and include a couple of other instructions (for debuggers mostly.))Each interrupt, trap or fault has a different number associated with it.
In all cases:
iret
on x86.) (This is the subtle distinction between a fault and a trap on x86: faults return to the instruction that caused the fault, traps return to the instruction after the trap.)Note the confusing name "interrupt vector table." Even though it is called an interrupt table, it is used for faults and traps as well. (Which leads some authors to call everything an interrupt.)
The popf
issue is rather subtle. This is essentially a bug in the x86 architecture. When popf
executes from user mode it does not cause a trap or fault (or exception or interrupt or whatever you want to call it.) It simply acts as a noop.
Does this matter? Well, for a normal OS it doesn't really matter. If, on the other hand, you are implementing a virtual machine monitor (like VMWare or Xen or Hyper-V), the VMM is running in protected mode, and you'd like to run the guest operating systems in user mode and efficiently emulate any protected mode code. When the guest operating system uses a popf
instruction you want it to generate a general protection fault, but it doesn't. (The cli
and sti
instructions do generate a general protection fault if called from user mode, which is what you want.)