您的位置:首页 > 其它

模块API之register_module_notifier

2017-11-14 08:59 1871 查看
int register_module_notifier(struct notifier_block *nb)

函数用于注册需要知道当前模块的状态,然后触发一个回调函数

使用的例子如下:

static __init int jump_label_init_module(void)

{
return register_module_notifier(&jump_label_module_nb);

}

注册的回调函数如下:

static struct notifier_block jump_label_module_nb = {
.notifier_call = jump_label_module_notify,
.priority = 1, /* higher than tracepoints */

};

其源码分享如下:

int register_module_notifier(struct notifier_block *nb)

{
return blocking_notifier_chain_register(&module_notify_list, nb);

}

可见就是注册了一个通用的通知链,那在什么时候触发这个通知链呢?

这个通知链定义如下:

static BLOCKING_NOTIFIER_HEAD(module_notify_list);

会出删除模块的时候调用,通知链的参数是MODULE_STATE_GOING

SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
unsigned int, flags)

{

blocking_notifier_call_chain(&module_notify_list,
     MODULE_STATE_GOING, mod);

}

会在模块初始化的时候调用通知链,参数是MODULE_STATE_LIVE

static noinline int do_init_module(struct module *mod)

{
/* Now it's a first class citizen! */
mod->state = MODULE_STATE_LIVE;
blocking_notifier_call_chain(&module_notify_list,
     MODULE_STATE_LIVE, mod);

}

总而言之,针对模块的每个状态

enum module_state {
MODULE_STATE_LIVE,
/* Normal state. */
MODULE_STATE_COMING,
/* Full formed, running module_init. */
MODULE_STATE_GOING,
/* Going away. */
MODULE_STATE_UNFORMED,
/* Still setting it up. */

};

都会发出一次通知链
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: