DELETE_MODULE
Section: Linux Programmer's Manual (2)
Updated: 2017-09-15
Index
JM Home Page
roff page
名前
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_disabled を参照)。
- EWOULDBLOCK
-
他のモジュールがこのモジュールに依存している。または、 flags に O_NONBLOCK が指定されたが、
このモジュールの参照カウントが 0 以外で flags に O_TRUNC が指定されていなかった。
準拠
delete_module() は Linux 固有である。
注意
delete_module() システムコールは glibc ではサポートされていない。 glibc ヘッダーでは宣言は提供されていないが、
紆余曲折があり、 バージョン 2.23 より前の glibc ではこのシステムコールに対する ABI が公開されていた。
そのため、このシステムコールを利用するには、 (glibc 2.23 より前では) 自分のコードの中で手動でインターフェースを宣言すればよかった。
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() の動作のより詳細な違いは、 現在のところこのマニュアルページでは説明しない。
関連項目
create_module(2), init_module(2), query_module(2), lsmod(8),
modprobe(8), rmmod(8)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/ に書かれている。
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- 注意
-
- Linux 2.4 以前
-
- 関連項目
-
- この文書について
-
This document was created by
man2html,
using the manual pages.
Time: 16:46:41 GMT, November 24, 2023