メモリ覗き見
今回はメモリの覗き見のお話、これが出来れば実行中のプロセスのメモリイメージを参照したり、スタックを参照したり出来ます。
そもそもなぜMonaでプロセスAからプロセスBのメモリを覗き見できないかというと、各プロセスに独立したプロセス空間(アドレス空間)を与えられていてそこで実行されているからである。
例えばプロセスAがメモリ1000番地にアクセスしたとしても、プロセスBの1000番地にアクセスできるわけではないのである。
以下のようにそれぞれのプロセスから見えるメモリは、実際の物理メモリにマッピングされていていてかぶらないようになっています。
プロセスAのメモリ1000番地⇒実は物理メモリのアドレスだと 500番地
プロセスBのメモリ1000番地⇒実は物理メモリのアドレスだと 750番地
Monaではこれを「ページング」という仕組みで実現しています。
で、WindowsにしろLinuxにしろ各プロセスに独立したプロセス空間を割りあてているのです。(多分・・・)
なぜこんな事をやっているかというと、プロセスやカーネルの保護のためである。
共通のプロセス空間(アドレス空間)でプロセスやカーネルが走っている場合、ひとつのプロセスがプログラムミスなどで暴走すれば他のプロセスやカーネルを巻き添えにしかねないのでそれを事前に防ぐのだ。
前置きが長くなりましたが、Monaでメモリを覗き見するにはページングで使用しているカーネル内にあるデータ構造のページディレクトリやページテーブルをちょいちょいといじって上記のマッピングを変えてあげればよい。
プロセスAのメモリ1000番地⇒実は物理メモリのアドレスだと 500番地
プロセスBのメモリ2000番地⇒実は物理メモリのアドレスだと 500番地
プロセスAは、2000番地にアクセスすることでプロセスAの1000番地にアクセスできます。
ちなみ上記と同様の方法を用いてMonaでは共有メモリの仕組みを提供しています。