充电学习—3、Uevent机制和其在android层的实现

news2024/10/5 16:30:49

在这里插入图片描述

  • sysfs 是 Linux userspace 和 kernel 进行交互的一个媒介。通过 sysfs,userspace 可以主动去读写 kernel 的一些数据,同样的, kernel 也可以主动将一些“变化”告知给 userspace。也就是说,通过sysfs,userspace 和 kernel 的交互,本质上是双向的
    userspace 通过 sysfs 访问 kernel 数据的方法,便是大名鼎鼎的 show() / store() 方法

  • uevent是通过netlink实现的,首先在内核中调用netlink_kernel_create函数创建一个socket套接字,当有事件发生时,通过kobject_uevent函数最终调用netlink_broadcast_fillted函数向用户发送数据;同时在用户空间有监听事件,则kernel的变化,用户空间即刻知晓

  • uevent初始化:
    uevent_net_init()创建类型为NETLINK_KOBJECT_UEVENT的socket,并将其放入uevent_sock_list链表上。uevent_net_exit()则将其从uevent_socket_list中摘除,并且释放socket相关资源

  • 对uevent_helper设置:
    Linux下热插拔通知用户空间
    对uevent_helper设置,可以对/proc/sys/kernel/hotplug写可执行文件路径即可。然后在内核触发uevent事件的之后调用相关可执行文件进行处理
    或者还可以对/proc/kernel/uevent_helper写入可执行文件路径
    usermode helper用于帮助在内核空间启动一个用户空间程序

1、kernel中uevent主要调用函数:

  • 通过内核发送uevent很简单,将数据代表环境变量的字符串组装好后,选择合适的action,指定对应的kobject设备即可
    kobject_uevent(&drv->p->kobj, KOBJ_ADD);
    kobject_uevent_env(kobj, action, NULL);
    retval = netlink_broadcast_filtered(uevent_sock, skb,0, 1, GFP_KERNEL,kobj_bcast_filter,kobj);
    uevent发送可以通过kobject_uevent(),或者通过kobject_uevent_env()附加更多uevent信息。

  • kobject_uevent_env()主要分为两部分,一是通过netlink_broadcast_filtered()将socket信息发出去;另一个是通过uevent helper将uevent调用指定的uevent_helper进行处理,通常是热插拔程序mdev、udevd等

  • 其中kobject_uevent函数中的action对应:
    KOBJ_ADD,
    KOBJ_REMOVE,
    KOBJ_CHANGE,
    KOBJ_MOVE,
    KOBJ_ONLINE,
    KOBJ_OFFLINE,

  • 而 kobject_uevent() 其实就是直接调用了 kobject_uevent_env() 函数。一切的操作,将在该函数中完成,比如 kset uevent ops (struct kset_uevent_ops)的获取、字符串的填充组合、netlink message 的发送等,这些 uevent ops 在 start_kernel() 就会被注册

  • 发送格式一般为:action@devpatch
    change@/devices/virtual/thermal/cooling_device0
    ACTION=change
    DEVPATH=/devices/virtual/thermal/cooling_device0
    SUBSYSTEM=thermal
    NAME=user_cooling
    STATE=1
    TEMP=90
    SEQNUM=747

2、userspace用户空间的实现使用:

用户空间会首先创建一个socket,并绑定到AF_NETLINK地址族上,然后recv接收消息,处理内核传递上来的message
创建socket——》recv接收uevent信息——》解析接收到的uevent信息——》地址族是AF_NETLINK类型的socket,协议类型是NETLINK_KOBJECT_UEVENT——》将当前socket绑定到AFNETLINK上,并设置本进程为处理消息的进程

3、mdev: kmod

busybox下的mdev;

  • mdev是一种附加“-s”主动遍历/sys/dev下设备,另一种是作为hotplug处理程序,被内核uevent helper调用到;
  • mdev作为hotplug程序处理时,从环境变量中获取参数,创建或删除设备
    /etc/mdev.con文件配置:

