FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-V ハイパーバイザー拡張の勉強 (1. ハイパーバイザー特権モード)

ふと思い立ってRISC-Vのハイパーバイザー拡張について勉強することにした。仕様書にはV0.6.1が記載されているので、riscv-privileged-20201106を参考に原文を翻訳しながら勉強していくことにする。

第5章:ハイパーバイザー拡張, Version 0.6.1

注意!このドラフト仕様は、RISC-V Foundationに標準仕様として承認される前に変更される可能性があります。

本章では、RISC-Vのハイパーバイザ拡張について説明する。ハイパーバイザ拡張は、Type-1、Type-2ハイパーバイザ上にゲストのオペレーティングシステムの効率的なホスティングをサポートするためのスーパバイザレベルアーキテクチャを仮想化するためのものである。ハイパーバイザー拡張は、スーパーバイザーモードをハイパーバイザー拡張スーパーバイザーモード(hypervisor-extended supervisor mode : HS-Mode もしくは単純にハイパーバイザーモード)に変更する。このモードはハイパーバイザーもしくはホスティング可能なオペレーティングシステムが動作するためのモードである。ハイパーバイザー拡張はもう一別のアドレス変換モードを追加する、これはゲスト物理アドレス (Guest Physical Address)からスーパーバイザー物理アドレス(supervisor physical address)に変換するものであり、これによりゲストオペレーティングシステムのメモリおよびメモリマップドなI/Oサブシステムを仮想化する。HS-ModeはS-Modeと同様に動作するが、S-Mode以外の命令とCSRレジスタが使用可能であり、これによりあどれすへんかんのあたらしいすてーいを制御しゲストOSを仮想的なS-Mode(VS-Mode)で動作することをサポートする。通常のS-ModeのオペレーティングシステムはHS-ModeとVS-Modeのゲストを変更することなく動作することができる。


メモ:

https://ja.wikipedia.org/wiki/ハイパーバイザ#Type_1(「ネイティブ」または「ベアメタル」)ハイパーバイザ

ハイパーバイザがハードウェア上で直接動作し、全てのOS(ゲストOS)はそのハイパーバイザ上で動作する方式を指す。狭義の「ハイパーバイザ」はこちらのみを指す。

https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Diagramme_ArchiHyperviseur.png/300px-Diagramme_ArchiHyperviseur.png

  • Type-2のハイパーバイザとは

https://ja.wikipedia.org/wiki/ハイパーバイザ#Type_2(「ホスト」)ハイパーバイザ

ハードウェア上でまず別のOSが稼働し(このOSをホストOSと呼ぶ)、その上でハイパーバイザが(ホストOSのアプリケーションとして)稼働し、更にはハイパーバイザの上で更に別のOS(このOSをゲストOSと呼ぶ)を稼働させる方法である。狭義においては、Type 2はハイパーバイザには含まれない。

https://upload.wikimedia.org/wikipedia/commons/5/5c/Diagramme_ArchiEmulateur.png


HS-Modeでは、OSもしくはハイパーバイザは、OSが通常通りS-Modeで動作しているのと同様なSBIを使ってマシンとやり取りを行う。HS-Modeのハイパーバイザーは、VS-ModeのゲストのためにSBIを実装することが期待されている。

ハイパーバイザー拡張は、misaCSRの7ビット目、つまりアルファベットのHに相当するビットを設定することによって有効化される。ハイパーバイザーを実装したRISC-VのHARTはmisa[7]をハードワイヤにすることは推奨されておらず、この拡張を無効化することも可能にしておくべきである。

ベースラインの特権アーキテクチャは、ゲストOSがユーザーレベルで実行される従来の仮想化技術の使用を簡素化するように設計されている。これは、いくつかの特権命令を簡単に検出してトラップできるためである。 ハイパーバイザー拡張機能は、これらのトラップの頻度を減らすことにより、仮想化のパフォーマンスを向上させる。 ハイパーバイザー拡張機能は、ハイパーバイザーをS-Modeで実行し、ハイパーバイザーCSRアクセスのためにM-Modeにトラップし、シャドウページテーブルを維持することにより、拡張機能を実装しないプラットフォームで効率的にエミュレートできるように設計されている。 Type-2ハイパーバイザーのCSRアクセスの大部分は、有効なS-Modeアクセスであるため、トラップする必要はない。 ハイパーバイザーは、ネストされた仮想化を同様にサポートできる。

5.1 特権モード

"V"で表現される現在の仮想化モード(virtualization mode)はHARTがゲスト上で実行しているかどうかを示すものである。V=1であれば、HARTは仮想的なS-Mode(VS-Mode)もしくはVS-Modeで動作しているオペレーティングシステム上で仮想的なU-Mode(VU-Mode)として動作していることを意味する。V=0であれば、HARTはM-Mode、HS-Mode、もしくはHS-Modeで動作しているOS上のU-Modeで動作している。仮想化モードは、同様に2ステージアドレス変換モードが有効(V=1)か無効(V=0)であるかも示している。表5.1はRISC-V HARTのハイパーバイザー拡張における動作モードの一覧である。

f:id:msyksphinz:20210208225625p:plain

メモ:

仮想モード(Virtualization Mode, Vビット)により、現在のHartがゲストとして実行されているのかどうかを判定する。

  • V=1 : 仮想S-Mode(VS-Mode), 仮想U-Mode(VU-Mode)で動作している。これはゲストOS上で動作していることを意味する。また、V=1の場合は2レベルアドレス変換が有効である。
  • V=0 : M-Mode, HS-Mode, HS-Mode下のOS上で動作しているU-Modeのどれかである。

5.2 ハイパーバイザCSR

HS-Mode上で動作するOSとハイパーバイザは、例外と割り込み、アドレス変換を処理するためにスーパバイザCSRを使用する。追加のCSRはHS-Modeモード上で実装されており、VS-Modeで実装されていない。しかし、VS-Modeの2レベルアドレス変換と動作の制御を管理するために使用である。これらは、 hstatus, hedeleg, hideleg, hvip, hip, hie, hgeip, hgeie, hcounteren, htimedelta, htimedeltah, htval, htinst, hgatpである。

さらに、いくつかの仮想スーパーバイザーCSR (VS CSR)は通常のスーパーバイザーのレプリカである。例えば、VS CSRであるvsstatusは通常のsstatusCSRのコピーである。

V=1のとき、VS CSRは該当するスーパーバイザーCSRの代替となる。特に指定されない限り通常のスーパーバイザーCSRの機能をすべて受け継ぐ。スーパーバイザーCSRに対する通常の読み書きの名れいは、すべてVS CSRへのアクセスに置き換えられる。V=1のとき、別々のCSRアドレスに定義されたVS CSRに直接読み書きを行おうとするとそれは仮想命令例外が発生する。(U-Modeで当該動作を実行しようとすると、通常の無効命令例外が発生する。)VS CSR自体は、M-ModeもしくはHS-Modeでのみアクセス可能である。

V=1の時、通常のHSレベルのスーパーバイザーCSRはVS CSR置き換えられる。この時スーパーバイザーCSRの値は保持されるが、特に文書化されない限り直接マシンの動作に影響を与えない。逆にV=0である場合、VS CSRは読み書き可能であるものの、マシンの動作に直接影響を与えない。


メモ:

  • V=0
    • バックグラウンドCSR : VS-Modeの情報
    • フォアグラウンドCSR : HS-Modeの情報
  • V=1
    • バックグラウンドCSR : HS-Modeの情報
    • フォアグラウンドCSR : VS-Modeの情報

HS-mode時のXLENのことをHSXLENと呼ぶ。