各プロセスは 4 GB の仮想アドレス空間を取得し、4 GB のうちユーザー空間は 2 GB を取得します。そして、この 2 GB から、OS によってプロセスに割り当てられたメモリのスタック全体を読み取りたいと考えています。
スタック上でサイズ 2000,000 ( char chrArray[2000000];
) のローカル配列を宣言するとします。いくつか質問したいことがあります。
1) and を使用するgcc
とcygwin
、初期化せずにその内容を読み取ることができますが、その内容はほとんど空 (以前%c
は配列をファイルに出力していました) であるか、この配列の最後にいくつかのジャンク データがあります。ジャンク データに存在する 1 つの文字列を取得し、メモリ ダンプ (DumpIt
ツールで取得) で検索しましたが、この文字列はメモリ ダンプに存在しませんでした。
私の質問は、そのジャンクデータはどこから来たのですか? ハードディスクにありましたか?
2)fork()
各子プロセスで char 配列を宣言するために使用することを考えましたが、親プロセスのアドレス空間全体をコピーしてCopy-on-Write
テクニックを使用するため、役に立たないようです。私はこの解釈で正しいですか?
3)私が望むのは、大きなサイズの配列を宣言し、それがいくつかの新しい物理メモリアドレスにマップされるたびに宣言することです。これは達成可能ですか?
そして、このプロセスを繰り返すことで、メモリ全体をスキャンしたいと考えています。
このプログラムを実行するスクリプトを何度も試しbash
ましたが、常に同じ仮想ベース アドレスから開始されます。
for
(たとえば) 10 文字の配列を宣言するループを実行しようとしましたが、それらのベース アドレスを出力すると、すべての配列で同じアドレスが表示されます。
私はプログラムを使用しWindows 7
てC
いますが、必要な OS の知識が不足していると思います。
ありがとう。
PS誰かが私がこれをしている理由を知りたいなら、私はこの分野で研究を行っています.