FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io

RISC-V の メモリプロテクション機構について (PMP : Physical Memory Protection)

RISC-V はどのようなターゲットにも適用することの出来るCPUアーキテクチャを目指している。 それはMPU(Micro Processor Unit) だけでなく MCU(Micro Controller Unit)としても活用することができる。

MCUで多く使用される(MPUもだろうけど) メモリ保護の機構についても、RISC-Vで定義されている。 大きく分けて、 PMA(Physical Memory Attribute) と PMP(Physical Memory Protection) である。 PMAはハードウェアで設定されているメモリマップ属性、PMAはソフトウェアで設定することのできるメモリマップ属性だ。

まずは、PMP(Physical Memory Protection) について仕様を見てみよう。 RISC-V Privileged Mode Manual Ver.1.10 を参照しながら、読み解いていこう。

物理メモリのプロテクション (Physical Memory Protection: PMP)

PMA(Physical Memory Attribute)が、ハードウェア的にメモリアクセスの属性を定義する機構であることに対し、PMP(Physical Memory Proctection)はソフトウェアによるメモリ領域の保護機構である。 PMPによるチェックはPMAと同時にチェックされる。

PMPアクセスもPMAと同様に、すべてのメモリアクセス(Read/Write/命令フェッチ)に適用される。 ただし、いくつか制約があり、

  • S-Mode/U-Modeの場合はすべてのメモリアクセス(Read/Write/命令フェッチ)に対してPMPが適用される。
  • mstatusレジスタのMPRVビットが設定されており、mstatusレジスタのMPPフィールドにS-Mode/U-Modeが設定されている場合に、ロード・ストア操作に対してPMPが適用される。

PMPチェックはすべてのページテーブルアクセスに対してもチェックされる。

また別のケースとして、PMPレジスタ自体がロックされている場合にはM-Modeでも適用されるケースがある。

PMPCSRレジスタ構成

PMPの設定は大きく分けて2種類のレジスタで構成される。

  • pmpcfg : PMPのコンフィグレーション
  • pmpaddr : PMPの設定アドレス

まずはpmpcfgから見ていこう。RV32とRV64では構成が異なるので要注意である。

PMPは現在の構成では16種類設定できるようになっている。

f:id:msyksphinz:20180410004114p:plain
図. pmpcfg レジスタのレイアウト(RV32)
f:id:msyksphinz:20180410004255p:plain
図. pmpcfgレジスタのレイアウト(RV64)

このpmpcfgレジスタレジスタレイアウトだが、以下のようになっている。

f:id:msyksphinz:20180410004134p:plain
図. pmpcfgレジスタのビットレイアウト
  • Lビット : Lockビット。pmpcfgレジスタのRWを設定する。
  • Aビット : アドレスマッチングのためのモード
  • X/W/R ビット : メモリアクセスのためのフィールド

これらについては詳細を後に見ていく。

次にpmpaddrだ。これはpmpcfgと対になって使用される。こちらもRV32とRV64で構成が異なっている。

f:id:msyksphinz:20180410004154p:plain
図. pmpaddrレジスタのレイアウト(RV32 / RV64)

アドレスマッチングの方法

PMPレジスタを使ったページアクセス許可の判定では、

  • アドレスをどのようにして判定するか
  • アクセス許可の判定方法

の2つに大別される。まずはアドレスマッチングの方法について見ていく。

アドレスマッチング方式の種類

アドレスマッチング方式についてはpmpcfg のAビットで設定される。Aビットは2ビット長であり以下のエンコーディングで設定される。

A 名前 説明
0 OFF Null領域(PMP無効)
1 TOR Top領域
2 NA4 4バイト領域にアラインするモード
3 NAPOT 8バイト以上で2の累乗の領域でアラインするモード

TORの意味は、そのレジスタで設定されたアドレスは、アドレスマッチングの上位のアドレスであることを示している。例えばpmpcfg[i]レジスタでTORを設定すると、pmpaddr[i]pmpaddr[i-1] で指定される領域でアドレスマッチングが行われる。もしi=0の領域でTORを設定した場合、0<addr<pmpaddr[0] までがアドレス設定領域として指定される。

一方でNAPOT / NA4はアドレスマスクを使ってアドレス領域を設定する。以下のようなイメージだ。つまり、NA4はNAPOTの1種類ととらえることができるだろう。

f:id:msyksphinz:20180410004212p:plain
図. NAPOT/NA4のアドレス領域指定方法。NA4は4バイトでアラインする。それ以外はマスクとして指定。

PMPレジスタのアドレスマッチングは、下位のレジスタ番号から順に適用される。M-Modeの場合、すべてのレジスタアドレスにマッチングしなかった場合に、アクセスはスルーされ、そのままバスに流される。S-Mode/U-Modeにおいて、PMPレジスタエントリが実装されている場合は、レジスタアドレスにマッチングしないアドレスはアクセスはブロックされる。

Lockビットの役割

pmpcfgのLビットは、Lockビットの意味を持っている。このビットを設定するとM-ModeでもProtection判定が適用され、R/W/Xのビット設定もM-Modeでもチェックされるようになる。

Lビットの解除は、RISC-Vのシステムリセットでしか解除することができない。したがってこの設定は半永久的である。