Solaris 動的トレースガイド

ポインタとアドレス空間

ポインタは、「仮想アドレス空間」内で物理メモリーへの翻訳を提供するアドレスです。DTrace は、オペレーティングシステムカーネル自体のアドレス空間内で D プログラムを実行します。Solaris システム全体で、多数のアドレス空間が管理されています。 オペレーティングシステムカーネル用のアドレス空間と、個々のユーザープロセス用のアドレス空間があります。各アドレス空間は、システム上のすべてのメモリーにアクセスできるように見えるので、複数のアドレス空間で同じ仮想アドレスポインタ値を再利用し、それぞれ異なる物理メモリーに翻訳できます。したがって、ポインタを含む D プログラムを作成するときは、使用するポインタに対応するアドレス空間を意識する必要があります。

たとえば、syscall プロバイダを使って、引数として整数ポインタまたは整数配列ポインタを取るシステムコール (例: pipe(2)) の開始を計測する場合、演算子 *[] を使ってそのポインタまたは配列を間接参照することはできません。これは、そのアドレスが、システムコールを実行したユーザープロセスのアドレス空間内のアドレスだからです。D で、このアドレスに演算子 * または [] を適用すると、カーネルアドレス空間がアクセスされ、アドレスが無効であるというエラーメッセージが表示されます。または、このアドレスが有効なカーネルアドレスとたまたま同じだった場合、D プログラムに予想外のデータが返されます。

DTrace プローブからユーザープロセスメモリーにアクセスするには、第 10 章アクションとサブルーチンに記載されている copyin()copyinstr()copyinto() のうちいずれかの関数を、ユーザーアドレス空間ポインタに適用する必要があります。D プログラムの作成時には、混乱を防ぐため、ユーザーアドレスを適切に格納する変数を指定し、コメントを付けてください。ユーザーアドレスを間接参照するような D コードを誤ってコンパイルすることがないように、ユーザーアドレスを uintptr_t として格納することもできます。ユーザープロセスで DTrace を使用するテクニックについては、第 33 章ユーザープロセスのトレースを参照してください。