Linux notifer 机制

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 actionvoid *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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值