メモリ保護
メモリ保護・分離の形態はOSによって異なる。パーソナルコンピュータでは、1987年にリリースされたOS/2まで、真のメモリ分離は使用されなかった。それ以前のOSでは、メモリ保護が欠如していることをプロセス間通信で利用することさえあり、ポインタをプロセス間でやりとりすることもあった。Windows 9x系ではプロセスがシステムメモリにアクセス可能である。
メモリ保護を実装したOSの例を以下に挙げる。
Windows NT系
OS/2
OS-9 - オプションで提供
UNIX・Unix系 - Solaris、Linux、BSD、macOS、GNU Hurd
Plan 9 from Bell Labs と Inferno - ベル研究所がUnixの後継として開発したOS
Unix系システムでは、メモリ保護制御のシステムコールとして mprotect() がある。
すなわち、ハードウェアにアクセスするにはカーネルが必須であり、その中で何か悪さをしようとすると悪意あるコードでシステム全体を乗っ取ることになる。
上述のSystem/360の保護キーは物理アドレスと対応している。インテルのItaniumやヒューレット・パッカードのPA-RISCなどでは、それとは異なる保護キー機構が使われており、仮想アドレスと保護キーが対応付けられていて、プロセスに複数の保護キーを割り当て可能である。
ItaniumやPA-RISCのアーキテクチャでは、論理アドレスから物理アドレスへの変換(TLBエントリ)にキー (Itanium) またはプロテクションID (PA-RISC) が付属している。ある時点で動作中のプロセスには保護キーレジスタ群がある(Itaniumでは16本、PA-RISCでは4本)。物理アドレスへの変換で選ばれたTLBエントリにあるキーはそれらレジスタ群にある保護キーと比較される。他のチェックと同時にキーが一致しないとアクセスは許可されない。キーがどのレジスタとも一致しない場合、例外が発生する。その例外処理では、必要に応じて実行中プロセスが他に保護キーを持っていないかチェックする。すなわち、保護キーレジスタ群はソフトウェアが管理するキャッシュのように扱われる。
PA-RISCの保護キーは15ビットから18ビットで、Itaniumでは最小でも18ビットである。保護キーは保護領域 (protection domain) に対応しており、一般的にはライブラリやモジュールなどに対応する。