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

我知道udev在linux系统上运行,并且它通过netlink套接字接收从内核发送的uevent。

但是,我的问题是:

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

  2. udev仅通过netlink套接字接收这些uevent。这是udev做到这一点的唯一方法。它是否正确?

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

感谢您的任何反馈。

回答:

  1. 它发送称为uevent的网络链接消息。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_envkobject_uevent,并且在很多地方都调用了它的包装器。

  1. 是的,udev通过从netlink套接字接收uevents来工作。但是有一个选择-内核可以调用用户模式助手。在这种情况下,内核会为每个热插拔事件生成一个进程,并为每个描述该特定热插拔事件的新进程提供环境变量。如果您看一下,kobject_uevent_env将会看到netlink消息实际上是#ifdef“ ed”的,并且默认操作是调用该用户模式助手

  2. 在理论上的netlink消息可以是广播,组播和单播,但内核发送广播消息与netlink_broadcast_filtered呼叫。无论如何,该消息都发送给了NETLINK_KOBJECT_UEVENT家庭。您可以在中看到netlink套接字的创建uevent_net_init

  3. 回答您的评论问题。您不会send在内核中看到任何功能。send是系统调用-内核提供给用户空间的接口,但是内核本身不使用任何系统调用。从一连串的函数调用(在net / netlink / af_netlink.c和net / core / dev.c中)kobject_uevent_env到最终发送不包含任何内容send-在内核中发送skb(套接字缓冲区)就像放置缓冲区一样在队列中,然后调用调度程序以传递该缓冲区并通知正在等待syscall的用户空间recv

以上是 uevent从内核发送到用户空间(udev) 的全部内容, 来源链接: utcz.com/qa/425797.html

回到顶部