4.データ構造

2644 ワード

システムプラットフォームにおける2つの最も重要なデータ構造は、PCB(Processor Control Block、プロセッサ制御ブロック)およびSDA(System Data Area、システムデータ領域)である.
これらはinc/system_manage_region.incファイルに定義されている.
注:PCBとSDA構造内のすべてのアドレス値は64ビット幅であり、構造が32ビットと64ビットの環境に容易に適応できるように設計されている.
PCB構造
各論理プロセッサは1つのPCB構造に対応しています.つまり、各論理プロセッサは独立したPCB構造を持っています.
PCB構造内の主なデータについて説明します.
アクセスGSセグメント
私たちはPCB構造の基本アドレスをGSセグメントのベースアドレスとして使用します.したがって、コードは常にGSセグメントを使用してPCB構造内のデータにアクセスします.common/protected.asmモジュールでは32ビットのPCB.Base値をGS.baseに書き込みます.コードは以下の通りです.

common/long.asmモジュールでは、64ビットのPCB.base値をGS.baseに書き込む.
;;
;;   GS base  ,       
;;
mov esi, [gs: PCB.Base]
mov edi, [gs: PCB.Base + 4]

... ...

PCB.baseは64ビットのPCBベースアドレスを格納し、WRMSR命令書IA32_GS_BASEレジスタを書くことによってのみ64ビットGS.base値を書き込むことができる.stage1段階では、GS.baseは、PCBの物理的なアドレスを保存し、stage2(改ページの保護モード)またはstage3段階(64-bitモード)に入る前に、線形アドレスを書き込みます.
参照する他のエリアのアドレス
PCB構造内では、参照された他の領域のアドレスを保存するために、いくつかの64ビット幅のアドレス値が定義されています.以下はPCB構造の一部の定義です.

PCB構造のオフセットはGS.baseであり、PCBブロック自体を指す0であり、したがって、コード内の任意の使用は、PCBブロックのアドレスを次の命令で読み出すことができる.
%ifdef __X64
    LoadGsBaseToRbp
%else
    mov ebp, [gs:PCB.Base]
%endif
PCB.Baseは大域のSDAエリアを指しています.ソースコードの中では、通常は下記のようにSDAベースアドレスを読み取ります.
%ifdef __X64
    LoadGsBaseToRbp
%else
    mov ebp, [gs:PCB.base]
%endif
    REX.Wrxb                        ;   x64
    Mov ebx, [ebp + PCB.SdaBase]    ;   SDA  
キャプション管理記録
PCB構造内の部分管理記録は説明書と関連しています.
コードは以下の通りです
プロセッサ情報
PCB構造の大きな部分の値は、プロセッサに関する情報を維持し記録するために使用されます.コードは以下の通りです.
プロセッサのcontext情報
この部分には汎用レジスタcontext情報とx 87 FUSBとXMMユニットのイメージ情報が含まれています.この本コードの中で、この部分の情報は実際的な用途ではありません.
VMXに関する管理記録
PCB構造にはVMXに関する管理記録情報が含まれています.彼らはよく使います.
コードは以下の通りです
struct PCB
{
    ... ...

    ;;
    ;;      domain  
    ;;
    .Domain                 RESQ                1               ;   domain
    .DomainTop              RESQ                1               ; domain  

    ... ...

    ;;
    ;;   VMX VMXON pointer
    ;;
    .VmxonPointer           RESQ                1
    .VmxonPhysicalPointer   RESQ                1

    ;;
    ;;     VMCS region pointer
    ;;
    .VmcsPointer            RESQ                1
    .VmcsPhysicalPointer    RESQ                1

    ;;
    ;;    4  VMCS    ,    VMXS_MANAGE_BLOCK
    ;;
    .VmcsA
}