スーパバイザモードでやるメモリ管理について

 今回は思いつきです。

 RISC-V原典を読んで、割り込みの分類を外部から非同期で割り込むインタラプトとその他のトラップに分類していることに気付いた。その他のトラップには従来の例外(エクセプション)も含まれている。例外が発生した命令から例外処理に移り、原因が解決できたらその命令からリトライする。この仕組みでユーザモードのメモリ管理をページテーブル(とTLB)で行っている。RISC-Vではこのメモリ管理用のスーパバイザモードを持っている。その他のプロセッサではすべてを特権モードで処理するが、RISC-Vでそれに相当するのはマシンモードになる。

 さて、ユーザの論理空間に物理メモリを割り当てる仕組みをもうちょっと拡張できないか。ユーザ空間には以下が存在する。

・コード域(実行/Read可)
・静的なデータ 読み出しのみ(Read可)
・静的なデータ 読み書き可(Read/Write可)
・動的なデータ ヒープ領域(Read/Write可)
・スタック領域(Read/Write可)

 このうちヒープ領域の拡大は新たなページを割り付けることで実現できる。そのページにヒープ領域であることのマークが必要かどうか検討。

 スタック領域はユーザー領域から隠蔽できればより安全だろうし、わずかだが他の空間に保存することによりユーザ空間の使える部分が増える。また、スタックとして汎用レジスタを1本潰さないでよい。専用の命令PUSH/POPでアクセスすることにより、一部をハードウェアスタックとして実装し高速化もできる。
 スタック領域はユーザ領域にあわせてスーパーバイザ側で用意する。スタックには汎用レジスタの中身と属性を保存する。コンテキストスイッチ発生で対応するスタック領域に一式を保存する。このため、ユーザ領域に対応したスレッド番号でスタック領域のページを管理する。ハードウェアスタック上のデータは不活性にするか退避させる。
 スタックの機能としてはあと何が必要か。汎用レジスタを指定してPUSH/POPする機能、現在の使用中のスタックの段数、スタックのフラッシュ、指定したリミットからはみ出したときの例外、など。
 スタックはページ管理をしない組み込み系でも便利に使えるはずなので、物理メモリ上にスタック域を決める構造もあったほうがよい。

 ユーザモードから便利に使えるスタックを考えてみたい。


RISC-V原典  オープンアーキテクチャのススメ
Posted with Amakuri at 2018.12.2
デイビッド・パターソン, アンドリュー・ウォーターマン
日経BP社

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック