osx、gcc、最新の x86 の場合:
x86 セグメンテーション ハードウェアとページング ハードウェアはどのように使用されますか?
ほとんどの場合、セグメンテーションハードウェアは使用されません。現在のほとんどのOSは、CS、DS、SS、およびESをすべてのメモリを指すように設定しています(ベースアドレス0、制限4Gig)。それぞれが、そのすべてのメモリへのフルアクセスを許可するように設定されています(CS->実行、DS、ES、SS->読み取り/書き込み)。
つまり、ほとんどすべての実際のアクセス制御はページングユニットで行われます。基本的な考え方は、特定のプロセスによってアクセス可能なページがそのプロセスにマップされるということです。仮想メモリ内にあるページはマップされますが、存在しないとマークされているため、それらの読み取り/書き込みを試みると例外が発生します。OSは、ページングファイルからRAMにデータを読み取り、データに存在するものとしてマークを付け、命令を再開します。
ページのマーク付け方法に関しては、ほとんどの実行可能コードは読み取り専用としてマークされ、プロセス間で共有されます。ほとんどのデータとスタックは読み取り/書き込みのマークが付けられ、共有されません。正確なシステムにもよりますが、スタックスペースには通常、実行されないようにNXビットが設定されています。
少し異なる他のいくつかのビットと部分があります。たとえば、ほとんどのOS(メモリが機能する場合はOS / Xを含む)は、スタックガードページ(アクセスを許可しないスタックの最上位のページ)を設定します。アクセスしようとすると、OSは例外をキャッチし、スタックスペースの別のページを割り当てて、命令を再開します。つまり、スタックに(たとえば)4メガバイトのアドレススペースを割り当てることができますが、実際のRAMは、使用されたおおよそのスペースにのみ割り当てられます(明らかにページサイズの増分で)。
ハードウェアは「大きな」(4メガバイト)ページもサポートします。これらは主に、CPUに直接表示されるグラフィックカード上のメモリの一部など、連続するメモリの大きなチャンクをマッピングするために使用されます。
これは非常に高レベルのビューにすぎませんが、気になることを知らずに詳細を提供することは困難です。OS全体によるページングのすべての使用をカバーしようとすると、(大きな)本全体を占める可能性があります。
1 Windows(他のほとんどのシステムとは異なり)は、セグメンテーションを最小限に使用します。FSをスレッド情報ブロック(TIB)へのポインターとして設定し、現在のスレッドに関する基本情報にアクセスできるようにします。これは、特にWindowsの構造化例外処理(およびベクトル化例外処理)で役立ちます(そして使用されます)。