同じプログラムの 2 つのインスタンスを開始するとします。両方のプログラムのテキスト領域の仮想アドレスは同じですか?
2 に答える
依存します。ほとんどのシステムでは、同じプログラムを同じ環境 (同じパラメーターなど) で 2 回実行すると、同じアドレス マッピングが見つかります。これは単純に、プロセスが行うことのほとんどが決定論的であり、環境、コマンドライン パラメータ、読み取られるファイルの内容のみに依存し、日付やプロセス ID などの変更データには依存しないためです。これはデバッグ時に非常に便利です。プログラムを再起動すると、コードを少し変更して再コンパイルした後でも、メモリ レイアウトが同じままである可能性があります。もちろん、同時に実行されているプログラムの異なるインスタンスは、同じ仮想アドレスを持つ場合がありますが、同じ物理アドレスを持つことはありません。
OpenBSD やさまざまな強化設定を備えた Linux などの一部のシステムは、アドレス空間レイアウトのランダム化 (ASLR)を実装しています。ASLR は、プロセスが開始されるたびに、そのコード、データ、スタック、およびヒープの仮想アドレスがランダムに決定されることを意味します。これは、セキュリティの脆弱性の悪用を困難にするように設計されたセキュリティ機能です。悪用コードは、既知のアドレスで既知のコードにアクセスすることはできません。ただし、ASLR の普及に伴い、エクスプロイトもより巧妙になり、ASLR を回避するようになっています。ASLR は、複雑さを増すことなくエクスプロイト作成者のワークロードを増加させるため、引き続き有用です。
おそらくそうではありませんが、可能性はあります。各プロセスには、独自の独立したメモリ空間があります。