kobject_uevent_env()?????????????????do_execve()????mdev????getenv????
Linux系统对uevent机制的具体实现是建立在设备模型的基础上的,通过kobject_uevent函数实现。 在前面的kset小节中提到了注册一个kset的接口,可以在这里习复下。...uevent_ops = kset->uevent_ops; /* skip the event, if uevent_suppress is set*/ if (kobj->uevent_suppress...&& uevent_ops->uevent) { retval = uevent_ops->uevent(kset, kobj, env); if (retval) { pr_debug...); #ifdef CONFIG_UEVENT_HELPER //如果开启了就是用uevent_helper发送uevent。...uevent_helper的定义如下 #ifdef CONFIG_UEVENT_HELPER char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH
uevent的机制是比较简单的,设备模型中任何设备有事件需要上报时,会触发uevent提供的接口。...这个要执行的文件就是uevent helper。 uevent_helper的值在内核编译的时候,通过CONFIG_UEVENT_HELPER_PATH这个配置来指定。...同时也可以在后期,通过修改/sys/kernel/uevent_helper文件,指定新的uevent helper. 它有什么问题?...如果启用了CONFIG_UEVENT_HELPER,那么,产生uevent的时候,内核会在[这里]运行新的uevent helper进程。也就是说,每次上报uevent,都会创建新的进程。...解法2 如果实在要用到uevent helper,那么建议在编译的时候,只启用CONFIG_UEVENT_HELPER而不设置CONFIG_UEVENT_HELPER_PATH的值,在系统启动后,再通过
power supply(以下简称psy)是Linux中从供电驱动抽象出来的子系统,是Linux电源管理的重要组成部分。...相关结构体 psy相关的定义在/include/linux/power_supply.h。 ?...在sysfs中有个power_supply_uevent,该函数在psy class初始化时注册为设备节点的dev_uevent,在每一个psy目录下都有一个uevent节点,读取该节点即调用power_supply_uevent...可以看到,在kobject_uevent_env函数中调用对应kset的uevent,会去遍历每一个属性节点(dev_uevent),之后,会通过netlink_broadcast函数进行广播(使用netlink...值得注意的是,使用uevent-netlink机制传递的字符串并不会包含psy属性节点的kobject_uevent_env键值对状态。
Android供电系统框架 power supply(以下简称psy)是Linux中从供电驱动抽象出来的子系统,是Linux电源管理的重要组成部分。...相关结构体 psy相关的定义在/include/linux/power_supply.h。...,在每一个psy目录下都有一个uevent节点,读取该节点即调用power_supply_uevent函数。...跟踪这一调用流程可以在驱动中实现的get_property函数增加调用栈打印: 可以看到,在kobject_uevent_env函数中调用对应kset的uevent,会去遍历每一个属性节点(dev_uevent...值得注意的是,使用uevent-netlink机制传递的字符串并不会包含psy属性节点的kobject_uevent_env键值对状态。
Udev是一个针对Linux内核2.6的可提供自动创建的设备节点和命名的解决方法的一个文件系统;其实与/etc/目录下的fstab文件类似 二、Udev如何获取内核这些模块的变化信息?...新的Linux内核使用udev代替了hotplug作为热拔插管理,虽然有udevd管理热拔插,但有时候我们还是需要在应用程序中检测热拔插事件以便快速地处理,比如在读写SD卡的时候拔下SD卡,那么需要立即检测出该情况...该工作方式是异步的,用户空间程序不必使用轮询等技术来检测热拔插事件 内核中使用uevent事件通知用户空间,uevent首先在内核中调用netlink_kernel_create()函数创建一个socket...types.h> 7 //该头文件需要放在netlink.h前面防止编译出现__kernel_sa_family未定义 8 #include 9 #include <linux...表示接收内核uevent信息。
前言 在linux设备驱动模型中,总线可以看作是linux设备模型的核心,系统中的其他设备以及驱动都是以总线为核心围绕。不过驱动程序员在系统中创建一条总线的机会并不多。...为此linux设备驱动模型都将围绕"总线--设备--驱动"来展开,因为符合linux设备驱动模型的设备与驱动都是必须挂载在一个总线上的,无论是实际存在的或者虚拟的。...在前面kset学习中知道,当这个名为bus的kset下有状态变化的时候,就会发送uevent消息的,在发送过程中就会调用到bus_uevent_ops中实现的函数。...= { .filter = bus_uevent_filter, }; 在bus_uevent_ops中只实现了filter函数。...); //创建该bus的uevent属性 if (retval) goto bus_uevent_fail; priv->devices_kset = kset_create_and_add(
coresight cpu event_source hid i2c iio mdio_bus mmc platform scsi sdio serio spi usb virtio workqueue 数据结构 linux...uevent_ops: kset的uevent操作函数集合。当其中的kobject对象的状态发生变化需要通知用户空间的时候,就需要调用uevent_ops中的函数。...struct kset_uevent_ops定义如下: struct kset_uevent_ops { int (* const filter)(struct kset *kset, struct...if (err) return err; kobject_uevent(&k->kobj, KOBJ_ADD); //通过uevent机制通知用户空间 return...0; } 关于uevent机制,会在后面的uevent文章中详细说明,此处先跳过。
的调用 -> void dm_path_uevent -> _dm_uevent_type_names[] -> {DM_UEVENT_PATH_FAILED, KOBJ_CHANGE, "PATH_FAILED..."} dm_build_path_uevent dm_uevent_add -> void dm_uevent_add -> list_add(elist, &md->uevent_list)...-> 挂链表 dm_send_uevents -> void dm_send_uevents dm_copy_name_and_uuid kobject_uevent_env 发送uevent..., kobject_uevent这个函数原型如下,就是向用户空间发送uevent,可以理解为驱动(内核态)向用户(用户态)发送了一个KOBJ_ADD kobject_uevent_net_broadcast.../cha-udev.html linux设备模型: https://linux-kernel-labs.github.io/refs/pull/183/merge/labs/device_model.html
:1; unsigned int state_remove_uevent_sent:1; unsigned int uevent_suppress:1; }; name: 用来表示内核对象的名称...state_add_uevent_sent: 用来表示该内核对象是否向用户空间发送了ADD uevent事件 state_remove_uevent_sent:用来表示该内核对象是否向用户空间发送了Remove...uevent事件 uevent_suppress: 用来表示该内核对象状态发生改变时,时候向用户空间发送uevent事件,1表示不发送。...#include #include #include #include #include #include #include
Platform Devices and Drivers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See for the driver...For further information, see ....________ 这是由于二者结构获取硬件信息 的方式不同造成 的,在powerpc体系是通过dts 对比platform_driver和of_platform_driver 在include/linux...*); struct device_driver driver; const struct platform_device_id *id_table; }; 在include/linux...= of_device_uevent, }; of_device_uevent,在同上目录of_device.c定义 int of_device_uevent(struct device
如果vold.fstab解析无误,VolueManager将创建DirectVolume,若vold.fstab解析不存在或者打开失败,Vold将会读取Linux内核中的参数,此时如果参数中存在SDCARD...而Volume类中的相关操作最终通过调用Linux函数完成。 五、Vold用户态 1....发送消息给用户空间 3.1 发送消息流程图 3.2 kobject_uevent_env /** * kobject_uevent_env - send an uevent with environmental... = kset->uevent_ops; /* skip the event, if uevent_suppress is set*/ if (kobj->uevent_suppress... && uevent_ops->uevent) { retval = uevent_ops->uevent(kset, kobj, env); if (retval) {
:1; unsigned int state_remove_uevent_sent:1; unsigned int uevent_suppress:1; }; 每一个kobject实例都有一个名字...*uevent_ops; }; kset是kobject的容器,也就是说,它把kobject又封装了一下。...uevent_ops这个结构体存放了对这一组object的操作。具体什么操作,咱下回分解。...* Wang Sen (C) * 2012.3.23 */ #include #include #include #include #include #include <linux/
前言 Android底层服务,即运行在 linux 下的进程,是 Android 系统运行的基础,完成 Android 或者说计算机最基本的功能。...底层服务进程,往往具有更多的权限,可能和驱动通信,可能和 linux 内核通信,可能需要操作系统核心运行文件以及节点等等。所以,底层服务,可以帮你完成更多计算机基本功能。...include $(BUILD_EXECUTABLE) 编写native_main.cpp 在 Linux 中,一个开机启动的服务,执行完后会自动退出,而我们是守护进程,那么就需要一直运行。...// /* int eventct = 5; struct epoll_event events[eventct]; struct epoll_event ev; uevent_fd = uevent_open_socket..., F_SETFL, O_NONBLOCK); ev.events = EPOLLIN; ev.data.fd=uevent_fd; //注册 epoll fd if (epoll_ctl(epollfd
电池管理架构 Android系统对电池的管理驱动继承了linux的power supply class。...uevent事件 uevent_init(); //BatteryMonitor初始化。...uevent_fd = uevent_open_socket(64*1024, true); //将其设置为非阻塞模式 fcntl(uevent_fd, F_SETFL, O_NONBLOCK)...+2]; char *cp; int n; n = uevent_kernel_multicast_recv(uevent_fd, msg, UEVENT_MSG_LEN);...FCC:Full-charge capacity CC:Coulumb counter ### linux 电源子系统核心框架 #include/linux/power_supply.h struct
源码分析 main(入口函数) Linux内核加载完成后,在系统文件中寻找init.rc文件,并启动init进程。init进程的入口函数main。...([&uevent_handlers](const Uevent& uevent) { for (auto& uevent_handler : uevent_handlers) {...uevent_handler->HandleUevent(uevent); } return ListenerAction::kContinue; });...result.ok()) { LOG(FATAL) << result.error(); } //Epoll是Linux内核为处理大批量文件描述符而作的改进。...僵尸进程 在Unix/Linux中,父进程fork创建子进程,在子进程终止后,如果父进程不知道子进程已经终止了,这时子进程虽然退出了,但是系统进程表还保留它的信息,这个子进程就被称为僵尸进程。
前言 Linux将所有的设备统一抽象为struct device结构, 同时将所有的驱动统一抽象为struct device_driver结构。...数据结构 Linux将所有的设备统一抽象为struct device结构。...定义在 struct device { struct device *parent; struct device_private *p; struct kobject...(&dev->kobj, KOBJ_ADD); //使用uevent通知上层,这时候就会使用到device_uevent_ops中的函数 bus_probe_device...uevent: 在新增一个设备时,通过该函数上报设备类型的uevent。 devnode: 在创建一个设备节点的时候会使用到,获取设备的信息。
bionic git:(ffdd392b8196) git remote -v origin git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux.../+git/bionic (fetch) origin git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/bionic (...我们先看下wait变量的类型 // include/linux/wait.h typedef struct wait_queue_entry wait_queue_entry_t; ......struct epoll_event __user *uevent; ... for (eventcnt = 0, uevent = esed->events; !..., &uevent->data)) { ... } eventcnt++; uevent++; if (epi->event.events
函数: 1 static void uevent_init(void) { 2 uevent_fd = uevent_open_socket(64*1024, true); 3 4...uevent_fd, uevent_event)) 11 KLOG_ERROR(LOG_TAG, 12 "register for uevent events...failed\n"); 13 } 创建并打开一个64k的socket文件描述符uevent_fd,设置文件状态标志为非阻塞模,将uevent事件注册到uevent_fd文件节点用以监听uevent事件...这里以较为重要的uevent_event事件处理为例: 1 #define UEVENT_MSG_LEN 2048 2 3 static void uevent_event(uint32_t /...13 n = uevent_kernel_multicast_recv(uevent_fd, msg, UEVENT_MSG_LEN); 14 15 if (n <= 0) 16 17
Please run lunch next. ubuntu@ubuntu1804:~/tina-d1-h$ lunch You're building on Linux Lunch menu......---------------------------[ 9.916991] file system registered ------------------- Tina Linux (Neptune...regulator [ 11.024290] read descriptors [ 11.027508] read strings [ 11.254062] android_work: sent uevent...USB_STATE=CONFIGURED [ 11.498279] android_work: sent uevent USB_STATE=DISCONNECTED [ 11.555679]...android_work: sent uevent USB_STATE=CONNECTED root@TinaLinux:/#
领取专属 10元无门槛券
手把手带您无忧上云