.\" Copyright (C) 2012 Michael Kerrisk .\" A few fragments remain from a version .\" Copyright (C) 1996 Free Software Foundation, Inc. .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .\" .\" Japanese Version Copyright (c) 2006 Akihiro MOTOKI all rights reserved. .\" Translated 2006-07-29, Akihiro MOTOKI .\" .TH INIT_MODULE 2 2014\-05\-10 Linux "Linux Programmer's Manual" .SH 名前 init_module, finit_module \- カーネルモジュールをロードする .SH 書式 .nf \fBint init_module(void *\fP\fImodule_image\fP\fB, unsigned long \fP\fIlen\fP\fB,\fP \fB const char *\fP\fIparam_values\fP\fB);\fP \fBint finit_module(int \fP\fIfd\fP\fB, const char *\fP\fIparam_values\fP\fB,\fP \fB int \fP\fIflags\fP\fB);\fP .fi \fI注意\fP: glibc では、 ヘッダーファイルでの \fBinit_module\fP() の宣言はなく、 \fBfinit_module\fP() のラッパー関数も提供されていない。 「注意」の節を参照。 .SH 説明 \fBinit_module\fP() は ELF イメージをカーネル空間にロードし、 必要なシンボルの配置変更を行い、 モジュールパラメーターを呼び出し元から指定された値に初期化し、 最後にそのモジュールの \fIinit\fP 関数を実行する。 このシステムコールには特権が必要である。 \fImodule_image\fP 引き数はロードするバイナリーイメージが入ったバッファーを指し、 \fIlen\fP はバッファーのサイズを指定する。 モジュールイメージは、 実行中のカーネル用に作成された有効な ELF イメージである必要がある。 \fIparam_values\fP 引き数はモジュールパラメーター値を指定するスペース区切りの文字列である (モジュールパラメーターは \fBmodule_param\fP() や \fBmodule_param_array\fP() を使ってモジュール内で定義される)。 カーネルはこの文字列を解釈し、指定されたパラメーターを初期化する。 各パラメーター指定は以下の形式である。 \fIname\fP[\fB=\fP\fIvalue\fP[\fB,\fP\fIvalue\fP...]] パラメーター \fIname\fP はモジュール内で \fImodule_param\fP() を使って定義されているパラメーターのいずれか一つである (Linux カーネルのソースファイル \fIinclude/linux/moduleparam.h\fP を参照)。 パラメーター \fIvalue\fP は \fIbool\fP か \fIinvbool\fP パラメーターの場合は省略可能である。 配列パラメーターの値はカンマ区切りのリストで指定される。 .SS finit_module() .\" commit 34e1169d996ab148490c01b65b4ee371cf8ffba2 .\" https://lwn.net/Articles/519010/ \fBfinit_module\fP() システムコールは \fBinit_module\fP() と同様だが、 ファイルディスクリプター \fIfd\fP からモジュールをロードする。 カーネルモジュールの信頼性をファイルシステムにおける場所から判定できる場合、この方法は有効である。 この方法が利用できる場合、 モジュールの信頼性を判定するのに暗号で署名されたモジュールを使用することによるオーバーヘッドを避ける事ができる。 \fIparam_values\fP 引き数は \fBinit_module\fP() と同じである。 .\" commit 2f3238aebedb243804f58d62d57244edec4149b2 \fIflags\fP 引き数で \fBfinit_module\fP() の動作を変更できる。 \fIflags\fP は以下のフラグの 0 個以上の論理和をとって作成したビットマスクである。 .TP \fBMODULE_INIT_IGNORE_MODVERSIONS\fP シンボルのバージョンハッシュを無視する。 .TP \fBMODULE_INIT_IGNORE_VERMAGIC\fP カーネルのバージョン magic を無視する。 .PP .\" http://www.tldp.org/HOWTO/Module-HOWTO/basekerncompat.html .\" is dated, but informative そのモジュールがロードされるカーネルに合致することを保証するためのモジュールに組み込みの安全チェックがある。 これらのチェックは、 モジュールの作成時に記録され、 モジュールのロード時に検査される。 最初に、 モジュールはカーネルのバージョン番号と主要な機能 (CPU 種別など) が入った "vermagic" 文字列を記録する。 次に、 モジュールが \fBCONFIG_MODVERSIONS\fP 設定オプションを有効にして作成されている場合、 バージョンハッシュがモジュールが使用するシンボルごとに記録される。 このハッシュはシンボルに対応する関数の引き数と返り値の型を基づいて計算される。 この場合、 シンボルのバージョンハッシュは十分に信頼できると考えられているため、 "vermagic" 文字列内のカーネルのバージョン番号は無視される。 \fBMODULE_INIT_IGNORE_VERMAGIC\fP フラグは "vermagic" 文字列を無視することを意味し、 \fBMODULE_INIT_IGNORE_MODVERSIONS\fP フラグはシンボルのバージョンハッシュを無視することを意味する。 カーネルが強制ロードを許可するように作成されている場合 (\fBCONFIG_MODULE_FORCE_LOAD\fP が有効になっている場合)、 モジュールのロードは継続され、 そうでない場合は不正なモジュールに対して返るのと同じ \fBENOEXEC\fP で失敗する。 .SH 返り値 成功の場合、これらのシステムコールは 0 を返す。エラーの場合 \-1 が返され、 \fIerrno\fP に適切な値が設定される。 .SH エラー .TP \fBEBADMSG\fP (Linux 3.7 以降) モジュールの署名が正しい形式ではない。 .TP \fBEBUSY\fP このモジュールがシンボル参照を解決する際にタイムアウトが起こった。 .TP \fBEFAULT\fP アドレス引き数が、プロセスがアクセスできるアドレス空間外の場所を参照していた。 .TP \fBENOKEY\fP (Linux 3.7 以降) .\" commit 48ba2462ace6072741fd8d0058207d630ce93bf1 .\" commit 1d0059f3a468825b5fc5405c636a2f6e02707ffa .\" commit 106a4ee258d14818467829bf0e12aeae14c16cd7 モジュールの署名が無効であるか、 カーネルがこのモジュール用の鍵を持っていない。 このエラーが返されるのは、 カーネルが \fBCONFIG_MODULE_SIG_FORCE\fP で作成されている場合のみである。 カーネルでこのオプションが有効になっていない場合、 無効なモジュールや署名されていないモジュールはカーネルのゴミになる。 .TP \fBENOMEM\fP メモリ不足。 .TP \fBEPERM\fP 呼び出し元が特権 (\fBCAP_SYS_MODULE\fP ケーパビリティ) を持っていなかった。もしくはモジュールのロードが無効になっている (\fBproc\fP(5) の \fI/proc/sys/kernel/modules_disabled\fP を参照)。 .PP \fBinit_module\fP() では以下のエラーも発生する場合がある。 .TP \fBEEXIST\fP その名前のモジュールがすでにロードされている。 .TP \fBEINVAL\fP .\" .TP .\" .BR EINVAL " (Linux 2.4 and earlier)" .\" Some .\" .I image .\" slot is filled in incorrectly, .\" .I image\->name .\" does not correspond to the original module name, some .\" .I image\->deps .\" entry does not correspond to a loaded module, .\" or some other similar inconsistency. \fIparam_values\fP が無効、 または \fImodule_image\fP の ELF イメージの一部分に矛盾がある。 .TP \fBENOEXEC\fP \fImodule_image\fP で指定されたバイナリーイメージが ELF イメージではない、 もしくは無効な ELF イメージや別のアーキテクチャー用の ELF イメージである。 .PP \fBfinit_module\fP() では以下のエラーも発生する場合がある。 .TP \fBEBADF\fP \fIfd\fP が参照するファイルが読み出し用にオープンされていない。 .TP \fBEFBIG\fP \fIfd\fP が参照するファイルが大きすぎる。 .TP \fBEINVAL\fP \fIflags\fP が無効である。 .TP \fBENOEXEC\fP \fIfd\fP がオープンされたファイルを参照していない。 .PP 上記のエラーに加え、 モジュールの \fIinit\fP 関数が実行されてエラーが発生した場合には、 \fBinit_module\fP() や \fBfinit_module\fP() は失敗し、 \fIerrno\fP に \fIinit\fP 関数が返した値が設定される。 .SH バージョン \fBfinit_module\fP() は Linux 3.8 以降で利用可能である。 .SH 準拠 \fBinit_module\fP() と \fBfinit_module\fP() は Linux 固有である。 .SH 注意 \fBinit_module\fP() システムコールは glibc ではサポートされていない。 glibc ヘッダーでは宣言は提供されていないが、 歴史の紆余曲折を経て glibc はこのシステムコールに対する ABI を公開していない。 したがって、このシステムコールを利用するには、自分のコードの中で手動でインターフェースを宣言すればよい。 \fBsyscall\fP(2) を使ってシステムコールを起動できる。 glibc は \fBfinit_module\fP() に対するラッパー関数を提供していない。 \fBsyscall\fP(2) を使って呼び出すこと。 現在ロードされているモジュールに関する情報は \fI/proc/modules\fP および \fI/sys/module\fP 以下のモジュール単位のサブディレクトリ内のファイルツリーで参照できる。 Linux カーネルのソースファイル \fIinclude/linux/module.h\fP には背景に関する有用な情報がある。 .SS "Linux 2.4 以前" .PP Linux 2.4 以前では \fBinit_module\fP() システムコールはかなり違ったものであった。 \fB#include \fP \fB int init_module(const char *\fP\fIname\fP\fB, struct module *\fP\fIimage\fP\fB);\fP (ユーザー空間アプリケーションは \fBquery_module\fP() を呼び出してどのバージョンの \fBinit_module\fP() が利用可能かを検出できる。 \fBquery_module\fP() の呼び出しは Linux 2.6 以降ではエラー \fBENOSYS\fP で失敗する。) 古いバージョンのシステムコールは、 \fIimage\fP が指す再配置されたモジュールイメージをカーネル空間にロードし、 モジュールの \fIinit\fP 関数を実行する。 呼び出し元には再配置されたイメージを提供する責任がある (Linux 2.6 以降では \fBinit_module\fP() システムコールが再配置自体を行う)。 .PP モジュールイメージは先頭部分に module 構造体があり、その後ろに 適切なコードとデータが続く。 Linux 2.2 以降では module 構造体は以下のように定義されている。 .PP .in +4n .nf struct module { unsigned long size_of_struct; struct module *next; const char *name; unsigned long size; long usecount; unsigned long flags; unsigned int nsyms; unsigned int ndeps; struct module_symbol *syms; struct module_ref *deps; struct module_ref *refs; int (*init)(void); void (*cleanup)(void); const struct exception_table_entry *ex_table_start; const struct exception_table_entry *ex_table_end; #ifdef __alpha__ unsigned long gp; #endif }; .fi .in .PP \fInext\fP と \fIrefs\fP 以外の全てのポインター要素はモジュール本体内部を指し、 カーネル空間での適切な値で初期化される (つまり、モジュールの残りの 部分で再配置される) ことが期待される。 .SH 関連項目 \fBcreate_module\fP(2), \fBdelete_module\fP(2), \fBquery_module\fP(2), \fBlsmod\fP(8), \fBmodprobe\fP(8) .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man\-pages/ に書かれている。