gpt4 book ai didi

c - KVM 用户空间端口 I/O

转载 作者:行者123 更新时间:2023-11-30 17:45:32 24 4
gpt4 key购买 nike

我目前正在试验 KVM,并尝试让 US(用户空间)I/O 正常工作。目前,输出(即 out dx, eax)可以工作,美国代码可以看到写入的值,但输入(in eax, dx)似乎不起作用 - VM 未收到 US 代码写入的值。

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 寄存器(应该是 0xdeadbeef)时,我得到零。根据我在文档(kvm/Documentation/api.txt)中读到的内容,这就是我应该这样做的方式。我错过了什么吗?

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

最佳答案

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

关于c - KVM 用户空间端口 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19602860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com