【问题标题】:how uevents get triggered in kerneluevents 如何在内核中触发
【发布时间】:2014-04-18 03:27:26
【问题描述】:

uevents 已经通过 netlink 套接字从内核空间发送到用户空间。

在内核中,一定有触发uevent的东西。

我猜有两种可能:

  1. 硬件中断 - 这意味着一旦发生硬件中断,内核就会向用户空间发送事件以表明发生了一些事件。

  2. 软件轮询 - 这意味着,总是有一个守护进程来检查这些文件系统以查看是否有任何更改。如果是,则将这些信息更新到上层。

有人可以提供您的反馈吗?

谢谢

【问题讨论】:

    标签: linux linux-kernel udev


    【解决方案1】:

    关于投票,我不同意你的看法。 uevent 是基于事件的,所以没有轮询。

    触发uevent在很多情况下都会发生,我宁愿先弄清楚存在哪些uevent类型

    稍微搜索一下就可以了 - 在include/linux/kobject.h

    enum kobject_action {
        KOBJ_ADD,
        KOBJ_REMOVE,
        KOBJ_CHANGE,
        KOBJ_MOVE,
        KOBJ_ONLINE,
        KOBJ_OFFLINE,
        KOBJ_MAX
    };
    

    原来如此

    • 添加事件
    • 移除事件
    • 更改事件
    • 移动事件
    • 线上活动
    • 线下活动

    KOBJ_MAX 是特殊的并且标记和枚举。

    实际发送 uevent 的函数有 2 个 - kobject_ueventkobject_uevent_env。使用上面列出的操作调用这些函数。

    最后,回答您的问题。没有预定义的情况会触发 uevent。如果您搜索kobject_ueventkobject_uevent_env 的调用,您会发现它发生在不同不相关内核子系统的各种回调中。

    uevent 是用于统一来自各种不相关驱动程序的通知的内核工具。所以我认为没有众所周知的会触发 uevent 的事情列表。

    【讨论】:

    • 谢谢。我可以认为这是第 1 项吗?这主要是由硬件中断触发的。
    • 也许吧。硬件中断主要导致KOBJ_ADD/REMOVE。但是有KOBJ_CHANGE 可能由某些内核进程或用户空间守护进程触发。
    • 谢谢。你介意提供一个关于 KOBJ_CHANGE 的例子吗?它是由一些没有硬件中断的事件触发的?
    • btrfs 的示例:在 fs/btrfs/volumes.c 中有一个从 btrfs_rm_device 调用的 btrfs_kobject_uevent 和从 btrfs_ioctl_rm_dev 调用的 btrfs_rm_device。此事件不是基于硬件的 - 它是 ioctl 处理程序。
    • 谢谢!这是一个很好的例子。
    猜你喜欢
    • 2017-04-08
    • 2018-08-15
    • 1970-01-01
    • 2014-02-23
    • 2023-03-10
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多