Solaris 動的トレースガイド

ポインタとアドレス

Solaris オペレーティングシステムでは、「仮想メモリー」により、ユーザープロセスごとに、システム上のメモリーリソースについて固有の仮想表示が提供されます。メモリーリソースの仮想表示を「アドレス空間」と呼びます。アドレス空間は、アドレス範囲 (32 ビットの場合 [0 ... 0xffffffff]、64 ビットの場合 [0 ... 0xffffffffffffffff]) と、翻訳セットを関連付けます。翻訳セットは、オペレーティングシステムやハードウェアが個々の仮想アドレスを対応する物理メモリー配置に変換するために使用されます。D のポインタはデータオブジェクトで、整数型の仮想アドレス値を格納したあと、対応するメモリー配置に格納されているデータの形式を説明する D 型と関連付けます。

D 変数をポインタ型として宣言するには、参照されるデータの型を指定し、型名にポインタ型の宣言であることを示すアスタリスク (*) を付加します。たとえば次のような宣言があるとします。

int *p;

この宣言は、p という名前の D 大域変数が、整数のポインタであることを示しています。この宣言から、p 自体が 32 ビットまたは 64 ビットの整数で、その値はメモリー内にある別の整数のアドレスであることがわかります。D コードは、コンパイル後、オペレーティングシステムカーネル内でプローブ起動時に実行されます。このため、D ポインタは通常、カーネルのアドレス空間に関連付けられています。稼働中のオペレーティングシステムカーネルのポインタのビット数を確認するには、isainfo(1) -b コマンドを実行します。

カーネル内のデータオブジェクトのポインタを作成したい場合は、& 演算子を使って、そのアドレスを計算します。たとえば、オペレーティングシステムカーネルのソースコードに、チューニング可能なパラメータ int kmem_flags が宣言されています。この int のアドレスをトレースするには、D でのオブジェクト名に & 演算子を付加した結果をトレースします。

trace(&`kmem_flags);

* 演算子は、ポインタによってアドレス指定されたオブジェクトを参照するときに使用します。この演算子は、& 演算子と正反対の機能を持っています。たとえば、次の 2 つの D コードの抜粋は、意味的に同じです。

p = &`kmem_flags;				trace(`kmem_flags);
trace(*p);

左側の抜粋コードでは、D 大域変数ポインタ p が作成されています。kmem_flagsint 型のオブジェクトなので、&`kmem_flags の結果の型は int * (int へのポインタ) になります。左側の抜粋コードでは、ポインタをデータオブジェクト kmem_flags に移してから、*p の値をトレースしています。したがって、この抜粋コードは、データオブジェクトの名前を指定して直接その値をトレースする右側の抜粋コードと同じになります。