hotplug就是热拔插,在linux里面,这个功能是通过class_device_create这个函数来实现的,那么我们来分析下这个函数:

class_device_create(cls, NULL, MKDEV(major, 0), NULL, "dma"); /* /dev/dma */
          class_device_register(class_dev);
                    class_device_add(class_dev);
                              kobject_uevent(&class_dev->kobj, KOBJ_ADD);
                                       kobject_uevent_env(kobj, action, NULL);
                                                action_string = action_to_string(action);
                                                /* 分配保存环境变量的内存 */
                                                envp = kzalloc(NUM_ENVP * sizeof (char *), GFP_KERNEL);
                                                /* 设置环境变量 */
                                                envp[i++] = "HOME=/";
                                                scratch = buffer;
                                                envp [i++] = scratch;
                                                 .................................
                                                 /* 可以加打印语句将下面的变量打印出来,详见注释1 */
                                                char *argv [3];
                                                argv [0] = uevent_helper;
                                                argv [1] = (char *)subsystem;
                                                argv [2] = NULL;
                                                call_usermodehelper (argv[0], argv, envp, 0);  
                                                       /* 开启一个用户模式下的应用程序,其中path为应用程序的路径 */
                                                        call_usermodehelper_keys(path, argv, envp, NULL, wait);
                                                                  
 
注释1:
if (uevent_helper[0]) {
char *argv [3];
              /* 蓝色字体是我们加进去的打印语句 */
              printk("100ask:uevent_helper=%s\n",uevent_helper);
              for(i=0;envp[i];i++)
                {
                    printk("envp[%d]=%s\n",i,envp[i]);
                }
 
argv [0] = uevent_helper;
argv [1] = (char *)subsystem;
argv [2] = NULL;
call_usermodehelper (argv[0], argv, envp, 0);
}
在内核中加入如上的打印语句之后,重新编译内核:make uImage
然后用新内核启动,会看到很多打印环境变量的信息。
我们选择一个包含函数:class_device_create的驱动程序,加载后打印如下信息:
100ask:uevent_helper=/sbin/mdev     //我们看到uevent_helper是mdev
envp[0]=HOME=/
envp[1]=PATH=/sbin:/bin:/usr/sbin:/usr/bin
envp[2]=ACTION=add                        //ACTION=add,记住它
envp[3]=DEVPATH=/module/third_drv
envp[4]=SUBSYSTEM=module
envp[5]=SEQNUM=716
100ask:uevent_helper=/sbin/mdev
envp[0]=HOME=/
envp[1]=PATH=/sbin:/bin:/usr/sbin:/usr/bin
envp[2]=ACTION=add
envp[3]=DEVPATH=/class/third_drv/buttons
envp[4]=SUBSYSTEM=third_drv
envp[5]=SEQNUM=717
envp[6]=MAJOR=252                   //主设备号
envp[7]=MINOR=0                       //次设备号
 
于是我们知道call_usermodehelper 将会开启应用程序mdev,那么我们猜测mdev就根据主次设备号等环境变量来创建设备节点!
其实uevent_helper=mdev是在/etc/init.d/rcS里面的设置的,因为有这么一句:
echo /sbin/mdev > /proc/sys/kernel/hotplug
 
那么mdev到底做了什么呢?我们来看一下:busybox mdev.c  这个文件:
sprintf(temp, "/sys%s", env_path);//temp=/sys/class/third_drv/buttons,详见注释2
make_device(temp, 0);
          strcat(path, "/dev");//temp=/sys/class/third_drv/buttons/dev,这个dev文件里面放的就是主次设备号
          /* 确定设备名,类型,主次设备号 */
         device_name = bb_basename(path);          //确定设备名
         type = path[5]=='c' ? S_IFCHR : S_IFBLK; //获得类型
         sscanf(temp, "%d:%d", &major, &minor);  //扫描主次设备号
         mknod(device_name, mode | type, makedev(major, minor)) //根据设备名,主次设备号以及类型来创建设备节点
 
注释2:
DEVPATH=/class/third_drv/buttons
env_path = getenv("DEVPATH");
sprintf(temp, "/sys%s", env_path);
于是乎:temp=/sys/class/third_drv/buttons

hotplug\uevent机制(1)的更多相关文章

  1. 设备模型的uevent机制

    内核模块的热插拔事件的通知基于uevent机制. 当kobject的状态发生改变(如,add, remove等)时,会通知用户空间,用户空间接收到事件通知后可以做相应的处理.uevent把事件上报给用 ...

  2. android & Linux uevent机制

    Linux uevent机制 Uevent是内核通知android有状态变化的一种方法,比如USB线插入.拔出,电池电量变化等等.其本质是内核发送(可以通过socket)一个字符串,应用层(andro ...

  3. hotplug/mdev机制

    目录 hotplug/mdev机制 框架 kobject_uevent_env mdev_main make_device mdev.conf 配置文件学习 更改属性 @:创建设备节点之后执行命令 $ ...

  4. uevent机制

    uevent, user space event. 内核与用户空间的一种通信机制,基于netlink机制,主要用于设备驱动模型,例如热插拔. 1.调用/sbin/mdev的流程分析 在驱动程序中经常出 ...

  5. 34、uevent机制说明

    class_device_create(4.3.2内核是device_create->device_create_vargs->device_register->device_add ...

  6. Linux--内核Uevent事件机制 与 Input子系统【转】

    转自:http://blog.csdn.net/lxl584685501/article/details/46379453 [-] 一Uevent机制 Uevent在kernel中的位置 Uevent ...

  7. udev和mdev hotplug事件

    关于udev和mdev之间的区别与联系我发现自己现在还没有把它完整的给区分开来和联系起来. 设备文件系统有devfs,mdev,udev mdev是udev的简化版本,是busybox中所带的程序,最 ...

  8. Linux uevent分析、用户接收uevent以及mdev分析

    关键词:uevent.netlink.ADD/REMOVE/CHANGE.uevent_helper.hotplug.usermode helper.mdev.mdev.conf等等. 本文从三方面了 ...

  9. 二十三、uevnet机制和U盘自动挂载

    一.uevent机制 在分析之前,我们首先要知道uevent作用是什么.在此我们先来看一个uevent机制的框架图: 该图片来自:Linux设备模型(3)_Uevent 通过图片我们可以确定ueven ...

随机推荐

  1. 【PHP ThinkPHP框架】小bug汇总[更新]

    目录结构 1.函数调用 2.绑定select下拉框数据 3.PHP查询功能 4.格式化时间和价钱 5.IF标签比较两个变量 6.eq标签比较两个变量 7.新增信息或者修改信息的自动验证和自动填充 8. ...

  2. [CSS]white-space 属性详解

    实例 规定段落中的文本不进行换行: p { white-space: nowrap } 可能的值 值 描述 normal 默认.空白会被浏览器忽略. pre 空白会被浏览器保留.其行为方式类似 HTM ...

  3. 上传头像,界面无跳转,php+js

    上传头像,界面无跳转的方式很多,我用的是加个iframe那种.下面直接上代码. html: //route 为后端接口//upload/avatar 为上传的头像的保存地址//imgurl=/uplo ...

  4. Corosync+Pacemaker+DRBD+MySQL 实现高可用(HA)的MySQL集群

    大纲一.前言二.环境准备三.Corosync 安装与配置四.Pacemaker 安装与配置五.DRBD 安装与配置六.MySQL 安装与配置七.crmsh 资源管理 推荐阅读: Linux 高可用(H ...

  5. VS2013 调试卡顿

    今早好奇安装了花生壳远程控制软件.然后下午莫名的感觉到vs2013 调试特别的卡顿.会每隔1s中请求一次的那种卡顿于是卸载了花生壳控制软件,发现问题依旧.然后重启机器 ok了.果然不卡顿了. 我回忆了 ...

  6. poj 2187 Beauty Contest

    Beauty Contest 题意:给你一个数据范围在2~5e4范围内的横纵坐标在-1e4~1e4的点,问你任意两点之间的距离的最大值的平方等于多少? 一道卡壳凸包的模板题,也是第一次写计算几何的题, ...

  7. Python从list删除元素

    Paul同学刚来几天又要转走了,那么我们怎么把Paul 从现有的list中删除呢? 如果Paul同学排在最后一个,我们可以用list的pop()方法删除: >>> L = ['Ada ...

  8. WordPress数据库中的表、字段、类型及说明

    wp_categories: 用于保存分类相关信息的表.包括了5个字段,分别是: cat_ID – 每个分类唯一的ID号,为一个bigint(20)值,且带有附加属性auto_increment. c ...

  9. hdu 4778

    知道是状态压缩,但是不会做: 看题解学的: dp[i]表示现在状态是i,先手-后手的分数. #include<cstdio> #include<cstring> #includ ...

  10. POJ3714+最近点对

    特判标记即可 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h& ...