当前位置: 首页 > news >正文

廊坊免费网站建设模板国外做游戏评测的视频网站有哪些

廊坊免费网站建设模板,国外做游戏评测的视频网站有哪些,广西玉林网站建设正规公司,五金加工东莞网站建设1. Uevent的功能 Uevent是Kobject的一部分#xff0c;用于在Kobject状态发生改变时#xff0c;例如增加、移除等#xff0c;通知用户空间程序。用户空间程序收到这样的事件后#xff0c;会做相应的处理。 该机制通常是用来支持热拔插设备的#xff0c;例如U盘插入后用于在Kobject状态发生改变时例如增加、移除等通知用户空间程序。用户空间程序收到这样的事件后会做相应的处理。 该机制通常是用来支持热拔插设备的例如U盘插入后USB相关的驱动软件会动态创建用于表示该U盘的device结构相应的也包括其中的kobject并告知用户空间程序为该U盘动态的创建/dev/目录下的设备节点更进一步可以通知其它的应用程序将该U盘设备mount到系统中从而动态的支持该设备。 2. Uevent在kernel中的位置 下面图片描述了Uevent模块在内核中的位置 由此可知Uevent的机制是比较简单的设备模型中任何设备有事件需要上报时会触发Uevent提供的接口。Uevent模块准备好上报事件的格式后可以通过两个途径把事件上报到用户空间一种是通过kmod模块直接调用用户空间的可执行文件另一种是通过netlink通信机制将事件从内核空间传递给用户空间。 3数据结构描述 kobject_action /* * The actions here must match the index to the string array * in lib/kobject_uevent.c * * Do not add new actions here without checking with the driver-core * maintainers. Action strings are not meant to express subsystem * or device specific properties. In most cases you want to send a * kobject_uevent_env(kobj, KOBJ_CHANGE, env) with additional event * specific variables added to the event environment. */ enum kobject_action {KOBJ_ADD, KOBJ_REMOVE, //Kobject或上层数据结构的添加/移除事件KOBJ_CHANGE, //Kobject或上层数据结构的状态或者内容发生改变; 如果设备驱动需要上报的事件不再上面事件的范围内或者是自定义的事件可以使用该event并携带相应的参数。KOBJ_MOVE, //Kobject或上层数据结构更改名称或者更改Parent意味着在sysfs中更改了目录结构KOBJ_ONLINE,KOBJ_OFFLINE, //Kobject或上层数据结构的上线/下线事件其实是是否使能KOBJ_BIND,KOBJ_UNBIND, }; kobj_uevent_env #define UEVENT_NUM_ENVP 64 /* number of env pointers */ #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */ /* environment buffer */ struct kobj_uevent_env {char *argv[3];char *envp[UEVENT_NUM_ENVP]; //环境变量的指针数组envp指向每一个环境变量int envp_idx; //环境变量的索引char buf[UEVENT_BUFFER_SIZE]; //存储所有环境变量的bufferint buflen; //环境变量的buffer的长度 }; kset_uevent_ops struct kset {struct list_head list;spinlock_t list_lock;struct kobject kobj;const struct kset_uevent_ops *uevent_ops;ANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);ANDROID_KABI_RESERVE(3);ANDROID_KABI_RESERVE(4); } __randomize_layout;kset_uevent_ops 是为kset量身订做的一个数据结构里面包含filter和uevent两个回调函数 * uevent_ops: the set of uevent operations for this kset. These are * called whenever a kobject has something happen to it so that the kset * can add new environment variables, or filter out the uevents if so * desired. struct kset_uevent_ops {int (* const filter)(struct kset *kset, struct kobject *kobj); //当任何Kobject需要上报uevent时它所属的kset可以通过该接口过滤阻止不希望上报的event从而达到从整体上管理的目的const char *(* const name)(struct kset *kset, struct kobject *kobj); //接口可以返回kset的名称。如果一个kset没有合法的名称则其下的所有Kobject将不允许上报uventint (* const uevent)(struct kset *kset, struct kobject *kobj, struct kobj_uevent_env *env); //当任何Kobject需要上报uevent时它所属的kset可以通过该接口统一为这些event添加环境变量 };eg static const struct kset_uevent_ops bus_uevent_ops {.filter bus_uevent_filter, };bus_kset kset_create_and_add(bus, bus_uevent_ops, NULL);kset kset_create(name, uevent_ops, parent_kobj);kset-uevent_ops uevent_ops;kset_register(kset);kobject_uevent(k-kobj, KOBJ_ADD); 4常用API 4.1 kobject_uevent_env 以envp为环境变量上报一个指定action的uevent。环境变量的作用是为执行用户空间程序指定运行环境。 /** * kobject_uevent_env - send an uevent with environmental data * * kobj: struct kobject that the action is happening to * action: action that is happening * envp_ext: pointer to environmental data * * Returns 0 if kobject_uevent_env() is completed with success or the * corresponding error when it fails. */ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,char *envp_ext[]) {struct kobj_uevent_env *env;const char *action_string kobject_actions[action];const char *devpath NULL;const char *subsystem;struct kobject *top_kobj;struct kset *kset;const struct kset_uevent_ops *uevent_ops;int i 0;int retval 0;/** Mark remove event done regardless of result, for some subsystems* do not want to re-trigger remove event via automatic cleanup.*/if (action KOBJ_REMOVE)kobj-state_remove_uevent_sent 1;pr_debug(kobject: %s (%p): %s\n,kobject_name(kobj), kobj, __func__);/* search the kset we belong to */top_kobj kobj;while (!top_kobj-kset top_kobj-parent)top_kobj top_kobj-parent;//查找kobj本身或者其parent是否从属于某个kset如果不是则报错返回由此可以说明如果一个kobject没有加入kset是不允许上报uevent的if (!top_kobj-kset) {pr_debug(kobject: %s (%p): %s: attempted to send uevent without kset!\n, kobject_name(kobj), kobj,__func__);return -EINVAL;}kset top_kobj-kset;uevent_ops kset-uevent_ops;//查看kobj-uevent_suppress是否设置如果设置则忽略所有的uevent上报并返回注3由此可知可以通过Kobject的uevent_suppress标志管控Kobject的uevent的上报/* skip the event, if uevent_suppress is set*/if (kobj-uevent_suppress) {pr_debug(kobject: %s (%p): %s: uevent_suppress caused the event to drop!\n,kobject_name(kobj), kobj, __func__);return 0;}//如果所属的kset有uevent_ops-filter函数则调用该函数过滤此次上报注4这佐证了3.2小节有关filter接口的说明kset可以通过filter接口过滤不希望上报的event从而达到整体的管理效果/* skip the event, if the filter returns zero. */if (uevent_ops uevent_ops-filter)if (!uevent_ops-filter(kset, kobj)) {pr_debug(kobject: %s (%p): %s: filter function caused the event to drop!\n,kobject_name(kobj), kobj, __func__);return 0;}//判断所属的kset是否有合法的名称称作subsystem和前期的内核版本有区别否则不允许上报uevent/* originating subsystem */if (uevent_ops uevent_ops-name)subsystem uevent_ops-name(kset, kobj);elsesubsystem kobject_name(kset-kobj);if (!subsystem) {pr_debug(kobject: %s (%p): %s: unset subsystem caused the event to drop!\n, kobject_name(kobj), kobj,__func__);return 0;}//* 分配一个用于此次上报的、存储环境变量的buffer结果保存在env指针中并获得该Kobject在sysfs中路径信息用户空间软件需要依据该路径信息在sysfs中访问它/* environment buffer */env kzalloc(sizeof(struct kobj_uevent_env), GFP_KERNEL);if (!env)return -ENOMEM;/* complete object path */devpath kobject_get_path(kobj, GFP_KERNEL);if (!devpath) {retval -ENOENT;goto exit;}//调用add_uevent_var接口下面会介绍将Action、路径信息、subsystem等信息添加到env指针中/* default keys */retval add_uevent_var(env, ACTION%s, action_string);if (retval)goto exit;retval add_uevent_var(env, DEVPATH%s, devpath);if (retval)goto exit;retval add_uevent_var(env, SUBSYSTEM%s, subsystem);if (retval)goto exit;/* keys passed in from the caller */if (envp_ext) {for (i 0; envp_ext[i]; i) {retval add_uevent_var(env, %s, envp_ext[i]);if (retval)goto exit;}}//如果所属的kset存在uevent_ops-uevent接口调用该接口添加kset统一的环境变量到env指针/* let the kset specific function add its stuff */if (uevent_ops uevent_ops-uevent) {retval uevent_ops-uevent(kset, kobj, env);if (retval) {pr_debug(kobject: %s (%p): %s: uevent() returned %d\n, kobject_name(kobj), kobj,__func__, retval);goto exit;}}//根据ACTION的类型设置kobj-state_add_uevent_sent和kobj-state_remove_uevent_sent变量以记录正确的状态switch (action) {case KOBJ_ADD:/** Mark add event so we can make sure we deliver remove* event to userspace during automatic cleanup. If* the object did send an add event, remove will* automatically generated by the core, if not already done* by the caller.*/kobj-state_add_uevent_sent 1;break;case KOBJ_UNBIND:zap_modalias_env(env);break;default:break;}//调用add_uevent_var接口添加格式为SEQNUM%llu”的序列号mutex_lock(uevent_sock_mutex);/* we will send an event, so request a new sequence number */retval add_uevent_var(env, SEQNUM%llu, uevent_seqnum);if (retval) {mutex_unlock(uevent_sock_mutex);goto exit;}//如果定义了CONFIG_NET”则使用netlink发送该ueventretval kobject_uevent_net_broadcast(kobj, env, action_string,devpath);mutex_unlock(uevent_sock_mutex);//以uevent_helper、subsystem以及添加了标准环境变量HOME/PATH/sbin:/bin:/usr/sbin:/usr/bin的env指针为参数调用kmod模块提供的call_usermodehelper函数上报uevent #ifdef CONFIG_UEVENT_HELPER/* call uevent_helper, usually only enabled during early boot */if (uevent_helper[0] !kobj_usermode_filter(kobj)) {struct subprocess_info *info;retval add_uevent_var(env, HOME/);if (retval)goto exit;retval add_uevent_var(env,PATH/sbin:/bin:/usr/sbin:/usr/bin);if (retval)goto exit;retval init_uevent_argv(env, subsystem);if (retval)goto exit;retval -ENOMEM;info call_usermodehelper_setup(env-argv[0], env-argv,env-envp, GFP_KERNEL,NULL, cleanup_uevent_env, env);if (info) {retval call_usermodehelper_exec(info, UMH_NO_WAIT);env NULL; /* freed by cleanup_uevent_env */}} #endifexit:kfree(devpath);kfree(env);return retval; } EXPORT_SYMBOL_GPL(kobject_uevent_env); Android在源码目录:system/extras/tests/uevents/中可以监听底层UEvent事件上报的程序该程序没有自动编译到系统中需要单独编译。 编译完成后可以编译成system/bin/uevents的可执行程序可以通过adb shell输入uenvets可以查看上报事件 change/devices/platform/soc/soc:mmi,charger/power_supply/mmi_battery ACTIONchange DEVPATH/devices/platform/soc/soc:mmi,charger/power_supply/mmi_battery SUBSYSTEMpower_supply POWER_SUPPLY_NAMEmmi_battery POWER_SUPPLY_TYPEMains POWER_SUPPLY_STATUSFull POWER_SUPPLY_HEALTHGood POWER_SUPPLY_TEMP250 POWER_SUPPLY_CAPACITY100 POWER_SUPPLY_CYCLE_COUNT2 POWER_SUPPLY_CHARGE_FULL4015000 POWER_SUPPLY_CHARGE_FULL_DESIGN4015000 POWER_SUPPLY_VOLTAGE_NOW4379000 POWER_SUPPLY_CURRENT_NOW-704000 POWER_SUPPLY_CHARGE_COUNTER4015000 SEQNUM54900 change/devices/platform/soc/ae00000.qcom,mdss_mdp/backlight/panel0-backlight ACTIONchange DEVPATH/devices/platform/soc/ae00000.qcom,mdss_mdp/backlight/panel0-backlight SUBSYSTEMbacklight SOURCEsysfs SEQNUM54903 主动向uevent 节点写入add也会导致内核生成并重新发送当前注册设备的uevent消息 console 1 /sys/bus/platform/devices/goodix_ts.0 # echo add uevent console 2 lynkco:/system/bin # uevents add/devices/platform/goodix_ts.0 ACTIONadd DEVPATH/devices/platform/goodix_ts.0 SUBSYSTEMplatform SYNTH_UUID0 DRIVERgoodix_ts MODALIASplatform:goodix_ts SEQNUM55327 4.2 kobject_uevent 和kobject_uevent_env功能一样只是没有指定任何的环境变量。 /** * kobject_uevent - notify userspace by sending an uevent * * kobj: struct kobject that the action is happening to * action: action that is happening * * Returns 0 if kobject_uevent() is completed with success or the * corresponding error when it fails. */ int kobject_uevent(struct kobject *kobj, enum kobject_action action) {return kobject_uevent_env(kobj, action, NULL); } EXPORT_SYMBOL_GPL(kobject_uevent); 4.3 add_uevent_var /** * add_uevent_var - add key value string to the environment buffer * env: environment buffer structure * format: printf format for the keyvalue pair * * Returns 0 if environment variable was added successfully or -ENOMEM * if no space was available. */ int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) {va_list args;int len;//环境变量的个数不能超过最大值if (env-envp_idx ARRAY_SIZE(env-envp)) {WARN(1, KERN_ERR add_uevent_var: too many keys\n);return -ENOMEM;}//把环境变量格式化输出到 env-bufva_start(args, format);len vsnprintf(env-buf[env-buflen],sizeof(env-buf) - env-buflen,format, args);va_end(args);//检查buffer sizeif (len (sizeof(env-buf) - env-buflen)) {WARN(1, KERN_ERR add_uevent_var: buffer size too small\n);return -ENOMEM;}//env-envp[env-envp_idx]指向此次添加的环境变量通过envp_idx能直接取出keyvalue pairenv-envp[env-envp_idx] env-buf[env-buflen];//增加buflen计数两个keyvalue中间有空格env-buflen len 1;return 0; } EXPORT_SYMBOL_GPL(add_uevent_var); 4.4 kobject_action_type 将enum kobject_action类型的Action转换为字符串。 5API使用示例 向user space发送自定义的uevent事件。 1env kzalloc(sizeof(*env), GFP_KERNEL_ACCOUNT);if (!env)return;add_uevent_var(env, CREATED%llu, created);add_uevent_var(env, COUNT%llu, active);if (type KVM_EVENT_CREATE_VM) {add_uevent_var(env, EVENTcreate);kvm-userspace_pid task_pid_nr(current);} else if (type KVM_EVENT_DESTROY_VM) {add_uevent_var(env, EVENTdestroy);}add_uevent_var(env, PID%d, kvm-userspace_pid);if (kvm-debugfs_dentry) {char *tmp, *p kmalloc(PATH_MAX, GFP_KERNEL_ACCOUNT);if (p) {tmp dentry_path_raw(kvm-debugfs_dentry, p, PATH_MAX);if (!IS_ERR(tmp))add_uevent_var(env, STATS_PATH%s, tmp);kfree(p);}}/* no need for checks, since we are adding at most only 5 keys */env-envp[env-envp_idx] NULL;kobject_uevent_env(kvm_dev.this_device-kobj, KOBJ_CHANGE, env-envp);kfree(env);2char *envp[4] { FC_EVENTnvmediscovery, hostaddr, tgtaddr, NULL };kobject_uevent_env(fc_udev_device-kobj, KOBJ_CHANGE, envp); 参考链接 Linux设备模型(3)_Uevent
http://www.zqtcl.cn/news/17842/

