22 个版本 (13 个重大更新)

0.14.1 2024年3月11日
0.13.1 2023年10月11日
0.12.0 2023年6月29日
0.10.0 2022年11月11日
0.2.0 2020年3月19日

#16内存管理 中排名

Download history 12183/week @ 2024-03-26 17407/week @ 2024-04-02 12001/week @ 2024-04-09 12210/week @ 2024-04-16 15129/week @ 2024-04-23 11730/week @ 2024-04-30 13091/week @ 2024-05-07 12690/week @ 2024-05-14 11646/week @ 2024-05-21 13760/week @ 2024-05-28 13345/week @ 2024-06-04 19683/week @ 2024-06-11 11266/week @ 2024-06-18 9512/week @ 2024-06-25 9505/week @ 2024-07-02 9910/week @ 2024-07-09

42,747 每月下载量
30 包中使用 30 个(直接使用28个)

Apache-2.0 OR BSD-3-Clause

370KB
6.5K SLoC

vm-memory

crates.io docs.rs

设计

在典型的虚拟机监控器(VMM)中,有几个组件,如引导加载程序、虚拟设备驱动程序、virtio后端驱动程序和vhost驱动程序,它们需要访问虚拟机的物理内存。`vm-memory` 包提供一组特质,用于将虚拟机内存消费者与虚拟机内存提供者解耦。基于这些特质,虚拟机内存消费者可以访问虚拟机的物理内存,而无需了解虚拟机内存提供者的实现细节。因此,基于这些特质的 VMM 组件可以被多个虚拟化解决方案共享和重用。

有关 `vm-memory` 包的详细设计,请参阅 此处

平台支持

  • 架构: x86, AMD64, ARM64
  • 操作系统: Linux/Unix/Windows

Xen 支持

支持Xen在映射虚拟内存时需要特殊处理,因此crate中提供了一个单独的功能:xen。映射Xen的虚拟内存需要发出一个ioctl(),同时使用mmap()对内存区域进行映射。ioctl()的参数通过vhost-user协议的内存区域区域接收。

Xen允许两种不同的映射模型:ForeignGrant

Foreign映射模型中,整个虚拟地址空间一次性地预先映射。在Grant映射模型中,如代表virtqueues的区域等少数内存区域的内存预先映射。其余的内存区域仅在访问缓冲区时(部分)映射,并在访问缓冲区后立即释放。因此,在VolatileMemory.rs中有特殊的处理。

为了仍然支持标准的Unix内存区域,对于特殊区域和测试,这里的Xen特定实现允许第三种映射类型:MmapXenFlags::UNIX。这执行标准的Unix内存映射,并用于此crate中所有测试。

rust-vmm维护者决定保持接口简单,并为标准Unix内存映射或Xen构建crate,而不是两者都构建。

Xen仅支持Unix平台。

使用方法

Cargo.toml中将vm-memory添加为依赖项

[dependencies]
vm-memory = "*"

然后,将extern crate vm-memory;添加到您的crate根目录中。

示例

  • 使用GuestMemory特质的GuestMemoryMmap实现以虚拟机管理程序特定的方式创建VM物理内存对象
fn provide_mem_to_virt_dev() {
    let gm = GuestMemoryMmap::from_ranges(&[
        (GuestAddress(0), 0x1000),
        (GuestAddress(0x1000), 0x1000)
    ]).unwrap();
    virt_device_io(&gm);
}
  • 访问VM物理内存的消费者
fn virt_device_io<T: GuestMemory>(mem: &T) {
    let sample_buf = &[1, 2, 3, 4, 5];
    assert_eq!(mem.write(sample_buf, GuestAddress(0xffc)).unwrap(), 5);
    let buf = &mut [0u8; 5];
    assert_eq!(mem.read(buf, GuestAddress(0xffc)).unwrap(), 5);
    assert_eq!(buf, sample_buf);
}

许可证

此项目根据以下之一获得许可:

依赖项

~0.3–1MB
~21K SLoC