内核使用通知链的机制在内核各子系统之间进行事件通知(注:无法用于内核态和用户态之间的事件通知)。

一、通知链介绍

在文件include/linux/notifier.h中,可以查看Linux内核定义的四种通知链类型:

通知链类型 初始化 注册函数 通知函数
Atomic notifier chains(原子通知链) ATOMIC_NOTIFIER_HEAD() atomic_notifier_chain_register()/
atomic_notifier_chain_unregister()
atomic_notifier_call_chain()
Blocking notifier chains(可阻塞通知链) BLOCKING_NOTIFIER_HEAD() blocking_notifier_chain_register()/
blocking_notifier_chain_unregister
blocking_notifier_call_chain()
Raw notifier chains(原始通知链) RAW_NOTIFIER_HEAD() raw_notifier_chain_register()/<br />raw_notifier_chain_unregister() raw_notifier_call_chain()
SRCU notifier chains(SRCU通知链) srcu_init_notifier_head() srcu_notifier_chain_register()/<br />srcu_notifier_chain_unregister srcu_notifier_call_chain()

说明:

1、原子通知链:通知链的回调函数在中断或原子上下文中运行,不允许阻塞。

2、可阻塞通知链:通知链的回调函数在进程上下文中运行,允许堵塞。

3、原始通知链:对通知链的回调函数没有限制,调用者维护锁和保护。

4、SRCU通知链:阻塞通知链的一个变体。

二、通知链应用

以系统睡眠唤醒为例,介绍可阻塞通知链的使用。

## kernel/power/main.c
## 1.初始化通知链pm_chain_head
static BLOCKING_NOTIFIER_HEAD(pm_chain_head);## kernel/power/wakeup_reason.c
## 2.注册通知链
## 2.1通知链回调函数实现
static int wakeup_reason_pm_event(struct notifier_block *notifier,unsigned long pm_event, void *unused)
{switch (pm_event) {case PM_SUSPEND_PREPARE:...}
}static struct notifier_block wakeup_reason_pm_notifier_block = {.notifier_call = wakeup_reason_pm_event,
};## 2.2注册通知链
int __init wakeup_reason_init(void)
{...retval = register_pm_notifier(&wakeup_reason_pm_notifier_block);....
}int register_pm_notifier(struct notifier_block *nb)
{return blocking_notifier_chain_register(&pm_chain_head, nb);
}## kernel/power/suspend.c
## 3.通知
static int suspend_prepare(suspend_state_t state)
{...## 3.1 发送PM_SUSPEND_PREPARE通知时,调用.notifier_call()对应的wakeup_reason_pm_event()函数处理。error = __pm_notifier_call_chain(PM_SUSPEND_PREPARE, -1, &nr_calls);...
}int __pm_notifier_call_chain(unsigned long val, int nr_to_call, int *nr_calls)
{...ret = __blocking_notifier_call_chain(&pm_chain_head, val, NULL,nr_to_call, nr_calls);...
}

作者:小田BSP
链接:https://www.jianshu.com/p/53baedc6fd79
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Linux内核notifier机制通知链相关推荐

  1. Linux内核源码——通知链(notifier chain)

    写在前面的话: 刚入手Linux驱动的时候,各种Linux内核的机制是我们需要搬起的一块大砖块.搬砖的过程中,我发现自己不能很好的理解相关的业务驱动的很大的一个原因就是对内核的基本机制掌握不太准确.刚 ...

  2. Linux内核基础--事件通知链(notifier chain)【转】

    转自:http://blog.csdn.net/wuhzossibility/article/details/8079025 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个 ...

  3. Linux内核Notifier机制

    notifier是kernel的一种异步通信机制,用于告知某些模块产生了一个事件event. notifier涉及: 1,publisher,类比于server.provider等概念,负责: 提供一 ...

  4. Linux 内核 notifier机制

    一般而言特定的子系统会用特定的notifier_chain_register包装函数来注册,比如tp通过fb_register_client来注册notifier_block(在具体的应用场景中会封装 ...

  5. Linux的notifier机制在TP中的应用【转】

    转自:https://blog.csdn.net/armfpga123/article/details/51771666 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  6. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

  7. 深度剖析Linux内核地址映射机制

    深度剖析Linux内核地址映射机制 1.虚拟空间数据结构   2.进程虚拟空间  3.内存映射 视频讲解如下,点击观看: Linux内核开发系列第7讲--深度剖析Linux内核地址映射机制 C/C++ ...

  8. linux 内核mmap,Linux内核mmap机制

    1. 问:如何将物理地址映射到用户空间的虚拟地址上? 2.linux内核mmap机制 2.1.回顾LED驱动数据流的操作过程 通过分析LED驱动,得出以下结论: 如果利用read,write,ioct ...

  9. linux c 网络事件 通知,深入理解Linux网络技术内幕—通知链

    内核的很多子系统之间具有很强的相互依赖关系,其中一个子系统发现的或产生的事件,其他子系统可能都有兴趣.为了实现这种交互需求,Linux使用了通知链(Notification Chain)机制. 通知链 ...

最新文章

  1. Error:warning: Ignoring InnerClasses attribute for an anonymous inner class
  2. web服务器time_wait值过高解决方案
  3. linux zlib简介
  4. X86 CPU特性之(1)-umip
  5. jQuery阻止表单提交
  6. 游戏脚本代码大全_按键精灵】一个很好学的脚本
  7. Deeping Learning学习与感悟——《深度学习工程师》_1
  8. dhtml gantt所有配置_dhtmlxGantt
  9. 2011当选的院士工作职务之一
  10. IT运维外包甩不掉的包袱
  11. tf33: 图像降噪:卷积自编码
  12. UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式
  13. WOW.js插件使用
  14. 使用NMT和pmap解决JVM资源泄漏问题
  15. 彻底搞懂a++和++a的区别
  16. AppTransition
  17. Java从身份证号码,提取用户的出生年月日,输出用户的生日信息。
  18. maven是干嘛的_maven项目是干嘛的
  19. 美程序员走低龄化路线 12岁少年开发98款游戏
  20. 前端开发:H5直播起航

热门文章

  1. C++类和C结构体类型的异同
  2. 安徽师大附中%你赛day9 T2 富 解题报告
  3. 前端工程师必备的Nginx知识
  4. Exp5 MSF基础应用 20164302 王一帆
  5. 浅析智慧消防应用中多设备联动火灾报警系统
  6. 【2017年总结】--吾生也有涯,而知也无涯
  7. 【已解决】TF_REPEATED_DATA ignoring data with redundant timestamp for frame
  8. AD(altium designer)15原理图与PCB设计教程(七)——印制电路板的布局设计
  9. 漫画趣解大数据算法建模:买瓜
  10. android kindle 无效文档,URL schemes 按官方文档设置无效