一人一党党

一人一人の、一人一人による、一人一人のための政治制度を!

Inferno - MMU無しでメモリ保護

この記事は
Plan 9 Advent Calendar 2019 - Qiita
https://qiita.com/advent-calendar/2019/plan9
の21日目のために書いた。

Plan 9由来なら何でもどうぞとの事なので、このOSから派生した特異なOSについて触れてみた。
Inferno (オペレーティングシステム)
https://ja.wikipedia.org/wiki/Inferno_(%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)
自分はPlan 9に触れたことが無いので分からないが、
http://shirou.prosou.nu/emacs-wiki/Inferno.html
によると基本的にはほとんど変わらないらしい。
しかしOSの実装方法から言えば、Plan 9Windowsが同じ穴のムジナに見えるくらい、InfernoはPlan 9からかけ離れている。

近代的なOSの重要な役割の一つに、ユーザープログラムが一つくらい異常動作しても、OSや他のユーザープログラムを巻き込まずに対処できることが挙げられる。
特に、ソフトウェア開発者が自らのために作った出自を持つUnix以降のOSでは、開発途中の、言い換えればバグ入りのソフトウェアを動かすことが前提になる。
このためには幾つかの機能が必要になるが、その一つがメモリ保護だ。
OSの基幹コードのあるメモリ領域がデタラメな値で埋め尽くされれば、システムはクラッシュするだろう。
他のプログラムのメモリを読めるならば、うっかりスパイウェアを動かすことができない。
これらを防ぐために、Plan 9Windowsも大抵のUnix系OSも、メモリ管理ユニット(MMU)という回路を積んだCPUを必要とする。

一方Infernoでは、メモリ保護機能の実装にMMU回路を使わない。
というより、メモリ保護機能が無い。
Infernoではユーザープログラムをバイトコードコンパイルして仮想マシンで動かしているのだが、このコンパイル済みバイトコードを上手くイジると、OSが落ちる。
私はLinux上でのInfernoエミュレータでしか実験していないが、バイトコードからframe領域確保命令(0x05 "frame")を見つけて確保領域量を過小にするように書き換えてみたところ、未確保領域アクセスを検出してInfernoエミュレータが終了したり、自力では検出できずにLinux側のセグメンテーション違反に引っかかってエミュレータがクラッシュした。
なのに基本的にPlan 9と同じように使える理由は、そのバイトコードを出力するコンパイラにある。
Infernoに搭載されているプログラミング言語limboは、いわゆる強い型付けの言語だ。
怪しげなメモリアクセスをするソースコードコンパイルの時点で殆ど弾かれ、残りも実行時型チェック用のコードを挿入される。
つまり、Infernoのメモリ保護機能を実現しているのは、OS付属のlimboコンパイラということになる。

MMUを使わないということは、物理マシン上で直接動作するInferno OSと、他のOSのアプリケーションとして動作するInfernoエミュレータで、ほぼ同じ実装方法が使えるということだ。
近年では、MMUをユーザープログラムでも使えるCPUが増えてきたが、使用手続きがCPUやOSによって異なり、使い易いとは言い難い。
MMUを使わないOSなら、通常のユーザープログラムの範囲内の技術で実装できる。
コンパイラによってメモリ保護を行なうInfernoの手法は、OS実装の参考になるかも知れない。

・追伸
Verve (operating system) - Wikipedia
https://en.wikipedia.org/wiki/Verve_(operating_system)
Infernoと異なり、OSの受け付けるバイトコードが強い型付けの命令セットなので、怪しげなバイトコードによるOSのクラッシュを防止できる。