GDBを使用してデバッグするために両方のプロセスを開いたとき、/proc/PID/mapsが両方のプロセスが同じアドレス領域を持っていることを示しました。
cat /proc/4170/maps
555555554000-555555555000 r--p 00000000 08:01 655807 /home/user/1
555555555000-555555556000 r-xp 00001000 08:01 655807 /home/user/1
555555556000-555555557000 r--p 00002000 08:01 655807 /home/user/1
555555557000-555555558000 r--p 00002000 08:01 655807 /home/user/1
555555558000-555555559000 rw-p 00003000 08:01 655807 /home/user/1
cat /proc/4177/maps
555555554000-555555555000 r--p 00000000 08:01 664427 /home/user/2
555555555000-555555556000 r-xp 00001000 08:01 664427 /home/user/2
555555556000-555555557000 r--p 00002000 08:01 664427 /home/user/2
555555557000-555555558000 r--p 00002000 08:01 664427 /home/user/2
555555558000-555555559000 rw-p 00003000 08:01 664427 /home/user/2
これがどのように処理されるのか理解できません。各プロセスには独自のページテーブルが必要だと思いました。
答え1
これがどのように処理されるのか理解できません。各プロセスには独自のページテーブルが必要だと思いました。
これがここで起こっていることです。のアドレスは/proc/.../maps
物理アドレスではなく仮想アドレスです。各プロセスのページテーブルを介して解釈されるため、プロセスは物理メモリから個々のページを取得します(共有ページを除く)。
したがって、両方のプロセスには仮想アドレス555555558000-555555559000で使用可能な書き込み可能メモリがありますが、各プロセスはそのメモリに対して異なるページテーブルを持ち、最終的に異なる物理アドレスを指します。
(いくつかの追加の詳細を含めて少し単純化しました。例えば書き込み時にコピーなどがありますが、ここではこれを無視できます。 )