要移除使用中的 kernel module 應該要設法避免有其他程式正在使用他,因為這將會導致存取不到內容而出錯、或者引用到錯誤的 module 上。
之前採用 cleanup_module 的方式來處理移除 module 的動作,但 cheanup_module 函數沒有傳回值,所以無法判斷有多少 process 正在使用這個 module。這點可以去 /proc/modules 中檢查,其中的第 3 個數值就是代表有多少 process 在使用這個 module 的一個計數器,而當計數器值為 0 時,才能夠執行移除 module。而在 linux/midule.h 中定義了兩個函數可以用來增減這個計數器:
try_module_get(THIS_MODULE) /** 增加計數器值 **/
module_put(THIS_MODULE) /**減少計數器值 **/
要在 kernel 中反註冊 (unregister) driver 的做法是在 cleanup_module 中呼叫 unregister 函數,例如:
unregister_chrdev(Major, DEVICE_NAME);