1. 目的
Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施。为满足这样的需求,内核实现了事件通知链机制(notificationchain)。
2. 范围
通知链只能用在各个子系统之间,而不能在内核和用户空间进行事件的通知。
3. 代码位置
组成内核的核心系统代码均位于kernel目录下,通知链表位于kernel/notifier.c中,对应的头文件为include/linux/notifier.h。
4. 被通知数据结构
notifier_block是通知链中的主要结构:
struct notifier_block {
int (*notifier_call)(struct notifier_block *, unsigned long, void *);
struct notifier_block *next;
int priority;
};
其中,
a. notifier_call:当相应事件发生时应该调用的函数,由被通知方提供;
b. notifier_block *next:用于链接成链表的指针;
c. priority:回调函数的优先级,一般默认为0;
5. 通知链数据结构
围绕核心数据结构notifier_block,内核定义了四种通知链类型:
a. 原子通知链( Atomic notifier chains ):通知链元素的回调函数(当事件发生时要执行的函数)在中断或原子操作上下文中运行,不允许阻塞。对应的链表头结构: