linux 通知链,Linux内核通知链notifier
当有事件发生时,通知者调用 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相关推荐
- Linux内核通知链分析【转】
转自:http://www.cnblogs.com/jason-lu/articles/2807758.html Linux内核通知链分析 1. 引言 Linux是单内核架构(monolithic k ...
- 深入理解Linux内核通知链(Notifier)
数据结构 内核使用struct notifier_block结构代表一个notifier typedef int (*notifier_fn_t)(struct notifier_block *nb, ...
- Linux内核通知链(notifier chain)
1.概述 Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施.为满足这样的需求,内核实现了事件通知链机制( ...
- linux 内核通知,[Linux] 内核通知链 notifier
Linux 内核中每个模块之间都是独立的,如果模块需要感知其他模块的事件,就需要用到内核通知链. 最典型的通知链应用就是 LCD 和 TP 之间,TP 需要根据 LCD 的亮灭来控制是否打开关闭触摸功 ...
- Linux 内核通知链和例程代码
概念 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣.为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制.通知链表只 ...
- Linux 内核通知链随笔【中】
关于内核通知链不像Netlink那样,既可以用于内核与用户空间的通信,还能用于内核不同子系统之间的通信,通知链只能用于内核不同子系统之间的通信.那么内核通知链到底是怎么工作的?我们如何才能用好 ...
- notifier chain — 内核通知链【转】
转自:http://blog.csdn.net/g_salamander/article/details/8081724 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣 ...
- notifier_chain 内核通知链的学习与使用
linux 内核通知链 通知链用于将状态改变信息发送给请求这些改变的代码段,通知链可以用于内核将特定的事件传递给感兴趣的内核组件中. 内核定义了主要的事件类型: 死亡通知 网络设备通知 cpu 频率通 ...
- 内核通知链(网络子系统为例)
概念 1.Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施.为满足这样的需求,内核实现了事件通知链机制( ...
最新文章
- java9新特性-16-Deprecated的相关API
- 超简单:解析 yml 类型(application.yml)配置文件 、springboot 工程读取 yml 文件中的值
- echarts中toolbox位置_echarts toolbox 扩展
- The system is running in low-graphics mode
- 【兼容写法】HttpServerUtility.Execute 在等待异步操作完成时被阻止。关键词:MVC,分部视图,异步...
- jsplumb入门教程及视频教程链接
- SFP光模块怎么配对光纤线缆
- 中职计算机教师发言范文话,中职班主任发言稿范文(精选4篇)
- Android Intent 传递数据大小限制
- JVM从入门到入魔(一) 类加载机制
- Verdi命令行调用选项用法
- 你的颜值打几分?——基于tensorflow实现人脸打分模型
- 【Unity3D】基于模板测试和顶点膨胀的描边方法
- 代数余子式之和怎么算_小明说养老 | 养老金怎么算之月平均缴费指数怎么来的?...
- 根据docker镜像反推dockerfile
- 华为HCIA-datacom 学习笔记11——AAA原理与配置
- java ncso发送电邮_如何在Windows中从命令行发送电子邮件(无需额外的软件)
- 服务器申请系统,政务云平台服务器申请
- Flavor在多子module的项目环境下,依赖冲突的处理
- ios屏幕兼容 phone4和iphone5的屏幕尺寸不同,在程序中兼容
热门文章
- React 教程:快速上手指南
- LeetCode39.组合总和 JavaScript
- MyBatis魔法堂:ResultMap详解
- 一款优秀的JavaScript框架—AngularJS
- locust===官方说明文档,关于tasks
- Delphi 的编译指令(1): $DEFINE、$UNDEF、$IFDEF、$ELSE、$ENDI
- 【二分图最大匹配】【HDU2063】过山车
- BW:Start Routine
- sql随机实现,sql GUID
- 《搜索引擎-信息检索实践》7.2.1 分类应用与检索/BM25检索模型