2

Intel VT ベースのデバッガーを作成しています。

NMI-Exiting=1 の間、vmx-guest の iret 命令のパフォーマンスが変更されるため。したがって、vmx-host で NMI を自分で処理する必要があります。そうしないと、ゲストに nmi 再入可能バグが発生します。

Intelのマニュアルを確認しました:

NMI 割り込みハンドラの実行中、プロセッサは、次の IRET 命令が実行されるまで、NMI ハンドラへの追加の呼び出しを無効にします。後続の NMI をこのようにブロックすることで、NMI ハンドラへの呼び出しがスタックするのを防ぎます。

そのため、vmx-host で iret を自分でシミュレートしようとしています。CPL は ring0 のままで、スタックとコード セグメントは変更されません。

以下にサンプル コードを記述します。これは、NMI によって引き起こされた vmx-exit の後でした。

asm volatile(
    "pushfq \n\t"
    "mov %%cs.%%ax \n\t"
    "push  %%rax\n\t"
    "mov $._restart_code,%%rax \n\t"
    "push %%rax \n\t"
    "iret \n\t"/*manully iret in the host before vmx-entry.*/
    "._restart_code:"
    "nop":);

誰でもいくつかのガイドを表示できますか?

4

0 に答える 0