0

我目前正在试验 KVM,并试图让美国(用户空间)I/O 工作。目前,输出(ie 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是一个指向 a 的指针,该指针struct kvm_runmmap之前 ed 并且有足够的空间(即run->io.data_offset是从指针的有效偏移量)。该continue语句最终导致 VM 重新启动,并且代码正常继续。但是,当我尝试获取 VM 的rax寄存器(应该是0xdeadbeef)时,我得到零。根据我在文档 ( kvm/Documentation/api.txt) 中阅读的内容,我应该这样做。我错过了什么吗?

在半相关的注释中,如果我在continue语句之前加上run->io.count = run->io.count;,则再次触发 I/O(即使count没有更改)。这是预期的行为吗?还是我触发了未定义的行为?

4

1 回答 1

1

问题在于实际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虚拟机将在发出重新启动它时看到更新的值。

于 2013-10-29T04:46:47.443 回答