linux - uevent 从内核发送到用户空间 (udev)

标签 linux linux-kernel udev

我知道udev在linux系统上播放,它通过netlink socket接收内核发来的uevent。

但是,我的问题是:

  1. 内核如何发出事件?它必须是通过添加/删除设备触发的,然后向 udev 发送事件。内核如何做到这一点? (有没有我能找到的代码示例?)

  2. udev 仅通过 netlink 套接字接收这些 uevents。这是 udev 执行此操作的唯一方法。这是正确的吗?

  3. 当 uevent 从内核发出时,我知道它可以进行广播。但是,它能做单播吗?

感谢任何反馈。

最佳答案

  1. 它发送名为 uevent 的 netlink 消息。 uevent 只是一些特殊格式的字符串,通过 netlink 套接字发送。示例:

     "add@/class/input/input9/mouse2\0    // message
     ACTION=add\0                         // action type
     DEVPATH=/class/input/input9/mouse2\0 // path in /sys
     SUBSYSTEM=input\0                    // subsystem (class)
     SEQNUM=1064\0                        // sequence number
     PHYSDEVPATH=/devices/pci0000:00/0000:00:1d.1/usb2/2­2/2­2:1.0\0  // device path in /sys
     PHYSDEVBUS=usb\0       // bus
     PHYSDEVDRIVER=usbhid\0 // driver
     MAJOR=13\0             // major number
     MINOR=34\0",           // minor number
    

    真正发送uevent的内核函数是kobject_uevent_env它是名为 in many places 的包装器 kobject_uevent .

  2. 是的,udev 通过从 netlink 套接字接收 uevents 来工作。但是有一个选项——内核可以调用用户模式助手。在这种情况下,内核为每个热插拔事件生成一个进程,为每个描述该特定热插拔事件的新进程提供环境变量。如果您查看 kobject_uevent_env,您会看到该网络链接消息 is actually #ifdef'ed默认操作是调用该用户模式助手

  3. 理论上 netlink 消息可以广播、多播和单播,但内核 sends broadcast message使用 netlink_broadcast_filtered 调用。无论如何,该消息将发送到 NETLINK_KOBJECT_UEVENT 的套接字家庭。您可以在 uevent_net_init 中看到 netlink 套接字创建.

  4. 回答您的评论问题。您不会在内核中看到任何 send 函数。 send 是一个系统调用——它是内核提供给用户空间的接口(interface),但内核本身不使用任何系统调用。从 kobject_uevent_env 到不包含任何 send 的最终发送有一长串函数调用(在 net/netlink/af_netlink.cnet/core/dev.c 中)——在内核发送 skb 中(套接字缓冲区)类似于将缓冲区放入队列,然后调用调度程序交付该缓冲区并通知正在等待系统调用的用户空间 recv

资源:

  1. lib/kobject_uevent.c
  2. https://www.kernel.org/doc/pending/hotplug.txt - 有用户空间程序来监听 uevent 并打印它。
  3. https://bootlin.com/doc/legacy/udev/udev.pdf

关于linux - uevent 从内核发送到用户空间 (udev),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22803469/

相关文章:

java - 如何在 linux 上用 javaFX 播放视频

linux - opkg.conf 文件 : src vs src/gz

linux - 从 perf 获取 PEBS 数据线性地址

linux - 一旦在 Linux 中添加设备,udev 规则就不起作用

linux - 在加载驱动程序时使用 udev 规则执行命令

linux - 使 linux 内核 header /开发成为 RPM 和 Debs 要求的最稳定方法是什么?

linux - 如何在 Linux 中编写一些代码来自动打开和移动 2 个窗口?

linux - 处理/proc/pid/fd/# 链接的创建和删除的 Linux 内核代码在哪里?

cuda - 内核模式 GPGPU 使用

linux - 默认 Udev 规则