3

現在、qemu-kvmとLinuxタスクスケジューラでプロジェクトを行っています。各VCPUは、qemuによってLinuxOSに対して作成される通常のタスクであることがわかっています。次に、qemuコマンドを実行して、タスクがどのように作成されるかを確認します。straceを使用してすべてのシステムコールを追跡します。「fork」や「pthreadcreate」のようなものはありませんが、私はこれを見ました:

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を開き、いくつかのioctlsyscallを実行したように見えます。これは、VMスレッドが実際に作成される場所だと思います。右?私はOSに不慣れで、誰かが私にいくつかの手がかりを与えてくれれば幸いです:>ありがとう

4

2 に答える 2

4

VCPU は OS スレッドでもプロセスでもありません。VCPU がどのように機能するかを理解するには、まずゲスト OS がIntel VT-xアーキテクチャ上でどのように実行されているかを理解する必要があります。

Intel VT-xホスト VMM とゲストをそれぞれ実行するための と のVMX root mode2つのモードを持つ新しいモード方法論を提案しました。には、ホストとゲストの両方が必要とするすべての情報を保存する新しい構造 も含まれています。は、ゲストごとに 1 つです。VMX non-root modeIntel VT-xVMCSVMCS

KVM は、ハードウェア支援のハイパーバイザーであり、Intel VT-x. ホスト Linux KVM が で実行されていVMX root modeます。KVM が CPU モードを切り替えてゲストを実行することを決定すると、KVM は現在のすべてのコンテキストをダンプしVMCS、「VMLAUNCH」命令を実行します。「VMLAUNCH」は、CPU を からVMX root modeに転送しVMX non-root mode、VMCS からゲスト コンテキストをロードしてから、ゲスト コードの実行を開始または継続します。

要約すると、ゲスト コードは の CPU で直接実行されますVMX non-root mode。VCPU のソフトウェア エミュレーション レイヤーは必要ありません。そのため、KVM の方がパフォーマンスが高く、ゲスト用の特定のスレッドはありません。

/dev/kvmによって作成されkvm.koます。これは、QEMU の KVM インターフェイスのみです。あなたのstrace出力は、QEMU が KVM とどのようにやり取りし、基盤となるゲストを制御しているかを示していました。forkまたはcloneシステム コールが KVM で見つかることはありません。

KVM の詳細、特に VCPU については、にarch/x86/kvm/vmx.c基づいて VCPU 実装の詳細についてKVM コードを読むことができますIntel VT-x

于 2013-09-03T15:05:29.123 に答える