Chinaunix首页 | 论坛 | 博客
  • 博客访问: 520224
  • 博文数量: 174
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 1827
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-15 14:12
文章分类

全部博文(174)

文章存档

2018年(1)

2017年(1)

2013年(3)

2012年(9)

2010年(12)

2009年(5)

2008年(106)

2007年(37)

我的朋友

分类: LINUX

2008-07-29 10:44:14

module相关

一. THIS_MODULE
    宏THIS_MODULE定义在 include/linux/module.h中,如下所示:

    *** include/linux/module.h:
        #ifdef MODULE
    #define MODULE_GENERIC_TABLE(gtype,name)                        \
    extern const struct gtype##_id __mod_##gtype##_table            \
      __attribute__ ((unused, alias(__stringify(name))))

    extern struct module __this_module;
    #define THIS_MODULE (&__this_module)
    #else  /* !MODULE */
    #define MODULE_GENERIC_TABLE(gtype,name)
    #define THIS_MODULE ((struct module *)0)
    #endif
    
    由此可见,.owner=THIS_MODULE 实际上是给owner赋上一个值,这个值可能为一个空指针,也可能是一个指向module结构的指针。
   
  上面提到的__this_module则位于在编译模块过程中生成的中间文件*.mod.c中,例如下面就是这样一个文件的代码片断:
  
   #include
   #include

   MODULE_INFO(vermagic,VERMAGIC_STRING);

   struct module __this__module
   __attribute__((section(".gnu.linkonce.this_module"))) = {
    .name = KBUILD_MODNAME,
    .init = init_module,
    #ifdef CONFIG_MODULE_UNLOAD
    .exit = cleanup_module,
    #endif
    };
    ...
    .....

二. __module_get()与try_module_get()
  
*** include/linux/module.h:
//如果模块已经插入内核,则递增该模块引用计数   
static inline void __module_get(struct module *module)
{
    if (module) {
        BUG_ON(module_refcount(module) == 0);
        local_inc(&module->ref[get_cpu()].count);
        put_cpu();
    }
}
//如果模块已经插入内核,则递增该模块引用计数;如果该模块还没有插入内核,则返回0表示出错。
static inline int try_module_get(struct module *module)
{
    int ret = 1;

    if (module) {
        // get_cpu() 获得当前CPU,并禁止内核抢占
        unsigned int cpu = get_cpu();
        if (likely(module_is_live(module)))
            local_inc(&module->ref[cpu].count);
        else
            ret = 0;
        // put_cpu() 激活内核抢占
        put_cpu();
    }
    return ret;
}

static inline int module_is_live(struct module *mod)
{
    return mod->state != MODULE_STATE_GOING;
}

enum module_state
{
    MODULE_STATE_LIVE,
    MODULE_STATE_COMING,
    MODULE_STATE_GOING,
};
阅读(770) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~