DELETE_MODULE(2) Linux Programmer's Manual DELETE_MODULE(2)
名
delete_module - カーネルモジュールをアンロードする
書
int delete_module(const char *name, int flags);
注意: この関数の宣言は glibc のヘッダーでは提供されていない。「注意」を参照。
説
delete_module() システムコールは、 name
で特定される未使用のロード可能なモジュールのエントリーを削除しようとする。 モジュールに
exit 関数がある場合、 モジュールをアンロードする前にこの関数が実行される。 flags
引き数は、以下で説明するようにシステムコールの動作を変更するのに使用される。
このシステムコールには特権が必要である。
モジュールの削除は以下のルールにしたがって行われる。
1. このモジュールに依存している (このモジュールで定義されているシンボルを参照している)
モジュールがロードされている場合、 この呼び出しは失敗する。
2. それ以外の場合で、 モジュールの参照カウント
(このモジュールを現在使用しているプロセス数) が 0 であれば、
モジュールは直ちにアンロードされる。
3. モジュールの参照カウントが 0 でない場合、 その動作は flags
にセットされたビットによって決まる。 通常の使用時は (「注意」参照)、 O_NONBLOCK
は常に指定され、 O_TRUNC フラグが追加で指定されることがある。
flags の組み合わせが持つ効果は以下のとおりである。
flags == O_NONBLOCK
エラーの場合、 呼び出しは直ちに返る。
flags == (O_NONBLOCK | O_TRUNC)
参照カウントが 0 以外かどうかに関わらず、 直ちにモジュールをアンロードする。
(flags & O_NONBLOCK) == 0
flags に O_NONBLOCK が指定されなかった場合、 以下のステップで処理が行われる。
* 新しい参照を許可しないように、 指定されたモジュールにマークを付ける。
* モジュールの参照カウントが 0 でない場合、 参照カウントが 0 になるまで、
呼び出し元は割り込み不可のスリープ状態 (TASK_UNINTERRUPTIBLE) に置かれる。
参照カウントが 0 になった時点で、 呼び出し元の停止が解除される。
* モジュールは通常通りの方法でアンロードされる。
O_TRUNC フラグには上記のルールに加えてもう一つの効果がある。 デフォルトでは、 モジュールに
init 関数があるが exit 関数がない場合、 そのモジュールを削除しようとすると失敗する。
しかし、 O_TRUNC が指定された場合、 この要件はスキップされる。
O_TRUNC フラグの使用は危険である! カーネルが CONFIG_MODULE_FORCE_UNLOAD
で作成されていない場合、 このフラグは黙って無視される (通常は CONFIG_MODULE_FORCE_UNLOAD
は有効になっている)。 このフラグを使うとカーネルにゴミが残ることになる
(TAINT_FORCED_RMMOD)。
返
成功の場合 0 が返される。エラーの場合 -1 が返され、 errno に適切な値が設定される。
エ
EBUSY モジュールは"live" ではない (モジュールがまだ初期化中か、
すでに削除のマークが付けられている)。 モジュールに init 関数があるが exit
関数がなく、 flags に O_TRUNC が指定されていなかった。
EFAULT name がプロセスがアクセスできるアドレス空間外の場所を参照している。
ENOENT その名前のモジュールが存在しない。
EPERM 呼び出し元が特権 (CAP_SYS_MODULE ケーパビリティ) を持っていなかった。 または、
モジュールのアンロードが無効になっている (proc(5) の /proc/sys/kernel/modules_dis‐
abled を参照)。
EWOULDBLOCK
他のモジュールがこのモジュールに依存している。または、 flags に O_NONBLOCK
が指定されたが、 このモジュールの参照カウントが 0 以外で flags に O_TRUNC
が指定されていなかった。
準
delete_module() は Linux 固有である。
注
delete_module() システムコールは glibc ではサポートされていない。 glibc
ヘッダーでは宣言は提供されていないが、 歴史の紆余曲折を経て glibc
はこのシステムコールに対する ABI を公開していない。
したがって、このシステムコールを利用するには、自分のコードの中で手動でインターフェースを宣言すればよい。
syscall(2) を使ってシステムコールを起動できる。
flags に O_NONBLOCK
が指定されていない場合に起こる可能性がある割り込み不可のスリープは望ましくないと考えられている。
なぜなら、 スリープしているプロセスは kill できない状態 (unkillable state)
のままになるからである。 Linux 3.7 時点では、 O_NONBLOCK の指定は省略可能だが、
将来のカーネルでは必須になるだろう。
Linux 2.4 以
Linux 2.4 以前では、 このシステムコールの引き数は 1 つだけであった。
int delete_module(const char *name);
name が NULL の場合、 auto-clean のマークがついたすべての未使用のモジュールが削除される。
Linux 2.4 以前の delete_module() の動作のより詳細な違いは、
現在のところこのマニュアルページでは説明しない。
こ
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部
である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/
に書かれている。
Linux 2014-05-10 DELETE_MODULE(2)