オペレーティング システムのセグメンテーションのトピックを調べていました。
メモリにロードされたプロセスのアドレス空間に存在する可能性のある空き領域のために、セグメンテーションの概念が生まれたことを学びました。
最初に、研究から理解したいくつかのことを説明しようとします。何か間違っている場合は修正してください。
たとえば、理想的なケースではないかもしれないセグメンテーションが使用されていない場合を考えてみましょう
メモリにロードされた小さなアドレス空間を持つプロセスがあります。プロセスのアドレス空間が物理メモリの先頭に配置されていない可能性があるため、プログラムコードのアドレスを変換するメカニズムが必要です (コードセグメント、どこからPC が指している命令が実行されます) を実際の物理メモリアドレスに割り当てます。したがって、実行中のプロセスのベース値とバインド値を維持するために、この目的のためにハードウェア レジスタ (MMU) を使用します。実行中のプロセスの最後のアドレス。MMU はグローバルであるため、コンテキストの切り替え中にベース/バウンド値を保存する必要があります。
だからここにphysical memory address = virtual memory address + base;
ここで、大きなアドレス空間を持つプロセスがあるとしましょう。プロセスのアドレス空間には、ヒープとスタック、またはコードとヒープの間に大量の空き領域が含まれている可能性があるため、空き領域をより有効に利用するためのセグメンテーションなどのメカニズムが必要です。
セグメンテーションのために、各プロセスのセグメント テーブルを維持します (コンテキストの切り替え中にテーブルを PCB に保存する必要があります)。
セグメンテーションでは、実行中のプロセス アドレス空間の論理セグメントごとにベース/バウンド値を維持します。そのため、理想的には、コード、スタック、ヒープ セグメントごとにベース/バウンド値を維持し、これらの値をセグメント テーブルに格納します。
したがって、セグメント テーブルは次のようになります。
Segment | Base | Bounds
---------------------------
Code | 16K | 1K
Heap | 28K | 1K
Stack | 20K | 2K
物理メモリはこのように見えるかもしれません..
0 |---------------------|
| OS |
| |
....
| |
| |
| |
16K |---------------------|
| (program code) |
| |
17K |---------------------|
|xxxxxxxxxxxxxxxxxxxxx|
|xxxxxxx free xxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxx|
20K |---------------------|
| |
| |
| (stack) |
| |
22K |---------------------|
|xxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxx|
|xxxxxxx free xxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxx|
28K |---------------------|
| |
| (heap) |
29K |---------------------|
|xxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxx|
|xxxxxxx free xxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxx|
32K |---------------------|
プロセッサがコード命令の実行中に仮想メモリ アドレスを物理メモリ アドレスに変換する必要がある場合、セグメント テーブルには多くのベース値が存在する可能性があるため、選択するベース値をどのように知るのでしょうか?
命令がいくつかのスタック変数を更新することであるとしましょう..この場合、スタックのベース値をどのように選択しますか?
物理メモリアドレス=スタックのベースアドレス+命令からの仮想メモリアドレスですか?
また、外部の断片化とは別に、セグメンテーションの欠点は何ですか.
セグメンテーション//ページング/仮想化の概念に関する詳細な説明を含む外部リンクは、非常に役立ちます。