相关文章:

  • 自己做网站维护挣钱吗风险网站怎么解决方案
  • 免费注册网站云空间域名注册好了怎么做网页
  • 网站建设基础流程摘要中介网站制度建设
  • 网站开发算什么费用宁波seo推广推荐公司
  • 知名网站设计欣赏在家做兼职官方网站平台
  • 网站建立吸引人的策划活动温州快速建站公司
  • 购物网站网页设计模板上海网站建设服
  • 做淘宝还是京东还是做网站合肥墙面刷新
  • 网站的服务器每年都要续费的吗保定网站制作案例
  • 无锡哪里做网站好计算机个人网站建设论文
  • 电子商务网站的建设包含哪些流程网站 专题建设服务
  • 有自媒体谁还做网站2022年中国企业500强
  • 电商网站 建设步骤泰安人才网最新消息
  • 定制网站建设程序流程写作墨问题 网站
  • 360seo优化网站优化软件有哪些
  • 课程网站建设课程现在的网站做多大尺寸的
  • 布拖网站建设一个网站的建设需要什么
  • 益阳网站开发公司选择网站做友情链接的标准一般是
  • 糟糕的网站设计wordpress缩略图外链
  • 做ppt素材网站哪个好企业内部网站建设
  • 怎样建设打字网站自己做头像网站
  • 马鞍山集团网站建设定制直播app
  • 网站开发前端与后端源代码wordpress增强搜索
  • 搭建网站平台需要多少钱wordpress 目录 伪静态
  • 网站设计需要需要用网站开发 项目规划 怎么写
  • 做网站要多少的分辨率烟台做网站企业
  • 国外做外贸哪个网站好些如何制作一个网站做淘宝券
  • 云梦网如何做网站电脑培训班多少费用
  • 网站互联网推广塘沽论坛网
  • 网站服务是什么淘宝官网电脑版网页