Linux 内核的 notifier 机制

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

Linux内核中的notifier机制是一种重要的组件间通信机制,它允许在内核中的某些事件发生时,相关的组件能够得到通知并作出相应的处理。这种机制常用于各种内核子系统,如网络、文件系统、设备驱动等,以确保当系统状态发生变化时,所有相关部分都能得到更新。

具体来说,notifier机制包括以下几个关键概念:

  1. Notifier Block:这是一个数据结构,它包含了处理特定事件的通知函数和处理函数的回调指针,以及一个优先级值。每个希望接收通知的模块都需要注册自己的notifier block。

  2. Notifier Chain:这是由一组notifier block组成的链表。当事件发生时,内核会遍历这个链表,并调用每个block中的回调函数。

  3. Notification Types:这些是预定义的事件类型,如NETDEV_CHANGE、NETDEV_UP、NETDEV_DOWN等,每个事件类型对应于内核中可能发生的一种状态变化。

  4. Registration and Unregistration:模块通过特定的内核API注册自己的notifier block到某个notifier chain中,并在不需要时将其注销。

  5. Notification Call:当检测到某个事件发生时,内核会调用notifier_call_chain()函数,这个函数会遍历相应的notifier chain,并调用每个notifier block中的回调函数。

通过这种机制,Linux内核能够以一种松耦合的方式,让不同的组件对系统中的各种事件做出响应,从而增强了系统的灵活性和可扩展性。

二、通知链应用

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

## 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);
    ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值