您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

        "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,并且在很多地方调用它的包装器。

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

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

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

其他 2022/1/1 18:18:19 有260人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