4、mdev和udev区别:

  • udev和mdev都是通过uevent机制处理热插拔的用户程序
  • udev在用户空间监听内核uevent消息,然后解析uevent消息进行相应的热插拔事件处理
  • mdev是基于uevent-helper机制,内核在发送uevent的时,同时调用uevent-helper指向的用户空间程序进行热插拔处理,
  • udev是作为一个demo常驻内存的,mdev是在需要时被调用

5、总结:

  • uevent是内核发送消息到用户空间的一种途径,通过netlink实现, 内核中通过kobject_uevent、kobject_uevent_env发送uevent消息
  • 用户空间使用标准的socket接口来监听接收uevent消息,;或者通过uevent-helper调用用户空间进程mdev来进行热插拔动作,处理方式遵循mdev.conf规则
  • 而 uevent 把事件上报给用户空间有两种途径:
    通过 kmod 模块,直接调用用户空间的可执行程序或脚本;
    通过 netlink 通信机制,将事件从内核空间传递到用户空间;

6、通过 uevent 上报电池电量:

内核:

drivers/power/supply/power_supply_core.c
drivers/power/supply/power_supply_sysfs.c
power_supply_init
power_supply_class->dev_uevent = power-suply_uevent

  • 初始化workqueue,后续用于调度;
    INIT_WORK(&psy->changed_work, power_supply_changed-work);

  • 驱动中检测到硬件发生变化时,调用power_supply_changed函数,进而调用changed_work
    schedule_work(&psy->changed_work);

  • 添加环境变量,回调kset中注册的power-supply-uevent,将msg以socketbuffer的格式打包
    power_supply_changed-work
    kobject-uevent(&psy->dev.kobj, KOBJ_CHANGE);
    kobject_uevent_env(struct kobject *kobj, enum kobject_action action, char *envp_ext[])
    if(envp_ext != NULL)
    add_uevent_var(env, “%s”, envp_ext[i]);
    if(uevent_ops && uevent_ops->uevent) // uevent_ops = kset->uevent_ops; uevent_ops->uevent = dev_uevent
    uevent_ops->uevent(kset, kobj, env); // power_supply_class->dev_uevent = power_supply_uevent; class类kset
    power_supply_uevent;
    add_uevent-var(env, “ACTION=%s”, action_string);
    add_uevent_var(env, “DEVPATH=%s”, devpath);
    add_uevent_var(env, “SUBSYSTEM=%s”, subsystem);

    kobject_uevent_net_boardcast(kobj, env, action_string, devpath);
    alloc_uevent_skb // sockect buffer的放置有关 header: action@devpath + socket_buffer
    scratch = skb_put(skb, len); /add header/
    sprintf(scratch, “%s@%s”, action_string, devpath);
    skb_put_data(skb, env->buf, env_buflen);

用户:

hardware/interfaces/health/utils/libhealthloop/HealthLoop.cpp

  • power_supply通过调用kobject_uevent, envp_ext为NULL, 会回调class的dev_uevent并且使用的是默认的add_uevent_var
  • ACTION=action_string DEVPATH=devpath SUBSYSTEM=subsystem,电池上层接受的时候会通过SUBSYSTEM进行过滤
    StartLoop
    epollfd.reset(epoll_create1(EPOLL_CLOEXEC)); // 进程被替换时会关闭文件描述符
    uevent_fd.reset(uevent_open_socket(64 * 1024, true)); // uevent_fd
    ev.events = EPOLLIN; // 1 新的请求, 2 接收到普通数据(缓冲未满) 3 正常关闭连接
    ev.events |= EPOLLWAKEUP; // 1 唤醒源, 系统会保持唤醒
    epoll_ctl(epollfd_, EPOLL_CTRL_ADD, uevent_fd_, &ev); // ADD表示绑定事件
    MainLoop -> while(1)
    epoll_wait(wpollfd_, events, eventctl, timeout); // epoll等待uevent事件
    uevent_kernel_multicast_recv // 接收uevent事件
    strcmp(cp, “SUBSYSTEM=” POWER_SUPPLY_SUBSYSTEM); // 判断subsystem,battery = power_supply
    ScheduleBatteryUpdate(); // 更新上报电池细节,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1832182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++中list容器常用接口

