[Openwrt]procd实现hotplug机制介绍

在Linux中,hotplug事件通过kobject_uevent产生uevent,经过netlink广播,OpenWrt使用procd通过PF_NETLINK监听并处理这些事件,特别是对块设备如U盘的插入和按键事件的响应。当插入存储设备时,hotplug-call会执行/etc/hotplug.d/block下的脚本来挂载或卸载。对于按键,OpenWrt有gpio_button_hotplug内核模块来检测,并通过uevent传递按键时间差信息。

Linux处理hotplug事件方法

  1. kobject_uevent() 产生 uevent 事件(lib/kobject_uevent.c 中), 产生的 uevent 先由 netlink_broadcast_filtered() 发出, 最后调用 uevent_helper[] 所指定的程序来处理.

  1. uevent_helper[] 里默认指定 "/sbin/hotplug", 但可以通过 /sys/kernel/uevent_helper (kernel/ksysfs.c) 或 /proc/kernel/uevent_helper (kernel/sysctl.c) 来修改成指定的程序.

  1. 在 OpenWrt 并不使用 user_helper[] 指定程序来处理 uevent (/sbin/hotplug 不存在), 而是使用 PF_NETLINK 来获取来自内核的 uevent.

用户空间监听 uevent

openwrt 中, procd 作为 init 进程会处理许多事情, 其中就包括 hotplug。

procd/plug/hotplug.c 中, 创建一个 PF_NETLINK 套接字来监听内核 netlink_broadcast_filtered() 发出的 uevent。收到 uevent 之后, 再根据 /etc/hotplug.json 里的描述来处理。

通常情况下, /etc/hotplug.json 会调用 /sbin/hotplug-call 来处理, 它根据 uevent 的 $SUBSYSTEM 变量来分别调用 /etc/hotplug.d/ 下不同目录中的脚本.

比如, 插入U盘或SD卡时, 会产生的事件消息如下:

第一个 makedev 会创建 /dev/sda1 节点. 第二个 exec 命令, 其附带的消息中指定了 ACTION, DEVPATH, SUBSYSTEM, DEVNAME, DEVTYPE 等变量.

于是 hotplug-call 会尝试执行 /etc/hotplug.d/block/ 目录下的所有可执行脚本.

所以我们可以在这里放置我们的自动挂载/卸载处理脚本。

按键 button 的检测

openwrt 中, 按键的检测也是通过 hotplug 来实现的.

它首先写了一个内核模块: gpio_button_hotplug, 用于监听按键, 有中断和 poll 两种方式. 然后在发出事件的同时, 将记录并计算得出的两次按键时间差也作为 uevent 变量发出来.

这样在用户空间收到这个 uevent 事件时就知道该次按键按下了多长时间.

目前在MTK7621的平台上是不支持dts的,所以无法使用这个功能:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小白20200202

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值