天天看點

try_module_get和module_put

子產品在被使用時,是不允許被解除安裝的。

   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子產品的計數 管理由核心裡更底層的代碼如總線驅動或是此類裝置共用的核心子產品來實作,進而簡化了裝置驅動開發。