5个不稳定版本

0.3.0 2023年3月1日
0.2.2 2022年11月10日
0.2.1 2022年11月8日
0.2.0 2022年10月24日
0.1.0 2022年5月12日

#269 in 仿真器

每月29次下载

Apache-2.0

145KB
2.5K SLoC

dbs-address-space

设计

dbs-address-space 包是一个虚拟机地址空间管理器,它管理驻留在客户物理地址空间中的内存和MMIO资源。

主要组件包括

  • AddressSpaceRegion:维护客户地址区域配置信息的结构体。
#[derive(Debug, Clone)]
pub struct AddressSpaceRegion {
    /// Type of address space regions.
    pub ty: AddressSpaceRegionType,
    /// Base address of the region in virtual machine's physical address space.
    pub base: GuestAddress,
    /// Size of the address space region.
    pub size: GuestUsize,
    /// Host NUMA node ids assigned to this region.
    pub host_numa_node_id: Option<u32>,

    /// File/offset tuple to back the memory allocation.
    file_offset: Option<FileOffset>,
    /// Mmap permission flags.
    perm_flags: i32,
    /// Hugepage madvise hint.
    ///
    /// It needs 'advise' or 'always' policy in host shmem config.
    is_hugepage: bool,
    /// Hotplug hint.
    is_hotplug: bool,
    /// Anonymous memory hint.
    ///
    /// It should be true for regions with the MADV_DONTFORK flag enabled.
    is_anon: bool,
}
  • AddressSpaceBase:管理客户物理地址空间的基础实现,不支持区域热插拔。
#[derive(Clone)]
pub struct AddressSpaceBase {
    regions: Vec<Arc<AddressSpaceRegion>>,
    layout: AddressSpaceLayout,
}
  • AddressSpaceBase:具有区域热插拔能力的地址空间实现。
/// The `AddressSpace` is a wrapper over [AddressSpaceBase] to support hotplug of
/// address space regions.
#[derive(Clone)]
pub struct AddressSpace {
    state: Arc<ArcSwap<AddressSpaceBase>>,
}

使用方法

// 1. create several memory regions
let reg = Arc::new(
    AddressSpaceRegion::create_default_memory_region(
        GuestAddress(0x100000),
        0x100000,
        None,
        "shmem",
        "",
        false,
        false,
        false,
    )
    .unwrap()
);
let regions = vec![reg];
// 2. create layout (depending on archs)
let layout = AddressSpaceLayout::new(GUEST_PHYS_END, GUEST_MEM_START, GUEST_MEM_END);
// 3. create address space from regions and layout
let address_space = AddressSpace::from_regions(regions, layout.clone());

许可证

本项目采用Apache许可证,版本2.0。

依赖项

~3.5MB
~67K SLoC