メモリ保護とは
メモリ保護は、コンピュータの
オペレーティングシステム (OS) において、プログラムが自身の割り当てられたメモリ領域外にアクセスすることを防ぐための技術です。これにより、プログラムのバグや悪意のあるコードによるシステム全体のクラッシュやデータ破損を防ぎ、システムの安定性とセキュリティを確保します。
メモリ保護の重要性
プログラムは、時に予期せぬ動作をすることがあります。特にバグがあると、プログラムが暴走し、システム全体に影響を及ぼす可能性があります。メモリ保護は、このような事態が発生した場合でも、影響を最小限に抑えるための重要な役割を果たします。また、悪意のあるソフトウェアが、他のプログラムやOSのメモリ領域に侵入することを防ぐことで、情報漏洩やシステム乗っ取りのリスクを低減します。
メモリ保護の実現方法
メモリ保護を実現するための具体的な方法には、主に以下のものがあります。
セグメント方式
セグメント方式では、メモリを「セグメント」と呼ばれる可変長の領域に分割します。各
プロセスには、特定のセグメントが割り当てられ、そのセグメント内のメモリにのみアクセスが許可されます。セグメントは、ハードウェアレジスタによって定義され、不正なアクセスを検知します。
例えば、x86アーキテクチャでは、グローバル・ディスクリプタ・テーブルやローカル・ディスクリプタ・テーブルを使用してセグメントを管理します。セグメントレジスタ (CS, SS, DS, ES, FS, GS) を用いて、現在アクセスしているセグメントを特定します。
ページング方式では、メモリを「ページ」と呼ばれる固定長の小さなブロックに分割します。各
プロセスは、仮想
アドレス空間を持ち、その仮想アドレスが物理メモリのどのページに対応するかを「ページテーブル」で管理します。ページテーブルはOSによって管理され、各
プロセスのメモリ空間を分離します。
ページング方式では、仮想メモリを活用することで、物理メモリの制約を超えたメモリ空間を
プロセスに提供できます。また、ページ単位でアクセス権を設定することで、よりきめ細かいメモリ保護を実現できます。例えば、読み取り専用、書き込み可能、実行可能などのアクセス権をページごとに設定できます。ページング機構は、ページフォールトを利用して、必要に応じてディスクからメモリにページをロードし、
仮想記憶を実現します。
保護キー
保護キーは、メモリ領域と
プロセスに割り当てられる数値です。メモリにアクセスする際、ハードウェアは
プロセスの保護キーとアクセスしようとするメモリ領域の保護キーを比較し、一致しない場合はアクセスを拒否します。この機構は、特に
メインフレームで利用されています。
保護キーは、
プロセスが特定のメモリ領域にアクセスできるかどうかをハードウェアレベルで制御します。これにより、
プロセス間の分離が強化され、不正なアクセスを防ぐことができます。
ケイパビリティベースドアドレッシング
ケイパビリティベースドアドレッシングは、ポインタの代わりに「ケイパビリティ」と呼ばれる保護されたオブジェクトを使用します。ケイパビリティは、信頼された
プロセスのみが生成できるため、
プロセスによるメモリ操作を厳格に制御できます。この方法は、研究用システムで利用されることが多く、
仮想機械の基盤となることもあります。
各種OSにおけるメモリ保護
メモリ保護の形態は、OSによって異なります。初期のOSでは、メモリ保護が十分に実装されておらず、
プロセス間のメモリ干渉が発生する可能性がありました。しかし、現在では、ほとんどのOSがメモリ保護を実装しており、システムの安定性とセキュリティが向上しています。
以下に、メモリ保護を実装している代表的なOSを挙げます。
Windows NT系
OS/2
OS-9
UNIX・
Unix系 (
Solaris,
Linux, BSD, macOS,
GNU Hurd)
Plan 9 from Bell Labs と Inferno
これらのOSでは、メモリ保護機構を利用して、プロセスごとに独立したメモリ空間を提供しています。これにより、プロセス間の干渉を防ぎ、システムの安定性を高めています。
まとめ
メモリ保護は、現代のコンピュータシステムにおいて、なくてはならない重要な技術です。セグメント方式、ページング方式、保護キー、ケイパビリティベースドアドレッシングなど、様々な技術が組み合わさることで、システムの安定性、セキュリティ、信頼性が保たれています。
また、OSごとにメモリ保護の実現方法は異なるため、それぞれのOSの特性を理解することも重要です。
参考文献
Intel Developer Manuals:
インテルCPUのメモリ保護に関する詳細な情報源