在链接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);是的,上面的链接解释了每个变量,但我很难理解。以下是我目前的理解,如有任何误解,请指正。
下面是我的怀疑
发布于 2020-02-10 10:20:26
这个插槽的目的是什么,我是否可以假设它类似于实际的内存物理插槽,我们可以看到,如果我们打开CPU。
这是一个内存映射。与物理内存插槽没有任何关系。
一个插槽是否有任何最大内存限制,如果不是,有多个插槽的用例是什么?
除了主机可用的内容之外,没有任何限制。多个插槽很有用,因为KVM中的每个内存“槽”可能有不同的属性;目前,与插槽相关联的映射可以是-is(透明),也可以是日志写入,或者是只读的。
此外,以这种方式映射的内存槽从来宾的角度来看是用于“物理”内存的;内存映射I/O的地址空间不映射到内存插槽。这意味着具有不连续物理内存和交错MMIO区域的典型地址空间需要多个时隙来表示。
内存大小是表示用户空间代码的大小还是我们请求的来宾物理地址的大小?
这是内存映射的大小:memory_size字节被映射到客户机内存中,从物理地址guest_phys_addr开始(从来宾的角度),使用线性地址userspace_addr的内存(从主机的角度)。
为什么在这个例子中,来宾物理内存是从4094 (0x1000)开始的,为什么它不是从0开始的。如果有任何内存布局或过程,请解释或提供一个工作链接,我将通过该链接。
在示例中解释了这一点:
对于初始状态,我们将预加载此代码到来宾“物理”内存的第二页(以避免与地址0处不存在的实模式中断描述符表冲突)。
https://unix.stackexchange.com/questions/566243
复制相似问题