try_module_get 注解: 1>位置:/linux/kernel/module.c 2>聲明:static inline int try_module_get(structmodule *module) 3>功能:判斷module模塊是否處於活動狀態,然後通過local_inc()宏將該模塊的引用計數加1 4>返回值: linux-2.6中返回值是一個整數,如果該模塊處於活動狀態且對它引用計數加1操作正確則返回1,否則返回0 linux-3.7.5中返回值是一個bool量,正確返回true,錯誤返回false! 實現方式Linux-2.6 [cpp] static inline int try_module_get(struct module *module) { int ret = 1; if (module) { unsigned int cpu = get_cpu(); if (likely(module_is_live(module))) { local_inc(__module_ref_addr(module, cpu)); trace_module_get(module, _THIS_IP_, local_read(__module_ref_addr(module, cpu))); } else ret = 0; put_cpu(); } return ret; } 實現方式Linux-3.7.5中 [cpp] bool try_module_get(struct module *module) { bool ret = true; if (module) { preempt_disable(); if (likely(module_is_live(module))) { __this_cpu_inc(module->refptr->incs); trace_module_get(module, _RET_IP_); } else ret = false; preempt_enable(); } return ret; } EXPORT_SYMBOL(try_module_get); module_put 注解: 1>聲明: Linux-3.7.5中void module_put(struct module *module) Linux-2.6中static inline void module_put(struct module *module) 2>功能:使指定的模塊使用量減一 實現方式Linux-2.6中,是空的 我很不解,求高手解釋! [cpp] static inline void module_put(struct module *module) ///不解!! { } Linux-3.7.5中 [cpp] void module_put(struct module *module) { if (module) { preempt_disable(); smp_wmb(); /* see comment in module_refcount */ __this_cpu_inc(module->refptr->decs); trace_module_put(module, _RET_IP_); /* Maybe they're waiting for us to drop reference? */ if (unlikely(!module_is_live(module))) wake_up_process(module->waiter); preempt_enable(); } } EXPORT_SYMBOL(module_put); 這兩個函數的使用實例,hello模塊init函數 [cpp] /*模塊初始化函數*/ static int __init hello_init(void) { printk("<0>module_refcount(module):%d\n",module_refcount(THIS_MODULE)); try_module_get(THIS_MODULE); printk("<0>module_refcount(module):%d\n",module_refcount(THIS_MODULE)); module_put(THIS_MODULE); printk("<0>module_refcount(module):%d\n",module_refcount(THIS_MODULE)); return 0; } 打印的結果 [cpp] [root@root hello模塊]# Message from syslogd@localhost at Feb 2 09:07:45 ... kernel:module_refcount(module):1 Message from syslogd@localhost at Feb 2 09:07:45 ... kernel:module_refcount(module):2 Message from syslogd@localhost at Feb 2 09:07:45 ... kernel:module_refcount(module):1 由上面的程序可以看出來在模塊加載的過程中,模塊的使用量就是1了,然後用try_module_get把使用量變為2,再使用module_put把使用量變為1,加載完成後使用量為0 開始寫程序的時候把module_put寫在了__eixt中,導致加載了模塊使用量一直為1,無法卸載只能重啟!後來才知道rmmod是在調用module_exit之前檢查模塊的引用計數的,所以在exit之前就應該要module_put釋放引用計數,這樣一來把module_put寫在init裡面就可以解決了!