我目前正在试验 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_run
是mmap
之前 ed 并且有足够的空间(即run->io.data_offset
是从指针的有效偏移量)。该continue
语句最终导致 VM 重新启动,并且代码正常继续。但是,当我尝试获取 VM 的rax
寄存器(应该是0xdeadbeef
)时,我得到零。根据我在文档 ( kvm/Documentation/api.txt
) 中阅读的内容,我应该这样做。我错过了什么吗?
在半相关的注释中,如果我在continue
语句之前加上run->io.count = run->io.count;
,则再次触发 I/O(即使count
没有更改)。这是预期的行为吗?还是我触发了未定义的行为?