2013-10-26 20 views
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未更改)。這是預期的行爲?或者我觸發未定義的行爲?

回答

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頒發給重新啓動它。