VMX Virtualization Engine
Relevant source files
The VMX Virtualization Engine forms the core of the x86_vcpu hypervisor library, implementing Intel's VMX (Virtual Machine Extensions) technology to enable hardware-assisted virtualization. This system provides the fundamental infrastructure for creating, managing, and executing virtual CPUs using Intel's VT-x capabilities.
For detailed information about physical memory management, see Physical Frame Management. For register and MSR access patterns, see Supporting Systems.
Architecture Overview
The VMX Virtualization Engine consists of several interconnected components that work together to provide complete virtualization functionality. The system is built around the VmxVcpu
structure, which represents a virtual CPU and manages the complete virtualization lifecycle.
flowchart TD subgraph subGraph4["Guest State Management"] GuestRegs["GeneralRegisters"] XState["XStateExtended Processor State"] PendingEvents["VecDeque<pending_events>"] end subgraph subGraph3["Per-CPU State"] PerCpuState["VmxPerCpuState(vmx/percpu.rs)"] HwEnable["hardware_enable()"] HwDisable["hardware_disable()"] end subgraph subGraph2["VMX Data Management"] VmxRegion["VmxRegionVMCS Memory"] IOBitmap["IOBitmapPort Interception"] MsrBitmap["MsrBitmapMSR Control"] VmcsFields["VMCS Field Access(vmx/vmcs.rs)"] end subgraph subGraph1["Core Virtualization Engine"] VmxVcpu["VmxVcpu<H>(vmx/vcpu.rs)"] VmExecution["VM Executionvmx_launch/vmx_resume"] VmExitHandler["VM Exit Handlerbuiltin_vmexit_handler()"] end subgraph subGraph0["VMX Module Interface"] VmxMod["VmxModFacade(vmx/mod.rs)"] HwSupport["has_hardware_support()"] RevisionId["read_vmcs_revision_id()"] end PerCpuState --> HwDisable PerCpuState --> HwEnable VmExecution --> VmExitHandler VmxMod --> PerCpuState VmxMod --> VmxVcpu VmxVcpu --> GuestRegs VmxVcpu --> IOBitmap VmxVcpu --> MsrBitmap VmxVcpu --> PendingEvents VmxVcpu --> VmcsFields VmxVcpu --> VmxRegion VmxVcpu --> XState
Sources: src/vmx/mod.rs(L1 - L36) src/vmx/vcpu.rs(L143 - L159)
Core Components and Interactions
The VMX engine operates through a collection of specialized components that handle different aspects of virtualization. The central VmxVcpu
structure coordinates these components to provide a complete virtual machine implementation.
flowchart TD subgraph subGraph3["VMCS Management"] VmcsSetup["setup_vmcs_host()setup_vmcs_guest()setup_vmcs_control()"] VmcsFields["VMCS Field AccessVmcsGuestNW::RIPVmcsControl32::PINBASED_EXEC_CONTROLSVmcsHost64::IA32_PAT"] end subgraph subGraph2["VM Exit Handling"] ExitInfo["exit_info() -> VmxExitInfo"] BuiltinHandler["builtin_vmexit_handler()"] ExitTypes["Exit Types- INTERRUPT_WINDOW- PREEMPTION_TIMER- XSETBV- CR_ACCESS- CPUID"] end subgraph subGraph1["VM Lifecycle Operations"] NewVcpu["new() -> AxResult<Self>"] SetupVcpu["setup(ept_root, entry)"] BindVcpu["bind_to_current_processor()"] RunVcpu["inner_run() -> Option<VmxExitInfo>"] UnbindVcpu["unbind_from_current_processor()"] end subgraph subGraph0["VmxVcpu Structure"] CoreFields["Core Fieldsguest_regs: GeneralRegistershost_stack_top: u64launched: bool"] DataStructs["Data Structuresvmcs: VmxRegion<H>io_bitmap: IOBitmap<H>msr_bitmap: MsrBitmap<H>"] StateFields["State Managementpending_events: VecDequexstate: XStateentry: Option<GuestPhysAddr>ept_root: Option<HostPhysAddr>"] end BuiltinHandler --> ExitTypes CoreFields --> NewVcpu DataStructs --> SetupVcpu ExitInfo --> BuiltinHandler RunVcpu --> ExitInfo SetupVcpu --> VmcsSetup StateFields --> RunVcpu VmcsSetup --> VmcsFields
Sources: src/vmx/vcpu.rs(L144 - L159) src/vmx/vcpu.rs(L238 - L280) src/vmx/vcpu.rs(L890 - L906)
VM Execution Lifecycle
The virtual machine execution follows a well-defined lifecycle that involves hardware initialization, VMCS configuration, guest execution, and VM exit handling. This process is managed through careful coordination between the hypervisor and VMX hardware.
Sources: src/vmx/vcpu.rs(L162 - L180) src/vmx/vcpu.rs(L238 - L280) src/vmx/vcpu.rs(L822 - L856)
Hardware Support and Abstraction
The VMX engine provides hardware abstraction through well-defined interfaces that detect VMX capabilities and manage processor-specific features. The system validates hardware support and configures VMX features based on detected capabilities.
Component | Purpose | Key Functions |
---|---|---|
Hardware Detection | Validate VMX support | has_hardware_support() |
VMCS Revision | Get processor VMCS version | read_vmcs_revision_id() |
Per-CPU State | Manage processor VMX state | hardware_enable(),hardware_disable() |
Error Handling | Convert VMX errors to AxError | as_axerr() |
The hardware abstraction layer ensures compatibility across different Intel processors while providing a uniform interface for VMX operations. The VmxBasic
structure reads processor capabilities, and the system adapts its behavior based on detected features such as RDTSCP, INVPCID, and XSAVES support.
flowchart TD subgraph subGraph1["VMX Configuration"] RevisionId["revision_id"] Controls["VMX Control MSRsIA32_VMX_PINBASED_CTLSIA32_VMX_PROCBASED_CTLSIA32_VMX_PROCBASED_CTLS2"] Features["Feature AdaptationRDTSCPINVPCIDXSAVES"] end subgraph subGraph0["Hardware Detection"] CpuId["raw_cpuid::CpuId"] FeatureCheck["get_feature_info().has_vmx()"] VmxBasic["VmxBasic::read()"] end subgraph subGraph2["Error Handling"] VmFail["x86::vmx::VmFail"] ErrorConv["as_axerr()"] AxError["axerrno::AxError"] end CpuId --> FeatureCheck ErrorConv --> AxError FeatureCheck --> Controls RevisionId --> Features VmFail --> ErrorConv VmxBasic --> RevisionId
Sources: src/vmx/mod.rs(L16 - L27) src/vmx/mod.rs(L29 - L35) src/vmx/vcpu.rs(L606 - L663)
Module Interface and Exports
The VMX module provides a clean interface through its mod.rs
facade, exporting the essential types and functions needed by the broader hypervisor system. The module structure separates concerns between different aspects of VMX functionality while providing unified access through type aliases.
Export | Source | Purpose |
---|---|---|
VmxExitReason | definitions::VmxExitReason | VM exit reason enumeration |
VmxArchPerCpuState | percpu::VmxPerCpuState | Per-CPU VMX state management |
VmxArchVCpu | vcpu::VmxVcpu | Main virtual CPU implementation |
VmxExitInfo | vmcs::VmxExitInfo | VM exit information structure |
VmxInterruptInfo | vmcs::VmxInterruptInfo | Interrupt exit details |
VmxIoExitInfo | vmcs::VmxIoExitInfo | I/O instruction exit details |
The module implements a layered architecture where higher-level abstractions build upon lower-level VMX primitives, providing both flexibility for advanced users and simplicity for common virtualization tasks.