Notifier Chain观察者:系统重启消息打印

概述

在本章节中,我们将学习如何使用Linux内核的Notifier Chain机制来注册一个重启notifier。当系统重启时,这个notifier会打印一条消息。Notifier Chain是内核中一种重要的观察者模式实现,用于在特定事件发生时通知注册的回调函数。

Notifier Chain 工作机制 事件 Notifier 回调

Notifier Chain 基本概念

Notifier Chain是Linux内核中用于实现发布-订阅模式的一种机制。它允许内核模块在特定事件发生时注册回调函数,从而得到通知。常见的事件包括系统重启、CPU热插拔、内存不足等。

主要组件:

组件 描述
Notifier Chain 管理回调函数链表的内核结构
Notifier Block 包含回调函数和优先级的结构体
事件类型 如 SYS_RESTART, SYS_HALT 等

实现步骤

  1. 定义一个notifier_block结构体,并设置其回调函数。
  2. 使用register_reboot_notifier函数注册这个notifier_block。
  3. 在回调函数中实现打印消息的逻辑。
  4. 在模块卸载时,使用unregister_reboot_notifier注销notifier。
Notifier 注册流程 1 定义 notifier_block 2 注册到 reboot notifier chain

代码示例

以下是一个简单的内核模块示例,它注册一个重启notifier,在系统重启时打印消息。

#include <linux/notifier.h>
#include <linux/module.h>
#include <linux/reboot.h>

static int reboot_notifier(struct notifier_block *nb, unsigned long action, void *data)
{
    switch (action) {
    case SYS_RESTART:
        pr_info("系统即将重启!\\n");
        break;
    case SYS_HALT:
        pr_info("系统即将停机!\\n");
        break;
    case SYS_POWER_OFF:
        pr_info("系统即将关机!\\n");
        break;
    default:
        break;
    }
    return NOTIFY_DONE;
}

static struct notifier_block reboot_nb = {
    .notifier_call = reboot_notifier,
    .priority = 0,
};

static int __init my_notifier_init(void)
{
    int ret;

    ret = register_reboot_notifier(&reboot_nb);
    if (ret) {
        pr_err("无法注册重启notifier\\n");
        return ret;
    }

    pr_info("重启notifier注册成功\\n");
    return 0;
}

static void __exit my_notifier_exit(void)
{
    unregister_reboot_notifier(&reboot_nb);
    pr_info("重启notifier已注销\\n");
}

module_init(my_notifier_init);
module_exit(my_notifier_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("一个简单的重启notifier示例");

注意:在实际使用中,需要确保模块的编译和加载正确,并且有足够的权限。

测试方法

要测试这个模块,可以按照以下步骤进行:

  1. 编译模块并加载到内核中。
  2. 使用dmesg命令查看模块加载消息。
  3. 执行重启命令(如sudo reboot),观察系统日志中的输出。