notifer 其实是内核中的一个通知链机制,该机制在内核中到处可见,没有用过之前一直是看到这个就会跳过。今天对这个进行一下了解总结,防止以后用到这样的东西。内核中通知链的基础文件就两个,头文件include/linux/notifier.h,源文件kernel/notifier.c,但这部分是由协议栈头号大Boss—-Alan Cox亲自主刀,足以说明这个基础特性的重要性,也有很多值得我们学习的地方。
根据工作先看这个流程:
1、在dynamic.c中 定义一个可阻塞的notifier链表of_reconfig_chain
static BLOCKING_NOTIFIER_HEAD(of_reconfig_chain);
int of_reconfig_notifier_register(struct notifier_block *nb)
{
return blocking_notifier_chain_register(&of_reconfig_chain, nb);
}
当有订阅者想要订阅时候,需要直接调用of_reconfig_notifier_register 把其中的notifier_block 注册链表中
2、我们看到driver/of/platfrom.c 中:
static struct notifier_block platform_of_notifier = {
.notifier_call = of_platform_notify,
};
void of_platform_register_reconfig_notifier(void)
{
WARN_ON(of_reconfig_notifier_register(&platform_of_notifier));
}
可以看到notifier_block这个结构体并不复杂:
struct notifier_block {
notifier_fn_t notifier_call;
struct notifier_block __rcu *next;
int priority;
};
#ifdef CONFIG_OF_DYNAMIC // 配置了 动态加载函数才会编译
static int of_platform_notify(struct notifier_block *nb,
unsigned long action, void *arg)
{
。。。。。。。。。。。。。。。。。。//函数内容
}
3、通过以上两个步骤就把platform_of_notifier这个函数注册到of_reconfig_chain 这个链表中,
当dynamic有事件发生时候就会调用of_reconfig_chain这个链表中的回调函数 也就调用到了/driver/of/platfrom.c中的
of_platform_notify函数把动态加载的设备树 的节点解析出来。
refer:https://blog.csdn.net/qq_22340085/article/details/78457005