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

Posted

技术标签:

【中文标题】uevent 从内核发送到用户空间 (udev)【英文标题】:uevent sent from kernel to user space (udev) 【发布时间】:2014-05-13 06:21:40 【问题描述】:

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

但是,我的问题是:

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

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

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

感谢您的任何反馈。

【问题讨论】:

非常感谢您的详细回答。还有一个问题,我也看到了 bind(..) 函数。这是用户空间程序用来接收uevent的功能吗?从您的回答中,我没有看到任何我认为这是内核用来发送 uevent 的 send(..)。 【参考方案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,它是包装器 kobject_uevent,称为 in many places。

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

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

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

资源:

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

【讨论】:

感谢您的回复。您介意再回答一个我在评论中添加的问题吗? 更新了评论问题的答案。 @AlexDzyoba 注意:您的第三个链接 (udev.pdf) 目前已损坏。 @AlexanderDzyoba 第二个链接也坏了kernel.org/doc/pending/hotplug.txt(第三个 - udev.pdf - 虽然对我有用)

以上是关于uevent 从内核发送到用户空间 (udev)的主要内容,如果未能解决你的问题,请参考以下文章

linux 内核4.9.11如何使用热拔插

将小型 UDP 数据包从 Linux 内核发送到 LOOPBACK

PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理

netlink 套接字问题:内核冻结

Linux之udev,mdev,devfs,sysfs,uevent之间关系

Linux之udev,mdev,devfs,sysfs,uevent之间关系