list的基本定义: 在C中&#xff0c;list被定义为一个双向链表容器。它是标准模板库&#xff08;STL&#xff09;中的一部分&#xff0c;位于<list>头文件中。 list是一个通用模板类&#xff0c;可以存储任何类型的数据&#xff0c;因此它是一个模板类。它实现了双向链表数…

【MATLAB】- 随笔 :如何检测一个字符串数组中是否包含自己想要的序列

1. 问题重述 比如我现在有一个 strArray [“a”, “1”, “2”, “b”]; 我想确定里面是否包含[“1”, “2”]; &#xff0c;由于MATLAB基础库中没有现成的函数可以直接检查连续子数组或连续多个元素的序列&#xff0c;下面给出自定义函数来实现这一功能。 2. 自定义函数 2…

vivado在implementation时出现错误[Place 30-494] The design is empty的一个可能原因和解决方法

在查询类似帖子时我发现这一问题是由于在设计实现时vivado认为没有输出端口所以报错。 于是在.v文件中我添加了一个随意的端口&#xff0c;并且在.xdc文件中为它分配了管脚 这样做的确可以让设计实现的过程顺利进行&#xff0c;但是会发现在summary中&#xff0c;设计实现的…

哈尔滨等保测评驱动下的智慧城市建设思考

面对滚滚而来的大数据时代&#xff0c;信息安全等级保护测评&#xff08;简称等保测评&#xff09;对城市发展的推动作用不容忽视。作为黑龙江省的省会&#xff0c;哈尔滨在智慧城市建设上的积极探索和实践&#xff0c;必须以完善的等保测评体系为前提&#xff0c;确保信息的安…

C++性能分析工具gperftools安装教程与使用案例分析

目录 1 什么是gperftools&#xff1f;2 gperftools安装流程3 gperftools使用案例 1 什么是gperftools&#xff1f; gperftools是Google Performance Tools的简称&#xff0c;是由谷歌开发的一套性能分析工具。它主要用于帮助开发人员进行性能分析和优化&#xff0c;使他们能够…

05眼动识别软件详情2波形优化

对应视频链接点击直达 01项目点击下载&#xff0c;可直接运行&#xff08;含数据库&#xff09; 05眼动识别软件详情2 对应视频链接点击直达期望的数据展示数据波形对比如何实现几种常用滤波介绍维纳滤波巴特沃斯滤波器中值滤波排序滤波 推荐 结语其他以下是废话 原始数据的波…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] K小姐和A先生的聚餐计划(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

[自动驾驶 SoC]-4 特斯拉FSD

FSD, 参考资料来源FSD Chip - Tesla - WikiChip 另外可参考笔者之前分享文章&#xff1a;[自动驾驶技术]-6 Tesla自动驾驶方案之硬件&#xff08;AI Day 2021&#xff09;&#xff0c;​​​​​​​[自动驾驶技术]-8 Tesla自动驾驶方案之硬件&#xff08;AI Day 2022&#xf…

短信群发平台众多,如何挑选一家靠谱的合作伙伴?

随着通信技术的不断发展和智能手机的普及&#xff0c;短信群发平台在企业营销、客户通知、活动推广等领域的应用越来越广泛。然而&#xff0c;市场上的短信群发平台琳琅满目&#xff0c;如何从中挑选出一家靠谱、高效、安全的合作伙伴&#xff0c;成为了许多企业和个人关注的焦…

Matlab r2023a v23.2.0 解锁版安装步骤 (工程计算商业数学软件)

