分类: LINUX
2015-02-08 16:27:56
1.内核通知链表简介(引用网络资料)
大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它
的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知。
通
知链表是一个函数链表,链表上的每一个节点都注册了一个函数。当某个事情发生时,链表上所有节点对应的函数就会被执行。所以对于通知链表来说有一个通知方
与一个接收方。在通知这个事件时所运行的函数由被通知方决定,实际上也即是被通知方注册了某个函数,在发生某个事件时这些函数就得到执行。
struct notifier_block { |
int register_netdevice_notifier(struct notifier_block *nb) |
/* |
static int notifier_chain_unregister(struct notifier_block **nl, |
/** |
参 数nl是通知链的头部,val表示事件类型,v用来指向通知链上的函数执行时需要用到的参数,一般不同的通知链,参数类型也不一样,例如当通知一个网卡被 注册时,v就指向net_device结构,nr_to_call表示准备最多通知几个,-1表示整条链都通知,nr_calls非空的话,返回通知了多 少个。
每个被执行的notifier_block回调函数的返回值可能取值为以下几个:
Notifier_call_chain()把最后一个被调用的回调函数的返回值作为它的返回值。
内核预定义了四种类型的notifier chain.
/*
/* 可阻塞通知链( Blocking notifier chains ):通知链元素的回调函数在进程上下文中运行,允许阻塞 */
/* 原始通知链( Raw notifier chains ):对通知链元素的回调函数没有任何限制,所有锁和保护机制都由调用者维护 */
/* 可阻塞通知链的一种变体 */ |
extern int atomic_notifier_chain_register(struct atomic_notifier_head *nh, structnotifier_block *nb); |
extern int atomic_notifier_chain_unregister(struct atomic_notifier_head *nh, structnotifier_block *nb); |
extern int atomic_notifier_call_chain(struct atomic_notifier_head *nh, unsigned long val,void *v);
extern int srcu_notifier_call_chain(struct srcu_notifier_head *nh, unsigned long val,void *v);oid *v); |