FPGA開発日記

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

RISC-VのMMUにおけるアクセス権限について

RISC-VのISSの実装の続きをしているが、まだまだ謎が多い。アドレス変換のために、RISC-Vでは複数のアドレス変換モードを持っている。

Draft Privileged ISA Specification v1.7 - RISC-V Foundation

  • Sv39: Page-Based 39-bit Virtual Address System

このSv39は、仮想アドレスが39ビット、物理アドレスが50ビットで設計されており、ページテーブルを最大で3回渡って、仮想アドレスから物理アドレスに変換する仕組みになっている。

msyksphinz.hatenablog.com

基本的な変換方法は、過去の日記に書いたとおりだが、最後の有効なページテーブルにアクセスする時、ページテーブルのアクセス権限について確認する仕組みになっている。ここの部分を調査していく。

1. RISC-V ページのアクセス権限について

基本的に以下のようなテーブルで管理されている。

f:id:msyksphinz:20160307011256p:plain

読み書き、実行については分かりやすい。これらを判断するために、以下のようなテーブルを作って管理することにした。

bool RiscvEnv::IsAllowedAccess (uint8_t type, MemAccType acc_type, PrivMode priv_mode)
{
  uint32_t bias = 0;
  const bool type_table[16][6] = {{0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0},
                                  {1, 0, 1, 0, 0, 1},
                                  {1, 1, 1, 0, 1, 1},
                                  {0, 0, 1, 0, 0, 1},
                                  {0, 1, 1, 0, 1, 1},
                                  {1, 0, 1, 1, 0, 1},
                                  {1, 1, 1, 1, 1, 1},
                                  {0, 0, 0, 0, 0, 1},
                                  {0, 0, 0, 0, 1, 1},
                                  {0, 0, 0, 1, 0, 1},
                                  {0, 0, 0, 1, 1, 1},
                                  {0, 0, 0, 0, 0, 1},
                                  {0, 0, 0, 0, 1, 1},
                                  {0, 0, 0, 1, 0, 1},
                                  {0, 0, 0, 1, 1, 1}};
  if (priv_mode == PrivUser) {
    bias = 3;
  }
  if (type_table[type][bias + acc_type]) {
    return true;
  } else {
    return false;
  }
}

ユーザモードのときはオフセットを3としているが、これはユーザモードとスーパーバイザーモードで、アクセスするテーブルの場所を変えるためだ。

こうすると、とりあえずはテーブルにアクセスした場合、例えばメモリストアの許可されていないページ領域に書き込みにいくとアドレス例外を発生させることができる。 ただし、この場合の例外の飛び先が謎である。確かに、このパタンではスーパバイザーモードから例外が来たときしかパタンが通らないことになっているが、もともとこのパタンはマシンモードしか存在していないことが前提のはず。。。

どうなっているのか、必要とあらばMLに聞いてみる必要がありそうだ。とりあえず、実装できるところまではやったが、まだ腑に落ちない。