程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> try_module_get和module_put

try_module_get和module_put

編輯:C++入門知識

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裡面就可以解決了!  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved