プラットフォームドライバーに基づく1つのLinuxカーネルモジュールがあります。そこにメソッド
を実装probe()
しremove()
ました。
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
}
これで、ユーザーが実行するとrmmod <myModule>
、remove()
メソッドが呼び出されます。ここで私はいくつかの条件チェックを実行し、ユーザーがrmmod
ここで実行してはならないことを知った ここでは、クリーンアップを実行して、このrmmodを失敗させたくありません。
私は戻ってきた、-1
またはそれを試み-EBUSY
ましたremove()
が、それでもrmmod <myModule>
アンロードされ、lsmod
の出力には表示されません。
remove()
メソッドでのモジュールのアンロードを停止する方法はありますか?
すでに(または他の手段によって)開始されたモジュールのアンロードをキャンセル(または停止)することはできませんrmmod
。しかし、それを呼び出すことでモジュールのアンロードを防ぐことが可能ですtry_module_get
:
// Before your module enters into the state, when its unloading is not desirable.
// Prevent unloading of the module
if(!try_module_get(THIS_MODULE)) {
<failed to prevent module unloading>
}
<....> // This code will be protected from the module's unloading
// Allow the module to be unloaded again
module_put(THIS_MODULE);
への(成功した)呼び出しtry_module_get
が有効な間、rmmod
モジュールのコードを実行せずに、モジュールのアンロードを即座に拒否します。
関数try_module_get
からのmodule_init
呼び出しが成功するかどうかはわかりませんが、関数からmodule_exit
呼び出すと間違いなく失敗します。しかし、他のすべての場所では、この呼び出しは成功するはずです。
module_put
呼び出しについては、を呼び出すのと同じ関数から実行する必要はありませんtry_module_get
。まったく呼び出さなくてもかまいmodule_put
ませんが、可能であればこれは避けてください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加