query_module -
モジュールに関連する各種の情報をカーネルに問い合わせる
#include <linux/module.h>
int query_module(const char *name, int which, void *buf,
size_t bufsize, size_t *ret);
注意:
このシステムコールの宣言は
glibc
のヘッダーでは提供されていない。「注意」を参照。
注意:
このシステムコールが存在するのは、カーネル
2.6 より前の Linux
だけである。
query_module()
は、ローダーブルモジュールに関する情報をカーネルに問い合わせる。
情報は
buf
が指し示すバッファーに格納されて返される。
呼び出し元は
buf
のサイズを
bufsize
に指定しなければならない。
得られる情報の正確な意味とフォーマットは、
which
でどの操作を指定するかによって異なる。
現在ロードされているモジュールを特定するために
name
を必要とする操作があれば、
カーネル固有であることを示す
NULL
を指定できる操作もある。
which
には以下の値を指定できる:
- 0
- カーネルが
query_module()
をサポートしている場合、成功を返す。
このシステムコールが利用可能かを調べるために使われる。
- QM_MODULES
- ロードされている全てのモジュールの名前を返す。
バッファーには、ヌル終端された文字列が順に入る。
返されるバッファー
ret
にはモジュールの数が設定される。
- QM_DEPS
- 指定されたモジュールが使用している全モジュールの名前を返す。
バッファーには、ヌル終端された文字列が順に入る。
返されるバッファー
ret
にはモジュールの数が設定される。
- QM_REFS
- 指定されたモジュールを使用している全モジュールの名前を返す。
これは QM_DEPS
と逆の機能である。
バッファーには、ヌル終端された文字列が順に入る。
返されるバッファー
ret
にはモジュールの数が設定される。
- QM_SYMBOLS
- カーネルまたは指定されたモジュールがエクスポートしているシンボルと
値を返す。
バッファーのデータは、
以下の構造体の配列にヌル終端された文字列が続く形となる。
-
struct module_symbol {
unsigned long value;
unsigned long name;
};
-
name の値は、 buf
の先頭からの文字列までのオフセット文字数である。
ret
にはシンボルの数が設定される。
- QM_INFO
- 指定されたモジュールに関する様々な情報を返す。
出力バッファーのフォーマットは以下の形式となる:
-
struct module_info {
unsigned long address;
unsigned long size;
unsigned long flags;
};
-
address
はそのモジュールが配置されているカーネル空間上のアドレス、
size
はそのモジュールのバイト単位のサイズ、
flags は MOD_RUNNING, MOD_AUTOCLEAN
等のマスクであり、そのモジュールの現在の状態を示す
(Linux
カーネルのソースファイル
include/linux/module.h を参照)。 ret
には module_info
構造体のサイズが設定される。
成功の場合 0
が返される。エラーの場合
-1 が返され、
errno
に適切な値が設定される。
- EFAULT
-
name, buf, ret
の少なくとも一つが、プログラムがアクセスできる
アドレス空間の外部であった。
- EINVAL
-
which
が不正である。あるいは
name が NULL だが (NULL は
"カーネル"
を示す)、 which
で指定された値との組み合わせは許可されていない。
- ENOENT
-
name
という名前のモジュールが存在しない。
- ENOSPC
- 与えられたバッファーの大きさが小さすぎる。
ret
には最小限必要なバッファーのサイズが設定される。
- ENOSYS
-
query_module()
はこのバージョンのカーネルではサポートされていない
(例えば、カーネルのバージョンが
2.6 以降)。
このシステムコールが存在するのはカーネル
2.4 までの Linux
だけである。 Linux 2.6
では削除された。
query_module() は Linux
固有である。
以前
query_module()
で得られた情報のいくつかは、
/proc/modules,
/proc/kallsyms および
/sys/module
ディレクトリ内のファイルから取得できる。
query_module()
システムコールは glibc
ではサポートされていない。
glibc
ヘッダーでは宣言は提供されていないが、
歴史の紆余曲折を経て
glibc
はこのシステムコールに対する
ABI を公開していない。
したがって、このシステムコールを利用するには、自分のコードの中で手動でインターフェースを宣言すればよい。
syscall(2)
を使ってシステムコールを起動できる。
create_module(2),
delete_module(2),
get_kernel_syms(2),
init_module(2),
lsmod(8),
modinfo(8)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。