我目前正在尝试使用KVM,并尝试让美国(用户空间)I / O正常工作。目前,输出(即out dx, eax
)有效,美国代码可以看到写入的值,但输入(in eax, dx
)似乎不起作用 - VM没有收到美国写的值代码。
if (run->io.port == 0xface && run->io.direction == KVM_EXIT_IO_IN)
{
printf("Port 0xface read\n");
*(volatile uint32_t *)((uintptr_t)run + run->io.data_offset) = 0xdeadbeefu;
continue;
}
run
是指向struct kvm_run
的指针,该mmap
之前为run->io.data_offset
并且具有足够的空间(即continue
是指针的有效偏移量)。 rax
语句最终导致VM重新启动,代码继续正常运行。但是,当我尝试获取VM的0xdeadbeef
寄存器(应该是kvm/Documentation/api.txt
)时,我得到零。从我在文档(continue
)中读到的内容来看,这就是我应该如何做到的。我错过了什么吗?
在半相关说明中,如果我在run->io.count = run->io.count;
语句前面加count
,则会再次触发I / O(即使{{1}}未更改)。这是预期的行为吗?或者我是否触发了未定义的行为?
答案 0 :(得分:0)
问题在于实际的mmap
电话:
run = mmap(NULL, mapSize, PROT_READ | PROT_WRITE, MAP_PRIVATE, vcpuID, 0);
flags
参数应为MAP_SHARED
而不是MAP_PRIVATE
:
run = mmap(NULL, mapSize, PROT_READ | PROT_WRITE, MAP_SHARED, vcpuID, 0);
^^^^^^^^^^
虚拟机将在发出KVM_RUN
时看到更新的值以重新启动它。