Project Configuration
Relevant source files
This document covers the project configuration, dependency management, and build requirements for the x86_vcpu hypervisor library. It explains the Cargo.toml configuration, feature flags for different virtualization technologies, and the crate interface requirements that users must implement.
For information about the build system and CI/CD pipeline, see Build System and CI.
Core Dependencies
The x86_vcpu crate is built upon a carefully selected set of dependencies that provide low-level x86 hardware access, memory management, and hypervisor framework integration.
Dependency Architecture
flowchart TD subgraph subGraph5["ArceOS Hypervisor Framework"] axaddrspace["axaddrspace (git)"] axvcpu["axvcpu (git)"] end subgraph subGraph4["Interface System"] crate_interface["crate_interface = \0.1\"] end subgraph subGraph3["Memory Management"] page_table_entry["page_table_entry = \0.5\"] memory_addr["memory_addr = \0.3.1\"] axerrno["axerrno = \0.1.0\"] end subgraph subGraph2["Utility Crates"] log["log = \0.4.19\"] cfg_if["cfg-if = \1.0\"] bitflags["bitflags = \2.2\"] bit_field["bit_field = \0.10\"] numeric_enum["numeric-enum-macro = \0.2\"] end subgraph subGraph1["Low-Level x86 Support"] x86["x86 = \0.52\"] x86_64["x86_64 = \0.15\"] raw_cpuid["raw-cpuid = \11.0\"] end subgraph subGraph0["x86_vcpu Project"] Cargo["Cargo.toml"] LibMain["lib.rs"] end Cargo --> axaddrspace Cargo --> axerrno Cargo --> axvcpu Cargo --> bit_field Cargo --> bitflags Cargo --> cfg_if Cargo --> crate_interface Cargo --> log Cargo --> memory_addr Cargo --> numeric_enum Cargo --> page_table_entry Cargo --> raw_cpuid Cargo --> x86 Cargo --> x86_64 LibMain --> crate_interface LibMain --> x86 LibMain --> x86_64
Sources: Cargo.toml(L6 - L22)
Dependency Categories
Category | Crates | Purpose |
---|---|---|
x86 Hardware | x86,x86_64,raw-cpuid | Low-level x86/x86_64 instruction access, CPUID feature detection |
Bit Manipulation | bitflags,bit_field,numeric-enum-macro | Hardware register field manipulation, flag definitions |
Memory Management | page_table_entry,memory_addr,axerrno | Page table abstractions, address types, error handling |
Interface System | crate_interface | Trait-based dependency injection for hardware abstraction |
Hypervisor Framework | axaddrspace,axvcpu | ArceOS hypervisor ecosystem integration |
Utilities | log,cfg-if | Logging and conditional compilation |
Sources: Cargo.toml(L6 - L22)
Feature Flags
The crate uses feature flags to support different virtualization technologies while maintaining a single codebase.
Feature Configuration
Sources: Cargo.toml(L24 - L27)
Available Features
Feature | Default | Description |
---|---|---|
vmx | ✓ | Intel VMX (Virtual Machine Extensions) support |
amd | ✗ | AMD SVM (Secure Virtual Machine) support |
The default
feature set includes vmx
, making Intel VMX the primary supported virtualization technology. Users can explicitly enable AMD support by specifying features = ["amd"]
in their Cargo.toml
or disable VMX with default-features = false
.
Sources: Cargo.toml(L24 - L27)
Crate Interface Requirements
The x86_vcpu crate requires users to implement the PhysFrameIf
trait to provide hardware abstraction for physical memory management.
Interface Implementation Pattern
flowchart TD subgraph subGraph3["Hardware Layer"] PhysicalMemory["Physical Memory"] VirtualMemory["Virtual Memory Mapping"] end subgraph subGraph2["Required Methods"] alloc_frame["alloc_frame() -> Option"] dealloc_frame["dealloc_frame(paddr: PhysAddr)"] phys_to_virt["phys_to_virt(paddr: PhysAddr) -> VirtAddr"] end subgraph subGraph1["x86_vcpu Crate"] PhysFrameIf["PhysFrameIf trait"] frame_rs["frame.rs"] PhysFrame["PhysFrame"] end subgraph subGraph0["User Application"] UserImpl["PhysFrameIfImpl struct"] ImplMacro["#[crate_interface::impl_interface]"] end ImplMacro --> PhysFrameIf PhysFrameIf --> alloc_frame PhysFrameIf --> dealloc_frame PhysFrameIf --> frame_rs PhysFrameIf --> phys_to_virt UserImpl --> ImplMacro alloc_frame --> PhysicalMemory dealloc_frame --> PhysicalMemory frame_rs --> PhysFrame phys_to_virt --> VirtualMemory
Sources: README.md(L7 - L29)
Implementation Requirements
Users must provide a concrete implementation of the PhysFrameIf
trait using the crate_interface::impl_interface
macro. The trait defines three essential methods:
alloc_frame()
: Allocates a 4KB-aligned physical memory frame, returningSome(PhysAddr)
on success orNone
if allocation failsdealloc_frame(paddr: PhysAddr)
: Deallocates a previously allocated physical frame at the specified addressphys_to_virt(paddr: PhysAddr) -> VirtAddr
: Converts a physical address to its corresponding virtual address in the current address space
Sources: README.md(L13 - L29)
Example Implementation Structure
The README provides a template showing the required implementation pattern:
#![allow(unused)] fn main() { // From README.md:13-29 struct PhysFrameIfImpl; #[crate_interface::impl_interface] impl axvm::PhysFrameIf for PhysFrameIfImpl { fn alloc_frame() -> Option<PhysAddr> { /* implementation */ } fn dealloc_frame(paddr: PhysAddr) { /* implementation */ } fn phys_to_virt(paddr: PhysAddr) -> VirtAddr { /* implementation */ } } }
The implementation must handle physical memory allocation and mapping according to the host system's memory management requirements. A reference implementation can be found in the [ArceOS project](https://github.com/arceos-hypervisor/x86_vcpu/blob/2cc42349/ArceOS project)
Sources: README.md(L9)
Project Metadata
The project uses Rust edition 2024 and follows semantic versioning with the current version 0.1.0, indicating it is in initial development phase.
Sources: Cargo.toml(L1 - L4)