0
我目前正在試驗KVM,並試圖讓US(用戶空間)I/O工作。目前,輸出(即out dx, eax
)有效,美國代碼可以看到寫入的值,但輸入(in eax, dx
)似乎不起作用 - 虛擬機沒有收到美國代碼寫入的值。KVM用戶空間端口I/O
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
ED更早,有足夠的空間(即run->io.data_offset
是一個有效的從指針偏移)。語句最終會導致VM重新啓動,並且代碼正常繼續。但是,當我嘗試獲得VM的rax
寄存器(應該是0xdeadbeef
)時,我得到零。從我在文檔中看到的(kvm/Documentation/api.txt
),這是我應該如何做的。我錯過了什麼嗎?
在半相關說明中,如果我在語句前面加上run->io.count = run->io.count;
,則會再次觸發I/O(儘管count
未更改)。這是預期的行爲?或者我觸發未定義的行爲?