This invention relates to the field of computer systems. More particularly, a system and methods are provided for inlining across protection domain boundaries within a system virtual machine.
A system virtual machine (VM) executes instructions from a source or “virtual” instruction set architecture (vISA), such as the x86 ISA, on a “native” ISA (nISA), such as SPARC®, by interpretation or dynamic compilation. Use of a virtual machine thus allows one physical computing device to appear to host one or more virtual computers, which can execute a variety of operating systems and application software.
A VM awards a system designer great freedom in design within the nISA. In particular, in traditional non-virtual machine computer systems a processor executes instructions essentially one at a time, using only local knowledge of the current process. A VM, however, can apply optimizations across greater regions of a program, including inlining, whereby instructions from the target of a function call are compiled into, and optimized with, the source of the call. Currently, however, inlining can only be performed for function calls fully contained within the boundaries of one protection domain—a combination of privilege level and applicable address space.
However, many application workloads involve a wealth of system calls (e.g., calls from application code into the operating system), especially for input/output (I/O). For example, in some hypervisor-based systems (e.g., Xen®), I/O follows a complicated path from an application to the operating system's stub device driver via a system call, then via a hypercall to the real device driver running in another guest OS instance.
All these protection domain transitions (e.g., user to system to hypervisor to system) are expensive on conventional (non-system virtual machine) hardware. For example, in response to a trap or software interrupt from application code, among other operations some or all of the following actions occur: a processor's pipeline is flushed, control registers are modified, internal state (i.e., context) of the processor is reconfigured to raise the privilege level to supervisor mode from user mode, information about the user context is saved, and control is transferred to an appropriate service routine. Yet, abstractly, system calls/hypercalls are similar to function calls except that they call across a protection domain boundary.
Similarly, inlining cannot be performed when a call is made from a process executing in one ISA to a process executing in a different ISA. For example, a given VM may host guest operating systems that differ from each other in terms of their ISA (e.g. SPARC, x86), but which must cooperate as described above to share a real device driver. Not only do the protection domain boundaries present obstacles, but the difference in vISAs further frustrates efforts to inline calls between the guest operating systems.