1

仮想アドレスとページングについて多くのことを読みました。まず、私が理解したことを人々に話させてください。プロセスが何かを実行したい場合、ハードディスクからメモリにデータをロードしようとします。これを行うには、仮想アドレスを使用します。そのため、MMU は仮想アドレスを検証して、対応する物理ページを見つけるために TLB を調べます。そこに見つからない場合は反転ページ テーブルを調べ、そこにエントリが見つからない場合は最後にページ テーブルを調べます。ページ フォールトが生成され、ページのすべてのスワッピングが行われ、すべてのテーブルが更新されます。そして、私が読んだように、すべてのプロセスには異なるページテーブルと同じ仮想アドレスがあります。そのため、int a[100] として定義された配列要素 a[1000] にアクセスしようとすると、その命令が属していないメモリにアクセスしようとしている可能性があるため、セグメンテーション違反が発生すると確信しています。しかし、仮想アドレスと物理ページの概念を使用するだけで、a[1000] が実行中のプロセスに属していないことを OS が認識する方法。ここで何かが足りないのでしょうか、それとも私の理解全体が間違っていますか?

プロセスが読み取り専用または真のメモリセグメントにアクセスしようとしている場合、メモリアクセスは違法であると言えます。

最後に、OS がどのメモリをどのプロセスに割り当てるかを決定する方法と、このメモリへのアクセスが違法であると OS がどのように決定するかという問題が沸き上がります。

Linux のセグメンテーション違反とは何ですか?

このリンクはあまり役に立ちませんでした。

すべての素敵な人々の入力に前もって感謝します:)

4

2 に答える 2

1

x86では、Linuxはセグメンテーションとページングの組み合わせを使用するため、プログラムによって生成されたアドレスは、最初に対応するセグメントのベースレジスタと制限レジスタの値を検索します。これにより仮想アドレスが得られ、ページテーブルを使用して変換されます。割り当てられていないメモリにアクセスしようとすると、アクセスされたページが制限レジスタで許可されている範囲を超えているため、セグメンテーション違反が発生します。

于 2012-11-05T07:25:04.383 に答える
1

実際、Linux カーネルのすべてのプロセスには、親、PID、子、アドレス空間、保留中のシグナル、それに関連付けられたスレッドなど、対応するプロセスに関するすべての情報を格納する task_struct と呼ばれる明確に定義された構造が関連付けられています。 . これで、アドレス空間エントリは、プロセスの実行中にそのプロセスの正当なアドレス空間をカーネルに伝えます. すべてのプロセスには、作成された最初からカーネルによって割り当てられた独自のアドレス空間があります. そのため、実行中のプロセスが正当なメモリの外側の空間にアクセスしようとすると、フォールトが生成され (セグメンテーション フォールトと呼ばれUnix/Linuxます)、プロセスはカーネルによってプロセスにシグナルを与えることで終了します。OSでメモリ保護を実現することが重要です。

于 2012-11-05T04:45:27.137 に答える