Ответ 1
-
Он отправляет сообщение netlink с именем uevent. uevent - это просто строка некоторого специального формата, который отправляется через сокет netlink. Пример:
"[email protected]/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/22/22: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
который вызывается во многих местах. -
Да, udev работает, получая uevents из сокета netlink. Но есть опция - ядро может вызвать помощник usermode. В этом случае ядро запускает один процесс на событие hotplug, предоставляя переменные среды каждому новому процессу, описывающему это событие hotplug. Если вы посмотрите на
kobject_uevent_env
вы увидите, что сообщение netlink на самом деле#ifdef
'ed, а действие по умолчанию - вызов этого помощника usermode -
Теоретически сообщения netlink могут быть широковещательными, многоадресными и одноадресными, но ядро отправляет широковещательное сообщение с
netlink_broadcast_filtered
вызоваnetlink_broadcast_filtered
. В любом случае это сообщение отправляется в сокет семействаNETLINK_KOBJECT_UEVENT
. Вы можете видеть создание сокета netlink вuevent_net_init
. -
Отвечая на ваш вопрос. Вы не увидите никакой функции
send
в ядре.send
- это системный вызов - это интерфейс, предоставляемый ядром для пользовательского пространства, но сам ядро не использует никаких системных вызовов. Существует длинная цепочка вызовов функций (в net/netlink/af_netlink.c и net/core/dev.c) отkobject_uevent_env
до окончательной отправки, которая не содержит никакогоsend
ядра, отправляющего skb (буфер сокета) - это что-то вроде размещение буфера в очереди, а затем вызов планировщика для доставки этого буфера и уведомление пользователя, ожидающего в syscallrecv
Ресурсы:
- Библиотека /kobject_uevent.c
- https://www.kernel.org/doc/pending/hotplug.txt - есть программа пользовательского пространства, которая прослушивает uevents и печатает ее.
- https://bootlin.com/doc/legacy/udev/udev.pdf