[轉帖] 2.6版kernel中沒有MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT的macro

2.4內核中,模塊自身通過MOD_INC_USE_COUNT, MOD_DEC_USE_COUNT宏來管理自己被使用的計數。
2.6 內核提供了更健壯、靈活的模塊計數管理接口try_module_get(&module), module_put(&module)取代2.4中的模塊使用計數管理宏;模塊的使用計數不必由自身管理,而且在管理模塊使用計數時考慮到 SMP與PREEMPT機制的影響。
 
int try_module_get(struct module *module);用於增加模塊使用計數;若返回為0,表示調用失敗,希望使用的模塊沒有被加載或正在被卸載中。
void module_put(struct module *module);減少模塊使用計數。
 
try_module_get與module_put的引入與使用與2.6內核下的設備模型密切相關。模塊是用來管理硬件設備的,2.6內核為不同類型的設備定義了struct module *owner域,用來指向管理此設備的模塊。如字符設備的定義:
struct cdev
{
 struct kobject kobj;
 struct module *owner;
 struct file_operations *ops;
 struct list_head list;
 dev_t dev;
 unsigned int count;
};
 
從設備使用的角度出發,當需要打開、開始使用某個設備時,使用try_module_get(dev->owner)去增加管理此設備的 owner模塊的使用計數;當關閉、不再使用此設備時,使用module_put (dev->owner)減少對管理此設備的owner模塊的使用計數。這樣,當設備在使用時,管理此設備的模塊就不能被卸載;只有設備不再使用時 模塊才能被卸載。
2.6內核下,對於為具體設備寫驅動的開發人員而言,基本無需使用try_module_get與module_put,因為此時開發人員所寫 的驅動通常為支持某具體設備的owner模塊,對此設備owner模塊的計數管理由內核裡更底層的代碼如總線驅動或是此類設備共用的核心模塊來實現,從而 簡化了設備驅動開發。
 
本文轉自:
作者: Neil Chiao

0 意見:

張貼留言

 
Copyright 2009 Linux學習誌
BloggerTheme by BloggerThemes | Design by 9thsphere