当有事件发生时,通知者调用 notifier_call_chain

函数通知事件的到达,这个函数会遍历n1指向的通知链中所有的元素,然后依次调用每一个的回调函数,完成通知动作。

static int __kprobes notifier_call_chain(struct notifier_block

**nl,

unsigned long val, void *v,

int nr_to_call,

int *nr_calls)

{

int ret = NOTIFY_DONE;

struct notifier_block *nb, *next_nb;

nb = rcu_dereference_raw(*nl);

while (nb && nr_to_call) {

next_nb = rcu_dereference_raw(nb->next);

#ifdef CONFIG_DEBUG_NOTIFIERS

if

(unlikely(!func_ptr_is_kernel_text(nb->notifier_call)))

{

WARN(1, "Invalid notifier called!");

nb = next_nb;

continue;

}

#endif

ret = nb->notifier_call(nb, val, v);

if (nr_calls)

(*nr_calls)++;

if ((ret & NOTIFY_STOP_MASK) ==

NOTIFY_STOP_MASK)

break;

nb = next_nb;

nr_to_call--;

}

return ret;

}

在kernel/notifier.c中内核根据通知链的类型分别包装了上面这个函数:

int atomic_notifier_call_chain(struct atomic_notifier_head

*nh,

unsigned long val, void *v)

int blocking_notifier_call_chain(struct blocking_notifier_head

*nh,

unsigned long val, void *v)

int raw_notifier_call_chain(struct raw_notifier_head *nh,

unsigned long val, void *v)

int srcu_notifier_call_chain(struct srcu_notifier_head *nh,

unsigned long val, void *v)

5.通知链四种类型

(5.1)原子通知链的链头:

通知链元素的回调函数(当事件发生时要执行的函数)只能在中断上下文中运行,不允许阻塞。

struct atomic_notifier_head {

spinlock_t lock;

struct notifier_block *head;

};

(5.2)可阻塞通知链:

通知链元素的回调函数在进程上下文中运行,允许阻塞。

struct blocking_notifier_head {

struct rw_semaphore rwsem;

struct notifier_block *head;

};

(5.3)原始通知链:

对通知链元素的回调函数没有任何限制,所有锁和保护机制都由调用者维护。

struct raw_notifier_head {

struct notifier_block *head;

};

(5.4)SRCU 通知链:

可阻塞通知链的变种。

struct srcu_notifier_head {

struct mutex mutex;

struct srcu_struct srcu;

struct notifier_block *head;

};

(6)定义一个通知链的头部结点并初始化:

在include/linux/Notifier.h中

初始化宏定义:

#define ATOMIC_NOTIFIER_INIT(name) {

\

.lock = __SPIN_LOCK_UNLOCKED(name.lock),

\

.head = NULL }

#define BLOCKING_NOTIFIER_INIT(name) {

\

.rwsem = __RWSEM_INITIALIZER((name).rwsem),

\

.head = NULL }

#define RAW_NOTIFIER_INIT(name)

{

\

.head = NULL }

定义通知链:

#define ATOMIC_NOTIFIER_HEAD(name)

\

struct atomic_notifier_head name =

\

ATOMIC_NOTIFIER_INIT(name)

#define BLOCKING_NOTIFIER_HEAD(name)

\

struct blocking_notifier_head name =

\

BLOCKING_NOTIFIER_INIT(name)

#define RAW_NOTIFIER_HEAD(name)

\

struct raw_notifier_head name =

\

RAW_NOTIFIER_INIT(name)

转自:http://blog.csdn.net/xiyu_1986/article/details/6641378

linux 通知链,Linux内核通知链notifier相关推荐

  1. Linux内核通知链分析【转】

    转自:http://www.cnblogs.com/jason-lu/articles/2807758.html Linux内核通知链分析 1. 引言 Linux是单内核架构(monolithic k ...

  2. 深入理解Linux内核通知链(Notifier)

    数据结构 内核使用struct notifier_block结构代表一个notifier typedef int (*notifier_fn_t)(struct notifier_block *nb, ...

  3. Linux内核通知链(notifier chain)

    1.概述 Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施.为满足这样的需求,内核实现了事件通知链机制( ...

  4. linux 内核通知,[Linux] 内核通知链 notifier

    Linux 内核中每个模块之间都是独立的,如果模块需要感知其他模块的事件,就需要用到内核通知链. 最典型的通知链应用就是 LCD 和 TP 之间,TP 需要根据 LCD 的亮灭来控制是否打开关闭触摸功 ...

  5. Linux 内核通知链和例程代码

    概念 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣.为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制.通知链表只 ...

  6. Linux 内核通知链随笔【中】

        关于内核通知链不像Netlink那样,既可以用于内核与用户空间的通信,还能用于内核不同子系统之间的通信,通知链只能用于内核不同子系统之间的通信.那么内核通知链到底是怎么工作的?我们如何才能用好 ...

  7. notifier chain — 内核通知链【转】

    转自:http://blog.csdn.net/g_salamander/article/details/8081724 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣 ...

  8. notifier_chain 内核通知链的学习与使用

    linux 内核通知链 通知链用于将状态改变信息发送给请求这些改变的代码段,通知链可以用于内核将特定的事件传递给感兴趣的内核组件中. 内核定义了主要的事件类型: 死亡通知 网络设备通知 cpu 频率通 ...

  9. 内核通知链(网络子系统为例)

    概念 1.Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施.为满足这样的需求,内核实现了事件通知链机制( ...

最新文章

  1. java9新特性-16-Deprecated的相关API
  2. 超简单:解析 yml 类型(application.yml)配置文件 、springboot 工程读取 yml 文件中的值
  3. echarts中toolbox位置_echarts toolbox 扩展
  4. The system is running in low-graphics mode
  5. 【兼容写法】HttpServerUtility.Execute 在等待异步操作完成时被阻止。关键词:MVC,分部视图,异步...
  6. jsplumb入门教程及视频教程链接
  7. SFP光模块怎么配对光纤线缆
  8. 中职计算机教师发言范文话,中职班主任发言稿范文(精选4篇)
  9. Android Intent 传递数据大小限制
  10. JVM从入门到入魔(一) 类加载机制
  11. Verdi命令行调用选项用法
  12. 你的颜值打几分?——基于tensorflow实现人脸打分模型
  13. 【Unity3D】基于模板测试和顶点膨胀的描边方法
  14. 代数余子式之和怎么算_小明说养老 | 养老金怎么算之月平均缴费指数怎么来的?...
  15. 根据docker镜像反推dockerfile
  16. 华为HCIA-datacom 学习笔记11——AAA原理与配置
  17. java ncso发送电邮_如何在Windows中从命令行发送电子邮件(无需额外的软件)
  18. 服务器申请系统,政务云平台服务器申请
  19. Flavor在多子module的项目环境下,依赖冲突的处理
  20. ios屏幕兼容 phone4和iphone5的屏幕尺寸不同,在程序中兼容

热门文章

  1. React 教程:快速上手指南
  2. LeetCode39.组合总和 JavaScript
  3. MyBatis魔法堂:ResultMap详解
  4. 一款优秀的JavaScript框架—AngularJS
  5. locust===官方说明文档,关于tasks
  6. Delphi 的编译指令(1): $DEFINE、$UNDEF、$IFDEF、$ELSE、$ENDI
  7. 【二分图最大匹配】【HDU2063】过山车
  8. BW:Start Routine
  9. sql随机实现,sql GUID
  10. 《搜索引擎-信息检索实践》7.2.1 分类应用与检索/BM25检索模型