Overview
Relevant source files
Purpose and Scope
The x86_vcpu library provides a complete Intel VMX-based virtualization framework for x86_64 architectures. This library implements virtual CPU management, memory virtualization through Extended Page Tables (EPT), and hardware abstraction for building hypervisors.
The library focuses specifically on Intel VMX technology and provides the core virtualization primitives needed to create and manage virtual machines. For AMD SVM support, see the amd feature flag documented in Project Configuration. For build and development processes, see Development and Configuration.
Sources: src/lib.rs(L1 - L31) README.md(L1 - L29) Cargo.toml(L1 - L28)
System Architecture
The x86_vcpu library is structured around several core subsystems that work together to provide complete virtualization capabilities:
Core System Components
flowchart TD
subgraph ExportedAPI["Public API"]
VmxExports["VmxExitInfoVmxExitReasonVmxInterruptInfoVmxIoExitInfo"]
GeneralExports["GeneralRegistersGuestPageWalkInfohas_hardware_support"]
end
subgraph ExternalInterfaces["External Interfaces"]
PhysFrameIf["PhysFrameIf TraitHardware Abstraction"]
Dependencies["External Dependenciesx86, x86_64, axvcpu"]
end
subgraph LibraryCore["x86_vcpu Library Core"]
LibRS["lib.rsMain Entry Point"]
subgraph MemoryMgmt["Memory Management"]
EPTMod["ept.rsExtended Page Tables"]
FrameMod["frame.rsPhysical Frame Management"]
GuestPageWalk["GuestPageWalkInfoGuest Memory Virtualization"]
end
end
subgraph SupportSystems["Supporting Systems"]
RegsMod["regs.rsGeneralRegisters"]
MsrMod["msr.rsMSR Access"]
VmxDefs["vmx/definitions.rsVMX Types"]
VmxInstr["vmx/instructions.rsVMX Instructions"]
VmxVcpu["VmxArchVCpuVirtual CPU Implementation"]
VmxPerCpu["VmxArchPerCpuStatePer-CPU VMX State"]
end
subgraph VMXEngine["VMX Virtualization Engine"]
RegsMod["regs.rsGeneralRegisters"]
MsrMod["msr.rsMSR Access"]
VmxMod["vmx/mod.rsVMX Module"]
VmxVcpu["VmxArchVCpuVirtual CPU Implementation"]
VmxPerCpu["VmxArchPerCpuStatePer-CPU VMX State"]
end
EPTMod --> GuestPageWalk
FrameMod --> PhysFrameIf
PhysFrameIf --> Dependencies
VmxPerCpu --> VmxMod
VmxVcpu --> VmxMod
Sources: src/lib.rs(L18 - L31) Cargo.toml(L6 - L22)
VMX Feature Compilation Model
flowchart TD
subgraph PublicAPI["Exported Types"]
VmxTypes["VmxExitInfoVmxExitReasonVmxInterruptInfoVmxIoExitInfo"]
CommonTypes["GeneralRegistersGuestPageWalkInfohas_hardware_support"]
end
subgraph ConditionalCode["Conditional Implementation"]
VmxImpl["VMX ImplementationVmxArchVCpuVmxArchPerCpuState"]
VendorAlias["vender aliaspoints to active implementation"]
end
subgraph FeatureGates["Feature-Based Compilation"]
DefaultFeature["default = ['vmx']"]
VmxFeature["vmx feature"]
AmdFeature["amd feature"]
end
DefaultFeature --> VmxFeature
VendorAlias --> VmxTypes
VmxFeature --> VmxImpl
VmxImpl --> CommonTypes
VmxImpl --> VendorAlias
Sources: src/lib.rs(L18 - L27) Cargo.toml(L24 - L27)
Key Components
VMX Virtualization Engine
The core of the library is the VMX virtualization engine, which provides complete Intel VMX support. The VmxArchVCpu structure implements the virtual CPU interface defined by the axvcpu crate, handling VM entry/exit, guest state management, and hardware virtualization features.
For detailed information about VMX components, see VMX Virtualization Engine.
Memory Management
The memory management subsystem handles both host physical memory allocation and guest memory virtualization. The PhysFrameIf trait provides hardware abstraction for physical frame allocation, while the EPT system manages guest virtual-to-physical memory translation.
For memory management details, see Memory Management.
Hardware Abstraction
The library defines clear interfaces for hardware abstraction through the PhysFrameIf trait, allowing integration with different underlying memory management systems.
Interface Requirements
PhysFrameIf Implementation
Users must implement the PhysFrameIf trait to provide physical memory management:
| Method | Purpose |
|---|---|
| alloc_frame() | Allocate a 4KB physical memory frame |
| dealloc_frame(paddr) | Deallocate a physical memory frame |
| phys_to_virt(paddr) | Convert physical address to virtual address |
The implementation uses the crate_interface mechanism for dependency injection, as shown in README.md(L13 - L29)
Sources: README.md(L7 - L29) src/lib.rs(L1 - L6)
Dependency Integration
The library integrates with several external crates:
| Crate Category | Dependencies | Purpose |
|---|---|---|
| Low-level x86 | x86,x86_64,raw-cpuid | Hardware instruction and register access |
| Hypervisor Framework | axvcpu,axaddrspace | Virtual CPU and address space interfaces |
| Utility | bitflags,bit_field,memory_addr | Data structure manipulation |
Sources: Cargo.toml(L6 - L22)
Implementation Approach
The library uses conditional compilation to support different virtualization technologies. Currently, Intel VMX is the primary implementation, with the vmx feature enabled by default. The architecture allows for future AMD SVM support through the amd feature flag.
The modular design separates concerns into distinct subsystems:
- VMX-specific code is isolated in the
vmxmodule - Memory management provides hardware-agnostic abstractions
- Supporting systems offer reusable components for register and MSR access
For specific implementation details of each subsystem, refer to the corresponding sections: Virtual CPU Management, Physical Frame Management, and Supporting Systems.