KVM用户空间端口I / O.

时间:2013-10-26 04:35:31

标签: c linux kvm

我目前正在尝试使用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}}未更改)。这是预期的行为吗?或者我是否触发了未定义的行为?

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时看到更新的值以重新启动它。