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,
};
阅读(800) | 评论(0) | 转发(0) |