2012-06-06 52 views
1

現在我正在做一個關於qemu-kvm和linux任務調度程序的項目。我知道每個VCPU是由qemu創建到linux操作系統的正常任務。然後我嘗試執行qemu命令以查看該任務是如何創建的。我使用strace來跟蹤所有的系統調用。還有像「叉」或「pthreadcreate」沒有的事。但我已經看到了這一點:qemu-kvm如何在內部創建VM線程?

open("/dev/kvm", O_RDWR|O_LARGEFILE) = 3 
ioctl(3, KVM_GET_API_VERSION, 0)  = 12 
ioctl(3, KVM_CHECK_EXTENSION, 0x19)  = 0 
ioctl(3, KVM_CREATE_VM, 0)    = 4 
ioctl(3, KVM_CHECK_EXTENSION, 0x4)  = 1 
ioctl(3, KVM_CHECK_EXTENSION, 0x4)  = 1 
ioctl(4, KVM_SET_TSS_ADDR, 0xfffbd000) = 0 
ioctl(3, KVM_CHECK_EXTENSION, 0x25)  = 0 
ioctl(3, KVM_CHECK_EXTENSION, 0xb)  = 1 
ioctl(4, KVM_CREATE_PIT, 0xb)   = 0 
ioctl(3, KVM_CHECK_EXTENSION, 0xf)  = 2 
ioctl(3, KVM_CHECK_EXTENSION, 0x3)  = 1 
ioctl(3, KVM_CHECK_EXTENSION, 0)  = 1 
ioctl(4, KVM_CREATE_IRQCHIP, 0)   = 0 
ioctl(3, KVM_CHECK_EXTENSION, 0x1a)  = 0 

所以看起來它打開設備的/ dev/KVM和做了一些IOCTL系統調用。我相信這是虛擬機線程實際創建的地方。對?我對操作系統的東西很陌生,如果有人能給我一些線索,我會很感激:>謝謝

+0

虛擬機不是一個線程。 – duskwuff

+0

@duskwuff但是從我所瞭解到的情況來看,在KVM中,虛擬機中的每個VCPU都是主機所看到的線程linux –

+0

不完全是這樣。每個VCPU只是一個單獨的可運行對象。有關KVM ioctl的詳細信息,請參閱http://www.mjmwired.net/kernel/Documentation/kvm/api.txt。 – duskwuff

回答

2

VCPU既不是OS線程也不是進程。爲了理解VCPU的工作原理,首先我們應該弄清楚guest虛擬機操作系統在Intel VT-x體系結構上的運行方式。

Intel VT-x提出了一個新的模式,方法有兩個模式:VMX root modeVMX non-root mode,分別運行主機VMM與客戶。 Intel VT-x還包含一個新的結構:VMCS,它保存主機和來賓所需的所有信息。 VMCS是每位客人。

KVM是硬件輔助的管理程序,並利用Intel VT-x。主機Linux KVM正在運行在VMX root mode中。當KVM決定切換CPU模式以運行guest虛擬機時,KVM會將所有當前上下文轉儲到VMCS並執行「VMLAUNCH」指令。 「VMLAUNCH」將CPU從VMX root mode轉移到VMX non-root mode,並從VMCS加載訪客上下文,然後啓動或繼續執行guest代碼。

總之,guest代碼直接在VMX non-root mode的CPU上運行。不需要用於VCPU的軟件仿真層。這就是爲什麼KVM具有更好的性能,並且沒有特定的客戶線程。

/dev/kvmkvm.ko創建,它只是QEMU的KVM接口。您的strace輸出顯示了QEMU如何與KVM進行交互並控制潛在客戶。 KVM中永遠無法找到forkclone系統調用。

如需瞭解更多KVM詳細信息,尤其是VCPU,您可以閱讀arch/x86/kvm/vmx.c中的KVM代碼,以獲取更多基於Intel VT-x的VCPU實施細節。

1

即使VCPU是與線程或進程不同的OS對象,並且使用KVM_CREATE_VCPU ioctl創建VCPU對象,QEMU也確實爲每個VCPU創建一個線程。當QEMU從該線程執行KVM_RUN時,客戶機運行(物理CPU進入VMX非根模式)。 KVM_CREATE_VCPU返回一個新的文件描述符,這就是您將在KVM_RUN ioctl中看到的fd。

因爲您沒有使用-ff選項,您的strace中可能缺少VCPU線程。 -ff要求strace也跟蹤最初的線程。

+0

感謝提及strace -ff選項。 #strace一個過程並遵循所有分支: strace -ff -p12345 – kumar