uevents 如何在内核中触发

Sam*_*Sam 3 linux udev linux-kernel

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

在内核中,必须有一些东西触发 uevent。

我猜有两种可能:

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

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

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

谢谢

Ale*_*oba 5

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

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

很少搜索,你去 - 在include/linux/kobject.h

enum kobject_action {
    KOBJ_ADD,
    KOBJ_REMOVE,
    KOBJ_CHANGE,
    KOBJ_MOVE,
    KOBJ_ONLINE,
    KOBJ_OFFLINE,
    KOBJ_MAX
};
Run Code Online (Sandbox Code Playgroud)

所以是

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

KOBJ_MAX 是特殊的,标记和枚举。

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

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

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

  • 也许。硬件中断主要导致“KOBJ_ADD/REMOVE”。但是有些内核进程或用户空间守护进程可能会触发“KOBJ_CHANGE”。 (2认同)
  • 来自 btrfs 的示例:在 fs/btrfs/volumes.c 中有来自 `btrfs_rm_device 的对 [`btrfs_kobject_uevent`](http://lxr.free-electrons.com/source/fs/btrfs/volumes.c#L1695) 的调用` 和 `btrfs_rm_device` 是从 `btrfs_ioctl_rm_dev` 调用的。此事件不是基于硬件的 - 它是 ioctl 处理程序。 (2认同)