FPGA開発日記

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

RISC-Vの仮想アドレス→物理アドレス変換機構の構成と実装について (Ver.1.10版)

RISC-Vはシンプルな構成を特徴としているISAではあるが、一つの特徴としてMMUの構成があまりシンプルではないということがある。 シンプルなRISC-Vの構成の中で、ハードウェアページテーブルウォークを採用したRISC-Vは、それも一緒に実装しないと仮想アドレスを導入することができない。

仮想アドレスの変換方式やシステムレジスタの構成は、RISC-V Privilegeモードのバージョンアップに基づいて変更が行われている。

特にRISC-V Privilege Mode Ver.1.7で大きく変更が行われている印象だ。昔Sv39の仕様について書いた気がするのだが、この情報はちょっと古い。

msyksphinz.hatenablog.com

というわけでもう一度まとめてみよう。

RISC-Vの仮想アドレスモード

RISC-Vの仮想アドレスモードは複数用意されている。特にRV32とRV64では使用できる仮想アドレスの種類が違うので注意が必要だ。

  • RV32 の場合
    • Bare : アドレス変換なし。物理アドレスをそのまま使用する。
    • Sv32 : ページベース 32ビット仮想アドレッシング
  • RV64 の場合
    • Bare : アドレス変換なし。物理アドレスをそのまま使用する。
    • Sv39 : ページベース 39ビット仮想アドレッシング
    • Sv48 : ページベース 48ビット仮想アドレッシング
    • Sv57 : ページベース 57ビット仮想アドレッシング (実装仕様なし。予約済み)
    • Sv64 : ページベース 64ビット仮想アドレッシング (実装仕様なし。予約済み)

となっている。これらのモードはどのシステムレジスタのどのビットを参照すれば良いのだろう?それは、Ver1.7から導入された新しいシステムレジスタsatpを参照する。 これまではspbtr と呼ばれていたのだが、名称とビットアドレスが変更されている。

(RISC-V Privileged Mode Ver.1.10 の変更点要約より抜粋)
The supervisor virtual memory configuration has been moved from the mstatus register to the sptbr register. Accordingly, the sptbr register has been renamed to satp (Supervisor Address Translation and Protection) to reflect is broadened role.

SATP システムレジスタは以下のような構成になっている。

f:id:msyksphinz:20180408194618p:plain
f:id:msyksphinz:20180408194820p:plain
図. SATPレジスタの構成。RV64構成時

SATPシステムレジスタの中でMODEレジスタが存在しており、MODEレジスタの値で仮想アドレッシングの構成が決められている。

0 1 2-7 8 9 10 11 12-15
RV32 Bare Sv32 - - - - - -
RV64 Bare - - Sv39 Sv48 Sv57 Sv64 -

仮想アドレッシングでのアドレス変換の方法

仮想アドレッシングとして定義されているSv32 / Sv39 の両方とも基本的な考え方は一緒である。 ハードウェアページテーブルウォークの方式を採用しており、以下のような手段でアドレス変換を行う。

  • 仮想アドレスを VPN[N], PageOffset に分割する。
  • (変換後の)物理アドレス を PPN[N], PageOffset に分割する。
  • PTE(Page Table Entry) と呼ばれるメモリ中に配置されたテーブルをウォークしていき、アドレス変換を行う。

という仕組みになっている。Sv32 と Sv39 のVPN / PPN / PTE の構成について、資料から抜粋しておく。

f:id:msyksphinz:20180408200249p:plain
図. Sv32 でのアドレス変換テーブルの構成
f:id:msyksphinz:20180408200302p:plain
図. Sv39 でのアドレス変換テーブルの構成

実際のアドレス変換の方法だが、以下に概要を示す。

f:id:msyksphinz:20180408212913p:plain
図. RISC-Vでのアドレス変換方式の概要 (Sv39の例。Sv32では最大でも2回のアドレス参照に限定される)
  1. 最初に参照するページテーブルのアドレスは、 SATP.PPN×PAGESIZEとなる。これをAとする。Sv39はi=2, Sv39はi=1とする。
  2. 最初に参照するページテーブルのアドレスを計算する。A + VA.VPN[i]×PTESIZE がそのアドレスであり、PTE(Page Table Entry)を参照する。
  3. PTEエントリを参照し、PTE.V(valid信号) / PTE.R / PTE.W などを参照してページテーブルの有効性をチェックする。
  4. PTE.R = 1でPTE.X =1 であれば、そのエントリは最終エントリである。PTE参照を中止し、5. に移動する。そうでなければ、次のPTEを参照する。iを1つデクリメントし、A = PTE.PPN × PAGESIZE とし、2. に移動する。
  5. 最終PTEエントリを発見すると、そのエントリにアクセスできるかどうかをチェックする。アクセス許可が得られなければ、ページアクセス例外を発生する。
  6. i > 0 かつ PA.PPN[i-1] != 0 であれば、ページテーブル参照のMisAlignである。ページアクセス例外を発行する。
  7. PTE.A および PTE.D に基づくアクセスチェックを行う。
  8. 変化は終了である。以下のようにして物理アドレスを生成する。
  9. PA.PageOffset = VA.PageOffset
  10. i > 0 であれば、PA.PPN[i-1:0] = VA.PPN[i-1:0] とする。つまり、途中までのページテーブルを使って物理アドレスを生成する。
  11. のこりのアドレス領域を変換する。 PA.PPN[LEVELS-1:i] = PTE.PPN[LEVELS-1:i] とする。

注意事項としては、PTEのアクセス判定チェックの方式だ。Ver.1.7ではかなり複雑なアクセスチェック方式が採用されていたが、Ver.1.7ではアクセスチェック方式が簡略化されている。

f:id:msyksphinz:20180408214229p:plain
図. Ver.1.7でのPTEのアクセス判定方式。
f:id:msyksphinz:20180408214258p:plain
図. Ver.1.10でのPTEのアクセス判定方式。

例外発生時アドレスを格納するTVALレジスタ

Ver.1.7以降で新設されたTVALレジスタ (MTVAL / STVAL / UTVAL) は、これまでは MBADADDR / SBADADDR レジスタなどと呼ばれていたが、名称が変更された。

これはメモリアクセス時の例外時に設定されるレジスタで、似たようなレジスタとしてはSEPCレジスタがあるのだが、

  • TVALレジスタ : 例外が発生したメモリアドレス (つまり、ロード・ストア命令ではアクセスを行ったアドレス)が格納される。
  • EPC レジスタ : 例外が発生した命令のアドレス(つまり、ロード・ストア命令では、アクセスを行った命令のアドレス)が格納される。
f:id:msyksphinz:20180408215601p:plain
図. STVALレジスタの構成。