0
MMIO ON VT-X                  @syuu122813年4月13日土曜日
よくこんな風に説明しますね              単純なエミュレーション:ゲストOSのプログラムの全命令を              ソフトウェアエミュレーションして実行→すごい遅い              VT-x以前の仮想化:ゲストO...
ゲストOSのプログラムを              そのまま実行できる!13年4月13日土曜日
ゲストOSの命令は全部ネイティブに実行される       から、ハイパーバイザは介入しないんだよね!13年4月13日土曜日
( ゚д゚)ハッ! こんな所に                       BHyVeのソースコードが…              int              vmm_emulate_instruction(void *vm, int v...
VT-Xなハイパーバイザで      命令エミュレーション必要なの…?13年4月13日土曜日
_人人人人人人_              > 必要です <               ̄Y^Y^Y^Y^Y ̄13年4月13日土曜日
何故?13年4月13日土曜日
VT-xなハイパーバイザの                      ライフサイクル                                                      guest                     ...
IO命令によるVMExit              IO命令が実行された時点でVMExitが発生              VMExitの詳細情報(Exit Qualification)から以下のような情報を取得               ...
IO命令のエミュレーション              Exit Qualificationの情報に基いてIO命令をエミュレーション出来る               IN命令(イミディエイト値):EAX = ioport_read(imm)  ...
MMIOによるVMExit              MMIOは通常のメモリアクセスと同じ命令を用いる              →IO命令と違って命令で判別してVMExit出来ない              アクセスしたアドレスで判別可能  ...
MMIOでのVMExit時に                                  得られる情報              EPT violation時のVMExit Qualification                どの種...
情報が足りない状態でMMIOを                 エミュレートするには              ゲストEIPの指すアドレスの命令をデコードして、              オペコード・オペランドを取得              ...
情報が足りない状態でMMIOを                 エミュレートするには              ゲストEIPの指すアドレスの命令をデコードして、              オペコード・オペランドを取得              ...
_人人人人人人人人人人人人_               > 命令エミュレーション <               ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄13年4月13日土曜日
( ゚д゚)ハッ! これがそうだったのか              int              vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie ...
なんでCPUがやってくれないのか                         (想像)              x86アーキテクチャでは、メモリアクセス可能な命令              やアドレッシングモードの種類が非常に多い    ...
しんどい               デバイス                                    guest                       /usr/sbin/bhyve                    ...
Local APIC仮想化支援              Local APICは割り込み周りで頻繁にアクセスされる              が、MMIOを使っており準仮想化にも馴染みづらいデ              バイス         ...
Coalesced MMIO (KVM)              MMIO領域の中には読み書きによる副作用が無く、              単純なメモリ読み/書きに置き換えられる部分が存在               VGAボードのピクセル...
まとめ              ハードウェア仮想化支援機構といっても、なんでもや              ってくれるわけじゃない              最後はソフト屋が頑張るしかない              根性とバッドノウハウ・転ん...
Upcoming SlideShare
Loading in...5
×

MMIO on VT-x

1,215

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,215
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
14
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "MMIO on VT-x"

  1. 1. MMIO ON VT-X @syuu122813年4月13日土曜日
  2. 2. よくこんな風に説明しますね 単純なエミュレーション:ゲストOSのプログラムの全命令を ソフトウェアエミュレーションして実行→すごい遅い VT-x以前の仮想化:ゲストOSのプログラムをそのままCPUで実行 するとホストOSのステートが壊れる →実行してはならない命令を動的に置き換えてネイティブに実行 (VMwareのBinary Translation) VT-xを用いた仮想化:CPUをゲストモードへ切り替え、ゲストOS のプログラムをネイティブに実行(置き換え不要)13年4月13日土曜日
  3. 3. ゲストOSのプログラムを そのまま実行できる!13年4月13日土曜日
  4. 4. ゲストOSの命令は全部ネイティブに実行される から、ハイパーバイザは介入しないんだよね!13年4月13日土曜日
  5. 5. ( ゚д゚)ハッ! こんな所に BHyVeのソースコードが… int vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie, mem_region_read_t memread, mem_region_write_t memwrite, void *memarg) { int error; if (!vie->decoded) return (EINVAL); 命令エミュレーションっぽい switch (vie->op.op_type) { コードが有るんですけど… case VIE_OP_TYPE_MOV: error = emulate_mov(vm, vcpuid, gpa, vie, memread, memwrite, memarg); break; case VIE_OP_TYPE_AND: error = emulate_and(vm, vcpuid, gpa, vie, memread, memwrite, memarg); break;13年4月13日土曜日
  6. 6. VT-Xなハイパーバイザで 命令エミュレーション必要なの…?13年4月13日土曜日
  7. 7. _人人人人人人_ > 必要です <  ̄Y^Y^Y^Y^Y ̄13年4月13日土曜日
  8. 8. 何故?13年4月13日土曜日
  9. 9. VT-xなハイパーバイザの ライフサイクル guest /usr/sbin/bhyve userland ioctl(VM_RUN) VMExit BSD guest vmm.ko kernel kernel VMEntry Host mode Guest mode ホストOSのカーネルからゲストモードへ切替(VMEntry) ハードウェアへのアクセスなどハイパーバイザの介入が必要な処理 が実行されたらゲストモードを停止、ホストOSへ戻る(VMExit)13年4月13日土曜日
  10. 10. IO命令によるVMExit IO命令が実行された時点でVMExitが発生 VMExitの詳細情報(Exit Qualification)から以下のような情報を取得 アクセスサイズ(1,2,4 bytes) IN方向かOUT方向か String命令(INS)か REP prefixが付いているか IOポート番号はイミディエイト値か、DXレジスタ参照か IOポート番号(イミディエイト値)13年4月13日土曜日
  11. 11. IO命令のエミュレーション Exit Qualificationの情報に基いてIO命令をエミュレーション出来る IN命令(イミディエイト値):EAX = ioport_read(imm) OUT命令(イミディエイト値):ioport_write(imm, EAX) IN命令(DX参照):EAX = ioport_read(DX) OUT命令( DX参照):ioport_write(DX, EAX) INS命令:*(ES:EDI) = ioport_read(DX) OUTS命令:ioport_write(DX, *(ES:EDI))13年4月13日土曜日
  12. 12. MMIOによるVMExit MMIOは通常のメモリアクセスと同じ命令を用いる →IO命令と違って命令で判別してVMExit出来ない アクセスしたアドレスで判別可能 →MMIO領域に該当するページにアクセスした時に VMExit(EPT violation)が起きるようにEPTを設定 (read/write共に拒否)13年4月13日土曜日
  13. 13. MMIOでのVMExit時に 得られる情報 EPT violation時のVMExit Qualification どの種類のアクセス権違反でVMExitが起きたか ページに設定された権限 ゲストOSがアクセスしたアドレス(論理・物理) アクセスしたアドレスとアクセス方向(読み・書き)は分かる 書き込み元・読み込み先の情報(アドレス or レジスタ)とアクセス幅 が分からない どんな命令が実行されたのか分からない13年4月13日土曜日
  14. 14. 情報が足りない状態でMMIOを エミュレートするには ゲストEIPの指すアドレスの命令をデコードして、 オペコード・オペランドを取得 オペコード通りの動作をエミュレート アクセス先アドレスがMMIO領域ならデバイスの挙動 をエミュレート13年4月13日土曜日
  15. 15. 情報が足りない状態でMMIOを エミュレートするには ゲストEIPの指すアドレスの命令をデコードして、 オペコード・オペランドを取得 オペコード通りの動作をエミュレート アクセス先アドレスがMMIO領域ならデバイスの挙動 をエミュレート13年4月13日土曜日
  16. 16. _人人人人人人人人人人人人_ > 命令エミュレーション <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄13年4月13日土曜日
  17. 17. ( ゚д゚)ハッ! これがそうだったのか int vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie, mem_region_read_t memread, mem_region_write_t memwrite, void *memarg) { int error; if (!vie->decoded) return (EINVAL); switch (vie->op.op_type) { case VIE_OP_TYPE_MOV: error = emulate_mov(vm, vcpuid, gpa, vie, memread, memwrite, memarg); break; case VIE_OP_TYPE_AND: error = emulate_and(vm, vcpuid, gpa, vie, memread, memwrite, memarg); break;13年4月13日土曜日
  18. 18. なんでCPUがやってくれないのか (想像) x86アーキテクチャでは、メモリアクセス可能な命令 やアドレッシングモードの種類が非常に多い そもそもEPT violationはページへのアクセス権限エラー を知らせるVMExitであって、MMIOを知らせるVMExit ではない13年4月13日土曜日
  19. 19. しんどい デバイス guest /usr/sbin/bhyve userland エミュレータ ioctl(VM_RUN) VMExit BSD guest vmm.ko kernel kernel VMEntry Host mode Guest mode ただでさえMMIO領域に触れる度にVMExitするのに、 更にデバイスエミュレータがユーザランドに居るので コンテキストスイッチが発生13年4月13日土曜日
  20. 20. Local APIC仮想化支援 Local APICは割り込み周りで頻繁にアクセスされる が、MMIOを使っており準仮想化にも馴染みづらいデ バイス この領域のMMIOだけVT-xが特別扱い 専用のVMExit ReasonとExit Qualificationを用意 →命令エミュレーションが不要に レジスタ・条件によってはVMExit自体省略13年4月13日土曜日
  21. 21. Coalesced MMIO (KVM) MMIO領域の中には読み書きによる副作用が無く、 単純なメモリ読み/書きに置き換えられる部分が存在 VGAボードのピクセルデータの領域とか VMExitが発生したらカーネル内で命令エミュレーション を実行、メモリ読み/書きを実施 ユーザランドでのデバイスエミュレーションを省略 e1000ドライバ(NIC)のパフォーマンスが9.7%向上13年4月13日土曜日
  22. 22. まとめ ハードウェア仮想化支援機構といっても、なんでもや ってくれるわけじゃない 最後はソフト屋が頑張るしかない 根性とバッドノウハウ・転んでも泣かない すげぇ頑張ったのに新しいハード出るとハード出来る ようになってたりすることもある(VT-x自体がそう)13年4月13日土曜日
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×