在链接KVM api中,我可以通过以下结构为来宾分配内存。
struct kvm_userspace_memory_region region = {
.slot = 0,
.guest_phys_addr = 0x1000,
.memory_size = 0x1000,
.userspace_addr = (uint64_t)mem,
};
ioctl(vmfd, KVM_SET_USER_MEMORY_REGION, ®ion);
是的,上面的链接解释了每个变量,但我很难理解。以下是我目前的理解,如果有什么误解请指正。
- 来宾物理内存也是虚拟内存,但它看起来像来宾的物理内存。
- 用户空间地址是用户代码的起始内存地址。
下面是我的疑惑
- 插槽的用途是什么,我可以假设它类似于打开 CPU 时可以看到的实际内存物理插槽。
- 单个插槽是否有最大内存限制,如果不是,那么拥有多个插槽的用例是什么。
- 内存大小是表示用户空间代码的大小还是我们请求来宾物理地址的大小?
- 为什么在那个例子中客户物理内存从 4094 (0x1000) 开始,为什么它不是从 0 开始。如果有任何内存布局或程序,请解释或提供工作链接,我将通过该链接。
这是一种内存映射。与物理内存插槽没有关系。
除了主机可用的内容外,没有任何限制。多个插槽很有用,因为 KVM 中的每个内存“插槽”可以具有不同的属性;目前,与插槽关联的映射可以是原样(透明),也可以是对它的日志写入,或者是只读的。
此外,以这种方式映射的内存插槽从客户的角度来看是用于“物理”内存的;内存映射 I/O 的地址空间未映射到内存插槽。这意味着具有不连续物理内存和交错 MMIO 区域的典型地址空间需要表示多个插槽。
它是内存映射的大小:
memory_size
字节被映射到客户内存,从物理地址开始guest_phys_addr
(从客户的角度来看),使用线性地址的内存userspace_addr
(从主机的角度来看)。这在示例中进行了解释: