EN JA
KSYMS(4)
KSYMS(4) FreeBSD Kernel Interfaces Manual KSYMS(4)

名称

ksymsカーネルシンボルテーブルインタフェース

書式

device ksyms

解説

/dev/ksyms キャラクタデバイスは、カーネルシンボルテーブルのスナップショットへの読み込み専用のインタフェースを提供します。カーネル内のシンボルマネージャは、多くのタイプのシンボルテーブルを扱うことができるように設計されていますが、 elf(5) シンボルテーブルのみ、このデバイスによってサポートされています。 ELF 形式イメージは、2 つのセクションを含んでいます: シンボルテーブルと対応する文字列テーブルです。
シンボルテーブル (Symbol Table)
SYMTAB セクションは、ロードされたモジュールのシンボルテーブルエントリも含んで、現在の実行しているカーネルに存在するシンボルテーブルエントリを含んでいます。シンボルは、最初にロードされたモジュールのシンボル等が続いて、最初にカーネルファイルシンボルから始まり、カーネルモジュールのロード時間で順序付けられます。
文字列テーブル (String Table)
STRTAB セクションは、シンボルテーブルエントリ参照であるカーネルとロードされたモジュールのシンボル名文字列を含みます。

/dev/ksyms ファイルから読み込まれた elf 形式のシンボルテーブルデータは、デバイスがオープンされる時点のカーネルの状態を表します。 /dev/ksyms にはテキストまたはデータがないので、そのフィールドの大部分は、NULL に初期化されます。 ksyms ドライバは、 /dev/ksyms ファイルがオープンされている間に、カーネルにモジュールをロードするか、またはアンロードすることを防ぎませんが、古いデータを含むかもしれません。

IOCTL

下記の ioctl(2) コマンドコードは、< sys/ksyms.h>に定義されています。

ioctl(2) への (3 番目) の引数は、タイプ表示へのポインタであるべきです。

KIOCGSIZE (size_t)
現在のシンボルテーブルの合計サイズを返します。カーネルのシンボルテーブルのコピーを作るためにバッファを割り付けるとき、これを使用することができます。
KIOCGADDR (void *)
プロセスメモリでマップされたカーネルのシンボルテーブルのアドレスを返します。

関連ファイル

/dev/ksyms

エラー

/dev/ksymsopen(2) は、次の場合に失敗します:
[ EBUSY]
デバイスが既にオープンされています。再びそれをオープンする前に、プロセスは、 /dev/ksyms をクローズしなければなりません。
[ ENOMEM]
カーネルにリソース不足があります。
[ ENXIO]
ドライバは、カーネルのシンボルテーブルのスナップショットを作成に失敗していました。カーネルが、モジュールをロードするか、またはアンロードするプロセス内にあったなら、これは起こるかもしれません。

歴史

ksyms デバイスは、多くの異なったオペレーティングシステムに存在しています。この実装は、機能的に Solaris と NetBSD の ksyms ドライバと同様です。

ksyms ドライバは、 lockstat(1) をサポートするために FreeBSD 8.0 ではじめて登場しました。

作者

ksyms ドライバは、 Stacey Son <sson@freebsd.org>によって書かれました。

バグ

いつでも動的にファイルをカーネルにリンクできるので、シンボル情報は、変更することができます。 /dev/ksyms ファイルをオープンするとき、利用者は、ちょうどその時にカーネルシンボル情報の状態のスナップショットを表す ELF イメージにアクセスできます。デバイスをオープンしたままにすれば、カーネルモジュールのロードか、またはアンロードをブロックしません。新しいスナップショットを得るために、利用者は、デバイスをクローズして、再オープンしなければなりません。

プロセスは、一度だけ /dev/ksyms ファイルをオープンすることができます。プロセスは、再びそれをオープンする前に、 /dev/ksyms をクローズしなければなりません。

ksyms ドライバは、スナップショットを格納するために呼び出しプロセスのメモリアドレス空間を使用します。シンボルテーブルがカーネルメモリを保存するために格納されるところでメモリアドレスを取得するために ioctl(2) を使用することができます。また、 mmap(2) も使用されますが、それは別のアドレスにそれをマップします。

April 5, 2009 FreeBSD