質問: ss:off。?x86ハードウェアがこの問題を保護する方法を理解していませんセグメントが重複している場合
回答: 確かに、たくさんの用語が飛び交い、混乱する言葉遣いがありましたが、私は答えるために最善を尽くします。私が知る限り、あなたの理解の大部分は正しいと言えますが、いくつかのポイントがあります。ページングと仮想メモリがハードウェアコンテキストからどのように機能するかを理解することが重要です。プロセスはメモリの配置方法に依存しない必要があり、オペレーティングシステムはシステム上のすべてのプロセスをベビーシッターするためにソフトウェアを使用する必要がないため、ページングはハードウェアサポートなしでは実用的ではありません。そこで登場するのがメモリ管理ユニット(mmu)です。このユニットは基本的にオペレーティングシステムによってプログラムされ、仮想アドレス空間にページを配置し、オペレーティングシステムによって自由に制御できます。オペレーティングシステムは、どのページが実際に物理ramにあり、どのページがまだロードされていないか、またはスワップアウトされているかをユニットに通知できます。では、プログラムがこのメモリ管理のものを台無しにしないようにするにはどうすればよいでしょうか。私たちが保護と呼ぶもの。プロセスがオペレーティングシステムや他のプロセスと干渉しないように、プロセスをサンドボックス化しておくことができます。これらの用語がすべて一緒に使われる理由についての混乱は、それらが実際に相互に関連しているという事実から生じています。コードが持つ特権は、ページテーブルによって指定されます。ページテーブルは、mmu仮想空間のレイアウト方法を示し、mmuページがa)存在するかどうかb)読み取り/書き込み可能c)コードの実行を許可するかどうかも示しますd)そのページのコードが実行できる特権レベル(リング)。スケジューラがプロセスをスケジュールするとき、ページテーブルは再作成されず、新しいメモリを配置する必要はありません。オペレーティングシステムは、mmuに別のページテーブルを使用するように指示するだけです。これはo(1)プロセス、つまり、プロセスのサイズや使用するメモリの量に依存しません。プロセス全体が一度にメモリにスワップインおよびスワップアウトされることはめったになく、通常は一度にページのみであるため、「スワッピング」という用語は「ページスワッピング」として明確にされることがよくあります。さて、そのような背景で、私はあなたの質問のそれぞれに答えようとします: 線形アドレス空間とは、0から2 ^ 32までの範囲にアクセスできることを意味します。 16ビットプロセッサの時代に必要だったような凝ったセグメンテーションの必要はありません。仮想メモリとは、プロセスの線形アドレス空間がメインメモリではなくオペレーティングシステムによって定義されることを意味します。つまり、オペレーティングシステムはこのアドレス空間にページを任意に配置し、それ自体を高レベルに配置し、プロセスをたとえば、下位レベル。さらに、プロセッサは、この仮想アドレス空間のどの部分にどの特権でアクセスできるかを指定できます。オペレーティングシステム(カーネル)はすべての仮想アドレス空間にロードされるため、プロセスはシステムコールを実行でき、プリエンプトされたときに移動できる場所があります。ただし、osによって「特権コードのみ」としてマークされているため、この領域の読み取りまたは書き込みはできません。プロセッサのシステムコールメカニズム(つまり、ソフトウェア割り込み)を介してのみアクセスできます。デマンドページングとは、プロセスがこの仮想アドレス空間の特定の部分(おそらくファイルまたはそれ自体の一部)を含むことを期待していることを意味しますが、実際には存在せず、osはページテーブルの領域を「存在しない」とマークしています。 。プロセスが最終的にこの領域にアクセスすると、存在しないため、cpuはosによってトラップされた障害をスローします。その後、osはそのページをロードし、中断したところからプロセスを再開するのに十分スマートです。その結果、プロセスは問題を認識せず、要求されたときにのみロードされ、メモリを節約します。 仮想メモリは、ページテーブルとその保護を指定するこのメカニズム全体の名前であり、ページはディスクなどの別のメディア上にある可能性があるため、ページングします。仮想メモリは、おそらくセグメンテーションを除いて、おそらくあなたのタイトルの総称です。特定のプロセスを参照するときは、「プロセスの仮想アドレス空間」のようなものを個人的に使用します。これは、特定のプロセスの仮想メモリレイアウトを明確に参照しているためです。 いいえ。前述したように、osは実メモリをプロセスの仮想アドレス空間内の任意の場所に任意にマップできます。これは、たとえば、プロセスコードがアドレス0x0にあるが、ヒープ(成長)が0xfffffffで始まり、アドレス空間の反対側でクリアされる状況が発生する可能性があることを意味します。デバイスドライバがハードウェア用の特定のアドレス領域を必要とするため、実際にはマッピングされる場所に制約がある場合がありますが、仮想メモリを理解するために、制限はありません。 セグメンテーションは、単なるアドレス指定スキームです。 286では、保護を実装するためのメカニズムとしても使用されていましたが、柔軟性が低すぎることが判明したため、32ビットプロセッサでは、保護は常にページングで行われます(ただし、私が理解しているように、286保護スキームはページング時に保持されます)無効になっています)。保護はページングメカニズムによって定義されるため、セグメンテーションはフラットメモリモードよりもデータを上書きするリスクを多かれ少なかれ引き起こしません。ほとんどの実行可能ファイル形式では、コードセグメントはデータセグメントから明確に分離されています。コードが変更されることはないと予想できるため、オペレーティングシステムは通常、コードセグメントのページを読み取り専用としてマークします。したがって、コードに書き込もうとすると障害が発生し、プログラムが終了します。最新のオペレーティングシステムでは、すべての変数と配列がスタックまたはヒープを介して割り当てられている場合、これは発生しません。ただし、プログラムがこれ以外のことを突っ込み始めた場合、コードを上書きする前にクラッシュします。より大きなリスク(および以前は大きな問題であったリスク)は、スタックがバッファオーバーランで上書きされることです。一部の人はこれを利用してコードをスタックに置き、それを不正に実行させる可能性があります。修正として、ページテーブルの「noexecute」(nx)ビットに新しいビットが配置されました。これにより、ページが実行されるのを防ぎます。 これはまったく真実ではありません。セグメントは、アドレス空間の元の2 ^ 32バイトの領域(セグメント)へのポインタとして機能するだけです。この背後にある考え方は、元々、ポインタを小さく保つというものでした。これは、セグメントポインタと、そのセグメント内にアドレス空間全体よりも小さいポインタを含めることができるためです。たとえば、286(16ビットプロセッサ)では、ポインタを16ビットに保つことは理にかなっていますが、286は2 ^ 24バイトのメモリをアドレス指定できるため、これには問題がありました。ソリューション?セグメンテーションを使用します。セグメントは2 ^ 16バイトの大きさで、アドレス空間の任意の場所を指すことができます。次に、コードが動作する必要がある場合、そのセグメント内でのみ16ビットポインターを使用します。これはより速く、より効率的でした。 32ビットプロセッサが登場したとき、このメカニズムはもはや必要ではありませんでしたが、以前のコードで非常に多く使用され、プログラマーがそれらに慣れていたため、セグメンテーションを維持しました。新しい64ビットプロセッサは、セグメンテーションをまったく使用しません。 ここでの混乱は、仮想メモリがこれらのさまざまなメカニズムの多くの用語であるという事実です。あるプロセスを別のプロセスのアドレス空間から保護するためのマルチタスクには、仮想メモリが必要です。ページング、ひいてはプリエンプティブマルチタスクは、仮想メモリ機能でのみ可能です。ただし、これらの機能の多くは効果的に無効にすることができます。おそらくあなたはアドレス変換を望まないのですか?次に、すべてのページをそれ自体にマップします。おそらく、メモリ保護は必要ないが、アドレス変換は必要ですか?次に、すべてのページにすべての権限を付与します。 dosやその他のシングルプロセッサシステムでは、「プロテクトモード」を参照すると混乱が生じます。通常、これは16ビットのリアルモードではなく32ビットモードを指します。そのため、名前にもかかわらず、必ずしも保護が使用されることを意味するわけではなく、そのモードでのみ有効にできます。この「保護モード」で実行されるが、仮想メモリも保護も使用しない単一プロセスシステムはおそらく多くあります。オリジナルのxboxはその良い例です。これらの機能をすべて無効にすると、パフォーマンスがわずかに向上する可能性があります。ただし、dosでは、これらの機能の多くを使用する方が有利な場合があります。最も注目すべきはページスワッピングです。dosが普及していた初期の頃はramを入手するのが困難であったため、ramに保存されたメカニズムは歓迎されよく使用されていました。保護は、プログラムが醜い方法でクラッシュするのを防ぎ、より良いデバッグを可能にし、悪いハードウェアアクセスによるデータの破損を防ぐことができるため、単一プロセスシステムでもその利点がありました。 これがあなたの質問に答えることを願っています。