System Components
Relevant source files
This document details the main crates and their relationships within the AxVisor hypervisor system. It provides an overview of the modular architecture of AxVisor, explaining how various components interact to create a unified hypervisor framework that supports multiple architectures. For information about VM configuration, see VM Configuration. For implementation details of the VMM (Virtual Machine Manager), see VMM Implementation.
Component Architecture Overview
AxVisor follows a modular design approach with clearly defined components that have specific responsibilities. This architecture enables:
- Cross-architecture support (x86_64, ARM/aarch64, RISC-V)
- Clear separation of concerns
- Hardware abstraction
- Simplified development and testing
The system is organized into several categories of components that work together to provide hypervisor functionality.
flowchart TD
subgraph subGraph2["ArceOS Foundation"]
axstd["axstd - Standard Library"]
axhal["axhal - Hardware Abstraction Layer"]
axtask["axtask - Task Management"]
axalloc["axalloc - Memory Allocation"]
axconfig["axconfig - System Configuration"]
axfs["axfs - Virtual Filesystem"]
end
subgraph subGraph1["Architecture-Specific Components"]
x86_vcpu["x86_vcpu - x86 VCPU Implementation"]
arm_vcpu["arm_vcpu - ARM VCPU Implementation"]
riscv_vcpu["riscv_vcpu - RISC-V VCPU Implementation"]
end
subgraph subGraph0["Core Hypervisor Components"]
axvisor["axvisor - Top-level Hypervisor"]
axvm["axvm - VM Management"]
axvcpu["axvcpu - Virtual CPU Interface"]
axaddrspace["axaddrspace - Memory Virtualization"]
axdevice["axdevice - Device Emulation"]
axvmconfig["axvmconfig - VM Configuration"]
end
axstd --> axalloc
axstd --> axconfig
axstd --> axfs
axstd --> axhal
axstd --> axtask
axvcpu --> arm_vcpu
axvcpu --> riscv_vcpu
axvcpu --> x86_vcpu
axvisor --> axaddrspace
axvisor --> axstd
axvisor --> axvcpu
axvisor --> axvm
axvm --> axaddrspace
axvm --> axdevice
axvm --> axvcpu
axvm --> axvmconfig
Sources: Cargo.toml(L14 - L45)
Core Hypervisor Components
The main components of AxVisor can be categorized into core hypervisor functionality crates that are independent of the underlying architecture.
axvisor
The top-level hypervisor crate that ties all components together and provides the main entry point for the hypervisor. It coordinates the virtual machine lifecycle and manages the hypervisor state.
axvm
The Virtual Machine Manager responsible for creating, running, and managing virtual machines. It handles VM lifecycle operations such as creation, initialization, execution, and shutdown.
Key responsibilities:
- VM resource allocation and management
- Guest image loading
- Coordinating interactions between VCPUs, memory, and devices
- VM state management
axvcpu
Defines the common Virtual CPU interface used across all architectures. It provides an abstraction layer for architecture-specific VCPU implementations.
Key responsibilities:
- Common VCPU interface definition
- VCPU state management
- Architecture-agnostic VCPU operations
axaddrspace
Handles memory virtualization and address space management for virtual machines.
Key responsibilities:
- Memory region allocation and management
- Second-stage page table management
- Memory protection mechanisms
- Address translation services
axdevice
Provides device emulation capabilities for virtual machines, allowing guest operating systems to interact with virtualized hardware.
Key responsibilities:
- Device model implementation
- I/O handling
- Device state management
axvmconfig
Manages VM configurations through TOML-based configuration files, defining VM properties such as memory size, CPU count, and device settings.
Sources: Cargo.toml(L34 - L37)
Architecture-Specific Components
AxVisor supports multiple architectures through specialized implementation crates that implement the common interfaces defined by the core components.
flowchart TD
subgraph subGraph3["Architecture-Specific Implementations"]
axvcpu["axvcpu - Common VCPU Interface"]
x86_vcpu["x86_vcpu - x86 Implementation"]
arm_vcpu["arm_vcpu - ARM Implementation"]
riscv_vcpu["riscv_vcpu - RISC-V Implementation"]
subgraph subGraph2["RISC-V Specifics"]
hs_mode["HS Mode"]
sbi_rt["SBI Runtime"]
trap_handler["Trap Handler"]
end
subgraph subGraph1["ARM Specifics"]
el2["EL2 Mode"]
gicv2["GICv2 Interrupt Controller"]
hvc["HVC Exception Handler"]
end
subgraph subGraph0["x86_64 Specifics"]
vt_x["VT-x Virtualization"]
x2apic["x2APIC Support"]
vmexit_handler["VM Exit Handler"]
end
end
arm_vcpu --> el2
arm_vcpu --> gicv2
arm_vcpu --> hvc
axvcpu --> arm_vcpu
axvcpu --> riscv_vcpu
axvcpu --> x86_vcpu
riscv_vcpu --> hs_mode
riscv_vcpu --> sbi_rt
riscv_vcpu --> trap_handler
x86_vcpu --> vmexit_handler
x86_vcpu --> vt_x
x86_vcpu --> x2apic
Sources: Cargo.lock(L138 - L148) Cargo.lock(L154 - L168) Cargo.lock(L1247 - L1269) Cargo.lock(L1721 - L1739)
x86_vcpu
Implements the VCPU interface for x86_64 architecture using Intel VT-x or AMD SVM technologies.
Key features:
- VM entry/exit handling
- Extended Page Tables (EPT) support
- Interrupt virtualization
- MSR virtualization
arm_vcpu
Implements the VCPU interface for ARM/aarch64 architecture using ARM Virtualization Extensions.
Key features:
- EL2 (Hypervisor mode) operations
- Stage-2 translation
- GICv2 interrupt controller virtualization
- Hypervisor calls (HVC) handling
riscv_vcpu
Implements the VCPU interface for RISC-V architecture using the RISC-V Hypervisor Extension.
Key features:
- Hypervisor-Supervisor (HS) mode operations
- Guest-page-table handling
- SBI services virtualization
- Trap handling
Sources: Cargo.lock(L1721 - L1739) Cargo.lock(L154 - L168) Cargo.lock(L1247 - L1269)
ArceOS Foundation
AxVisor is built on top of the ArceOS (Architecture-centric OS) unikernel framework, which provides essential OS services and hardware abstractions.
axstd
A minimal standard library for ArceOS that provides common functionality and interfaces to the underlying OS services.
axhal
The Hardware Abstraction Layer that provides a uniform interface to hardware across different architectures.
Key responsibilities:
- CPU and interrupt management
- Timer services
- Memory management primitives
- Platform-specific initialization
axtask
Task management services including task creation, scheduling, and synchronization.
Key responsibilities:
- Task creation and lifecycle management
- Scheduling
- Inter-task synchronization
axalloc
Memory allocation services and memory management.
Key responsibilities:
- Physical memory allocation
- Heap management
- Memory pools
axconfig
System configuration management.
Key responsibilities:
- System parameters
- Feature flags
- Runtime configuration
axfs
Virtual filesystem support.
Key responsibilities:
- File operations
- Filesystem implementations (FAT32, etc.)
- Device filesystem
Sources: Cargo.toml(L24 - L32) Cargo.lock(L118 - L134)
Component Relationships and Dependencies
The components in AxVisor have well-defined relationships and dependencies that enable the modular architecture to function as a cohesive system.
flowchart TD
subgraph subGraph6["AxVisor System"]
axvisor["axvisor - Entry Point"]
subgraph subGraph5["OS Services"]
axstd["axstd - Standard Library"]
axhal["axhal - Hardware Abstraction Layer"]
axtask["axtask - Task Management"]
axalloc["axalloc - Memory Allocator"]
axconfig["axconfig - System Configuration"]
axfs["axfs - Filesystem"]
end
subgraph subGraph4["Device Emulation"]
axdevice["axdevice - Device Emulation"]
axdevice_base["axdevice_base - Base Device Interface"]
end
subgraph subGraph3["Memory Management"]
axaddrspace["axaddrspace - Address Space Management"]
page_tables["Page Tables"]
end
subgraph subGraph2["CPU Virtualization"]
axvcpu["axvcpu - VCPU Interface"]
arch_vcpu["Architecture-specific VCPU Implementations"]
end
subgraph subGraph1["VM Management"]
axvm["axvm - VM Management"]
axvmconfig["axvmconfig - VM Configuration"]
end
end
subgraph subGraph0["User Applications"]
vm_configs["VM Configuration Files"]
end
axaddrspace --> page_tables
axalloc --> axhal
axdevice --> axaddrspace
axdevice --> axdevice_base
axstd --> axalloc
axstd --> axconfig
axstd --> axfs
axstd --> axhal
axstd --> axtask
axtask --> axhal
axvcpu --> arch_vcpu
axvcpu --> axaddrspace
axvisor --> axstd
axvisor --> axvm
axvm --> axaddrspace
axvm --> axdevice
axvm --> axvcpu
axvm --> axvmconfig
vm_configs --> axvmconfig
Sources: Cargo.toml(L24 - L45)
Component Interaction Flow
The following diagram illustrates how the components interact during VM creation and execution:
sequenceDiagram
participant VMConfiguration as VM Configuration
participant axvisor as axvisor
participant axvm as axvm
participant axvcpu as axvcpu
participant ArchspecificVCPU as Arch-specific VCPU
participant axaddrspace as axaddrspace
participant axdevice as axdevice
VMConfiguration ->> axvisor: Load configuration
axvisor ->> axvm: Create VM(config)
axvm ->> axaddrspace: Create address space
axaddrspace -->> axvm: Address space created
axvm ->> axdevice: Initialize devices
axdevice -->> axvm: Devices initialized
axvm ->> axvcpu: Create VCPUs
axvcpu ->> ArchspecificVCPU: Create architecture-specific VCPU
ArchspecificVCPU -->> axvcpu: VCPU created
axvcpu -->> axvm: VCPUs created
axvm ->> axvm: Load guest image
axvm ->> axvcpu: Run VCPUs
loop VCPU Execution
axvcpu ->> ArchspecificVCPU: Run VCPU
alt VM Exit: I/O Operation
ArchspecificVCPU ->> axdevice: Handle I/O
axdevice -->> ArchspecificVCPU: I/O handled
else VM Exit: Memory Access
ArchspecificVCPU ->> axaddrspace: Handle memory access
axaddrspace -->> ArchspecificVCPU: Memory access handled
else VM Exit: Hypercall
ArchspecificVCPU ->> axvm: Handle hypercall
axvm -->> ArchspecificVCPU: Hypercall handled
end
ArchspecificVCPU -->> axvcpu: VCPU exited
end
axvcpu ->> axvm: VM stopped
axvm ->> axvisor: VM execution completed
Sources: Cargo.lock(L549 - L571) Cargo.lock(L576 - L593) Cargo.lock(L536 - L545) Cargo.lock(L177 - L191)
Component Key Features and Capabilities
Below is a table summarizing the key features and capabilities of the main components:
| Component | Primary Role | Key Features | Architecture Support |
|---|---|---|---|
| axvisor | Entry point and coordinator | VM lifecycle management, System initialization | All |
| axvm | VM management | VM creation, resource management, guest image loading | All |
| axvcpu | VCPU interface | Common VCPU operations, architecture-agnostic interface | All |
| x86_vcpu | x86 VCPU implementation | VT-x/SVM, EPT, VMCS management | x86_64 |
| arm_vcpu | ARM VCPU implementation | EL2 mode, GICv2, Stage-2 translation | ARM/aarch64 |
| riscv_vcpu | RISC-V VCPU implementation | HS mode, SBI services virtualization | RISC-V |
| axaddrspace | Memory virtualization | Memory regions, second-stage page tables, address translation | All |
| axdevice | Device emulation | Device models, I/O handling | All |
| axvmconfig | VM configuration | TOML-based VM configuration | All |
| axhal | Hardware abstraction | Platform initialization, interrupts, timers | All (platform-specific) |
| axtask | Task management | Scheduling, synchronization | All |
| axalloc | Memory allocation | Physical memory, heap management | All |
Sources: Cargo.toml(L14 - L45) Cargo.lock(L549 - L571)
Crate Dependency Tree
The core hypervisor crates have specific dependencies that demonstrate their relationships:
- axvisor depends on:
- axvm - For VM management
- axvcpu - For VCPU operations
- axaddrspace - For memory management
- axstd - For OS services
- Various utility crates (log, bitflags, spin, etc.)
- axvm depends on:
- axvcpu - For VCPU operations
- axaddrspace - For memory management
- axdevice - For device emulation
- axvmconfig - For configuration management
- axvcpu provides common interfaces implemented by:
- x86_vcpu - For x86_64
- arm_vcpu - For ARM/aarch64
- riscv_vcpu - For RISC-V
This modular structure allows AxVisor to maintain a single codebase while supporting multiple architectures through well-defined interfaces and architecture-specific implementations.
Sources: Cargo.toml(L34 - L45) Cargo.lock(L549 - L571) Cargo.lock(L576 - L593)