在链接中KVM接口我可以通过下面的结构为来宾分配内存。
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 开始。如果有任何内存布局或过程,请解释或提供工作链接,我将浏览该链接。
答案1
该插槽的用途是什么,我可以假设它与我们打开 CPU 时可以看到的实际内存物理插槽类似吗?
这是一种内存映射。与物理内存插槽没有关系。
单个插槽是否有最大内存限制,如果没有,那么拥有多个插槽的用例是什么。
除了主机可用的内容之外,没有任何限制。多个插槽非常有用,因为 KVM 中的每个内存“插槽”可以具有不同的属性;目前,与槽关联的映射可以是原样(透明),也可以是日志写入,或者是只读的。
此外,从客户的角度来看,以这种方式映射的内存插槽旨在用于“物理”内存;内存映射 I/O 的地址空间未映射到内存插槽。这意味着具有不连续物理内存和交错 MMIO 区域的典型地址空间需要多个插槽来表示。
内存大小是表示用户空间代码的大小还是我们请求的来宾物理地址的大小?
它是内存映射的大小:memory_size
字节被映射到客户内存,从物理地址开始guest_phys_addr
(从客户的角度),使用线性地址的内存userspace_addr
(从主机的角度)。
为什么在该示例中,来宾物理内存从 4094 (0x1000) 开始,为什么它不是从 0 开始。如果有任何内存布局或过程,请解释或提供工作链接,我将浏览该链接。
示例中对此进行了解释:
对于我们的初始状态,我们会将此代码预加载到来宾“物理”内存的第二页中(以避免与不存在的内存发生冲突)实模式中断描述符表在地址0)。