Solaris 動的トレースガイド

外部変数

D では、オペレーティングシステムには定義されているが D プログラムには定義されていない変数にアクセスする際、特殊なスコープ演算子として、逆引用符 (`) を使用します。たとえば、Solaris カーネルには、メモリーアロケータのデバッグ機能を有効にする、チューニング可能なシステム変数 kmem_flags の C 宣言が含まれています。kmem_flags の詳細は、『Solaris カーネルのチューンアップ・リファレンスマニュアル』を参照してください。このチューニング可能な変数は、次のように、カーネルソースコード内に C 変数として宣言されています。

int kmem_flags;

D プログラム内でこの変数の値にアクセスするには、次のような D 表記法を使用します。

`kmem_flags

DTrace では、各カーネルシンボルと、対応するオペレーティングシステムの C コード内のシンボルの型が関連付けられます。このため、ソースからネイティブのオペレーティングシステムデータ構造に簡単にアクセスできます。オペレーティングシステムの外部変数を使用するには、対応するオペレーティングシステムのソースコードにアクセスする必要があります。

D プログラムから外部変数へのアクセスは、別のプログラム (オペレーティングシステムカーネルやそのデバイスドライバなど) の内部実装の詳細へのアクセスを意味します。このように、実装の詳細にアクセスする場合、信頼性の高い安定したインタフェースは提供されません。こうした詳細に依存する D プログラムは、ソフトウェアの該当部分をアップグレードすると、動作しなくなる可能性があります。このため、外部変数は、通常、カーネルおよびデバイスドライバの開発者やサービス担当者が、DTrace を使ってパフォーマンスや機能上の問題のデバッグを行うときに使用されます。D プログラムの安定性の詳細は、第 39 章安定性を参照してください。

カーネルシンボル名は、D の変数や関数の識別子とは別の名前空間に格納されます。したがって、カーネルシンボル名と D 変数名の競合が発生することはありません。変数の直前に逆引用符を付けると、D コンパイラは、一致する変数定義を見つけるため、ロードされたモジュールのリストの順番に従って、既知のカーネルシンボルを検索します。Solaris カーネルは、動的にロードされたモジュールごとに独立したシンボル用名前空間を提供します。このため、有効なオペレーティングシステムカーネル内で同じ変数名を繰り返し使用できます。名前の競合を防ぐには、シンボル名の逆引用符より先に、アクセスされる必要のある変数を持つカーネルモジュール名を指定します。たとえば、ロード可能なカーネルモジュールは、通常、_fini(9E) 関数を提供します。したがって、foo という名前のカーネルモジュールが提供する _fini 関数のアドレスを参照するには、次のように記述します。

foo`_fini

外部変数には、オペランドの型の通常規則に従って、値を変更するものは除く、任意の D 演算子を適用できます。DTrace を起動すると、D コンパイラにより、アクティブなカーネルモジュールに対応する変数名のセットがロードされます。このため、これらの変数の宣言は不要です。外部変数には、値を変更するような演算子 (=+= など) を適用してはいけません。DTrace では、安全性の面から、監視対象のソフトウェアの状態を改変することは禁じられています。