Open8

ハイパーバイザーのOSの切り替わり部分を解説する

低レベルエンジニア低レベルエンジニア

題材

  • 以下の中の「Guest OS switcher with virtual interrupts example」
  • ディレクトリ構成は以下
    • Armv8-R Virtualization Example 3 - Guest OS Switcher with Virtual Interruptsがhypervisorの本体
      • guest_os1.sguest_os2.sがGuest OS1/2をリンカに配置させるためのファイル
      • hyp_start.sがhypervisorの初期化と割り込みハンドラ、Guest OSの切り替え処理を内包したファイル
      • main.cがmain文を内包したファイル
      • scatter.scatがいわゆるリンカスクリプト
    • Armv8-R Virtualization Ex3 Guest OS 1Armv8-R Virtualization Ex3 Guest OS 2がhypervisor上で動作するGuest OS相当
      • guest_os1_start.sguest_os2_start.sがGuest OS 1、Guest OS 2の初期化処理を内包したファイル(EL1で動作)
      • main.cがGuest OS 1、Guest OS 2のmain文を内包したファイル
      • scatter.scatがいわゆるリンカスクリプト
      • Guest_OS1.binGuest_OS2.binがGuest OS 1、Guest OS 2のイメージ
.
└── Armv8-R Virtualization Examples/
    ├── Armv8-R Virtualization Example 3 - Guest OS Switcher with Virtual Interrupts/
    │   ├── guest_os1.s
    │   ├── guest_os2.s
    │   ├── hyp_start.s
    │   ├── main.c
    │   └── scatter.scat
    ├── Armv8-R Virtualization Ex3 Guest OS 1/
    │   ├── guest_os1_start.s
    │   ├── Guest_OS1.bin
    │   ├── main.c
    │   └── scatter.scat
    └── Armv8-R Virtualization Ex3 Guest OS 2/
        ├── guest_os1_start.s
        ├── Guest_OS1.bin
        ├── main.c
        └── scatter.scat
低レベルエンジニア低レベルエンジニア

hyp_start.s

  • Reset
    • コア0以外をすべてスリープ状態にセット
    • HVBARにベクターテーブルをセット
    • ハイパーバイザーのスタックポインタ、CNTFRQ、浮動小数点周り、GICの設定、