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 以前では、
このシステムコールの引数は
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/
に書かれている。