前言 Matlab&#xff08;矩阵实验室&#xff09;是全球领先的数学计算软件开发商美国 MathWorks 公司研发的一款面向科学与工程计算的高级语言的商业数学软件&#xff0c;集算法开发、数据分析、可视化和数值计算于一体的编程环境&#xff0c;其核心是仿真交互式矩阵计算&…

管理员如何踢掉登录用户?

这是 Spring Security 学习小组有小伙伴提的一个问题&#xff1a; 感觉这个问题还有点意思&#xff0c;拿出来和各位小伙伴一起分享下。 一 问题分析 首先大家注意限制条件&#xff1a;常规 Session 方案。 如果不是这几个字&#xff0c;这个问题根本就不是问题&#xff0c;…

Python基础用法 之 输入 与 输出

1.输入 &#xff08;1&#xff09;什么是输入&#xff1f; 输入&#xff1a;获取键盘的输入信息。 &#xff08;2&#xff09;语法 变量 input(给使⽤者的提示信息,即告诉别⼈输入什么内容) &#xff08;3&#xff09;注意事项 代码从上到下执⾏, 当代码执⾏遇到 input 的时候…

【C++高阶】掌握C++多态:探索代码的动态之美

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C继承 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀继承 &#x1f4d2;1. 多态的定义及实现&…

个人学习算法总结的基础crud与算法思想数据结构解释

建议都从简单的crud入手,结合生活理解了结构与操作在去进阶更难的东西,做事有规划有步骤有时间限制这样比较好进步 跳转阅读

进化生物学的数学原理 知识点总结

1、进化论与自然选择 1.1 进化论 1、进化论 过度繁殖 -> 生存竞争 -> 遗传和变异 -> 适者生存 2、用进废退学说与自然选择理论 用进废退&#xff1a;一步适应&#xff1a;变异 适应 自然选择&#xff1a;两步适应&#xff1a;变异 选择 适应 3、木村资生的中性…

Mysql开启查询日志(General Log)

1、增加配置&#xff1a; /etc/my.cnf [mysqld] general_log1 general_log_file/var/log/mysql/query.log 2、增加目录和文件&#xff0c;并且授权 可以使用以下命令修改权限&#xff1a; 创建目录&#xff1a;sudo mkdir -p /var/log/mysql 更改目录所有者&#xff1a;sudo…

[环境配置]vscode通过ssh连接autodl进行项目开发

警告&#xff1a;如果使用VSCode直接执行或开终端执行训练程序&#xff0c;请在调试完成后最后通过screen/tmux工具开守护进程&#xff0c;确保程序不受SSH连接中断影响程序执行&#xff01; 官方文档&#xff1a;请戳 AutoDL使用方法&#xff1a; 在进行操作前您需要提前安装…

【日常记录】【插件】prisma 链接MySQL数据库 简单入门

文章目录 1、新建项目&#xff0c;使用prisma链接数据库1.1、先创建一个项目1.2、初始化 npm 配置文件及下载依赖1.3、初始化TS配置文件1.4、初始化 prisma1.5、更改 prisma/schema.prisma1.6 更改.env 文件1.7 编写 prisma/schema.prisma1.8 将编写的 prisma/schema.prisma 映…

实时数仓Hologres V2.2发布,Serverless Computing降本20%

Highlight 新发布Serverless Computing&#xff0c;提升大任务稳定性&#xff0c;同时可降低20%计算成本 引擎性能优化&#xff0c;TPC-H 1TB测试相对V1.X 提升100% 实时湖仓加速架构升级&#xff0c;支持Paimon&#xff0c;直读ORC、Parquet数据性能提升5倍以上 新增实例监…

如何安全进行亚马逊、沃尔玛测评?

在亚马逊、沃尔玛、速卖通、阿里国际站等电商平台上&#xff0c;测评已成为一种高效的推广手段&#xff0c;但伴随的风险也不容忽视。这些风险主要源于平台严格的大数据风控机制&#xff0c;它涵盖了多个方面&#xff0c;以确保评价的真实性和合规性。 首先&#xff0c;硬件参数…