つまり、物理メモリ、RAM です。
C では、任意のメモリ アドレスにアクセスできます。では、オペレーティング システムは、プログラムのメモリ空間にないメモリ アドレスをプログラムが変更できないようにするにはどうすればよいでしょうか?
各プログラムの開始と終了として特定のメモリアドレスを設定しますか?
ハードウェアと OS の両方がこれをサポートしている場合、オペレーティング システム カーネルはメモリ管理 (MMU) ハードウェアと緊密に連携して、アクセスを許可されていないメモリにアクセスできないようにします。
一般的に言えば、これは、アクセスするアドレスが物理アドレスではなく仮想アドレスであることも意味し、ハードウェアはアクセスを実行するために適切な変換を実行します。
これがメモリ保護と呼ばれるものです。さまざまな方法を使用して実装できます。このテーマに関するウィキペディアの記事から始めることをお勧めします — http://en.wikipedia.org/wiki/Memory_protection
アーキテクチャによっては、プログラムがシステムをクラッシュさせるのを防ぐことさえできないものもありますが、一般的に、プラットフォームはメモリを保護し、異なるプロセスのアドレス空間を分離する手段を提供します。
実際、プログラムにはvirtual memoryが割り当てられており、それを使用して作業しています。OSはRAMの一部を提供します。他のプロセスのメモリにアクセスすることはできません(共有メモリでない限り、調べてください)。
オペレーティング システムは、多くの場合、TLB (Translation Lookaside Buffers) および仮想メモリと組み合わせて「メモリ管理」を行います。これらは、任意のアドレスをページに変換します。オペレーティング システムは、現在のプロセス コンテキストで読み取り可能または実行可能のタグを付けることができます。
プロセッサ MMU またはメモリ管理ユニットの最小要件は、現在のコンテキストでは、アクセス可能なメモリを(ユーザー モードではなく)スーパーバイザ モードのプロセッサ レジスタでのみ設定できる範囲に制限すること です。
これは、CPU 自体が提供する「ページング」と呼ばれるものと関係があります。古いオペレーティング システムでは、メモリ アドレスに直接アクセスできる「リアル モード」がありました。対照的に、ページングは「仮想メモリ」を提供するため、生メモリ自体にアクセスするのではなく、プログラムからメモリ マップ全体に見えるものにアクセスします。
論理アドレスは CPU によって生成され、メモリ マッピング ユニットによって物理アドレスにマッピングされます。物理アドレス空間とは異なり、論理アドレスはメモリ サイズによって制限されず、論理アドレス空間を操作するだけです。アドレスバインディングは MMU によって行われます。したがって、物理アドレスを直接扱うことはありません。
ほとんどのコンピュータ (および 386 以降のすべての PC) には、メモリ管理ユニット (または MMU) と呼ばれるものがあります。その仕事は、プログラムが使用するローカル アドレスを、実メモリから実バイトをフェッチするために必要な物理アドレスに変換することです。MMU をプログラムするのは、オペレーティング システムの仕事です。
この結果、プログラムはメモリの任意の領域にロードされ、実行中のプログラムの観点からは、他の任意のアドレスに見える可能性があります。すべてのプログラムのコードが (ローカルに) 同じアドレスにあるように見え、物理的には異なる場所にあるにもかかわらず、それらのデータが常に (ローカルに) 同じアドレスにあるように見えることはよくあります。各メモリ アクセスで、MMU はローカル アドレス空間から物理アドレス空間に透過的に変換します。
プログラムがローカル アドレス空間にマップされていないメモリ アドレスにアクセスしようとすると、ハードウェアは例外を生成し、通常は「セグメンテーション違反」としてフラグが立てられ、続いてプログラムが強制終了されます。これにより、他のプロセスのメモリへのアクセスが防止されます。
しかし、そうである必要はありません。「仮想メモリ」があり、物理メモリの量を超える RAM に対する現在のリソース要求があるシステムでは、一部のページ (一般的なサイズのメモリのブロックのみ、多くの場合 4 ~ 8kB 程度) をディスクに書き出すことができます。新しいメモリを割り当てて使用しようとするプログラムへのRAMとして。後で、そのページを所有するプログラムがそのページを必要とする場合、メモリ アクセスによって例外が発生し、OS は他のメモリ ページをスワップ アウトして、必要なページをディスクから再ロードします。これが発生している間、「ページ違反」を起こしたプログラムは遅れますが、それ以外は何も気づきません。
プロセス間でメモリを共有する、ディスク ファイルをメモリに直接アクセスできるように見せる、いくつかのページを「NX」として設定して実行可能として扱わないようにするなど、MMU/OS が実行できる他の多くのトリックがあります。コード、物理RAMが使用するアドレスの量とアドレスに関係なく、論理メモリ空間の任意のセクションを使用します。