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 在 内存管理 中排名
42,747 每月下载量
在 30 个 包中使用 30 个(直接使用28个)
370KB
6.5K SLoC
vm-memory
设计
在典型的虚拟机监控器(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允许两种不同的映射模型:Foreign
和Grant
。
在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);
}
许可证
此项目根据以下之一获得许可:
- Apache许可证,版本2.0
- BSD-3-Clause许可证
依赖项
~0.3–1MB
~21K SLoC