質問: FreeBSDのAPIで、与えられた仮想アドレスからどのプロセスで使っているかを調べるKernelAPIはありますでしょうか。 もし可能であれば、LinuxのKernel APIでも同様のことができるのか教えていただければと思います。 よろしくお願いいたします。
回答: Win32 では .EXE のロードアドレスは [そのプロセスの仮想記憶域の 0x0040 0000 番地] です。この数値は x86 アーキテクチャの仮想記憶保護機構のページの大きさや Win95 と MS-DOS との互換を保つための仮想 86 モードの実装上の都合などから決まっています。 Linux/FreeBSD でも x86 上では事情は同じなので同じ数値が使われています(のはずです)。 つまりどういうことかというと、 - 仮想アドレスというのはプロセスごとに定義しなおすものである - プロセス foo 内では仮想アドレス 0x0040 0000 番地は foo.EXE のロード開始位置 - プロセス bar 内では仮想アドレス 0x0040 0000 番地は bar.EXE のロード開始位置 - プロセス baz 内では仮想アドレス 0x0040 0000 番地は baz.EXE のロード開始位置 ということで「異プロセスが同一仮想アドレス値を使う」のはごく普通の話となっています。 もちろん foo と bar で、ロードされている物理メモリは違う場所です。 なので「プロセスを特定しないで」仮想アドレスだけ持ってきても無意味です。 仮想アドレスと物理アドレスの対応表ならなんとなく意味がありそうな気もしますが - 32bit OS で 4 ギガ単位になる表を得ても巨大すぎて使い道がなさそう - まして 64bit OS ではテラ単位になってもっと意味がなさそう - プロセスの、物理メモリ上の位置はいつでも任意に再配置があり得て、過去の調査結果は今と一致しない可能性のほうが高い あたりの事情によって、調べることができてもおいしくないと思われます。 この質問に至った本当の動機がわかればまた別の回答がつくかもしれません。