0

サイズの異なるデータを持つ 2 つの配列を除いて、単純な C プログラムで 2 つの変数 (1 つはグローバル、もう 1 つはローカル) を宣言しました。strcpy()呼び出しを行う前にルーチンを使用してバッファ オーバーフローを引き起こしreturn 0;ます。また、端末画面にセグメンテーション違反エラーが表示されます。

このSIGSEGVシグナルを受信した後、システムはプロセス メモリのコア ダンプを取り、そのプロセスを終了しますが、システムはスタック/ヒープ メモリおよび BSS セグメント、テキスト セグメントなどの他のセクションのクリーンアップ (ゼロアウト) を行いますか?

プロセスが正常に終了すると、システムはメモリのクリーンアップ (ゼロアウト) を行うと思いますが、よくわかりません。

プログラムを実行するためにUbunutu 10.12とを使用しています。gcc

4

1 に答える 1

3

Linuxプロセスが終了すると (通常、_exit syscallを呼び出すことによって、たとえば から戻ることによってmain、または のようなシグナルを介してSIGSEGV)、そのアドレス空間は存在しなくなります。

実際には、カーネルは以前のプロセスのメモリをゼロにしません。関連するページを空きページのセットに追加するだけで、後でこれらのページを再利用します。ページを再利用すると、ページがクリアされるか、適切なコンテンツで埋められます。これはすべてカーネル内で発生し、アプリケーションは適切に埋められた (またはクリアされた) ページのみを認識します。

仮想メモリについてもっと読むべきです。また、優れた高度な UNIX プログラミング高度な Linux プログラミングの本を読むことをお勧めします。

プロセスは仮想メモリのみを認識し、それらのアドレス空間はexecve(2)システムコールによって設定され、たとえばmmap(2)システムコールによって変更される可能性があります。

于 2012-10-16T05:35:19.873 に答える