(class_device_create的目的是为了让mdev根据它注册的信息来创建设备节点)

class_device_create
  class_device_register
    class_device_add
      kobject_uevent(&class_dev->kobj, KOBJ_ADD);
        kobject_uevent_env(kobj, action, NULL);

          // action_string = "add";action_string在这里被赋值
          action_string = action_to_string(action);//kobject_uevent函数的第二个参数就是action

          /* 分配保存环境变量的内存 */
          /* environment values */
          buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);

          /* 设置环境变量 */
          envp [i++] = scratch;
          scratch += sprintf(scratch, "ACTION=%s", action_string) + 1;
          envp [i++] = scratch;
          scratch += sprintf (scratch, "DEVPATH=%s", devpath) + 1;
          envp [i++] = scratch;
          scratch += sprintf(scratch, "SUBSYSTEM=%s", subsystem) + 1;

          /* 调用应用程序: 比如mdev */
          /* 启动脚本 echo /sbin/mdev > /proc/sys/kernel/hotplug
          * 设置了uevent_helper为“/sbin/mdev“
          */
          argv [0] = uevent_helper; // = "/sbin/mdev",通过在这里加打印可以看到argv参数和环境变量的值,如下面100ask开头的这行
          argv [1] = (char *)subsystem;
          argv [2] = NULL;
          call_usermodehelper (argv[0], argv, envp, 0);//调用应用程序argv[0],并传入envp环境变量

分析: busybox源码中 mdev.c文件

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/sixth_drv/buttons
envp[4] = SUBSYSTEM=sixth_drv
envp[5] = SEQNUM=720
envp[6] = MAJOR=252
envp[7] = MINOR=0

mdev_main
  temp = /sys/class/sixth_drv/buttons
  make_device(temp, 0);
    /* 确定设备文件名,类型,主次设备号 */
    device_name = bb_basename(path); = "buttons"

    'c' == > 字符设备节点

    type = path[5]=='c'?S_IFCHR:S_IFBLK;//path=/sys/class/sixth_drv/buttons
    

    根据"/sys/class/sixth_drv/buttons/dev"的内容确定主次设备号(class下面都是字符设备)
    (sscanf(temp,"%d:%d",&major,&minor))

    mknod(device_name, mode | type, makedev(major, minor)

在/etc/init.d/rcS(启动脚本)中有一句

echo  /sbin/mdev  >  /proc/sys/kernel/hotplug

这句设置了设置了uevent_helper为“/sbin/mdev

mdev的主函数在运行的时候,如果有/etc/mdev.conf这个文件就会根据文件里的内容做某些事情

我接上U盘,想自动挂载,怎么办?(查看内核中mdev.txt文档)
mdev.conf的格式:
<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]

device regex:正则表达式,表示哪一个设备
uid: owner
gid: 组ID
octal permissions:以八进制表示的属性
@:创建设备节点之后执行命令
$:删除设备节点之前执行命令
*: 创建设备节点之后 和 删除设备节点之前 执行命令
command:要执行的命令

写mdev.conf
1.
leds 0:0 777(表示在有leds设备节点的时候设置组属性是777,默认的属性是660)
led1 0:0 777
led2 0:0 777
led3 0:0 777

2.
leds?[123]? 0:0 777

3.
leds?[123]? 0:0 777 @ echo create /dev/$MDEV > /dev/console

4.
leds?[123]? 0:0 777 * if [ $ACTION = "add" ]; then echo create /dev/$MDEV > /dev/console; else echo remove /dev/$MDEV > /dev/console; fi

($MDEV表示执行命令时的设备节点)

5.
leds?[123]? 0:0 777 * /bin/add_remove_led.sh

把命令写入一个脚本:(chmod +x /bin/add_remove_led.sh表示给脚本加上可执行权限)
add_remove_led.sh

#!/bin/sh
if [ $ACTION = "add" ];
then
echo create /dev/$MDEV > /dev/console;
else
echo remove /dev/$MDEV > /dev/console;
fi

6. U盘自动加载
sda[1-9]+ 0:0 777 * if [ $ACTION = "add" ]; then mount /dev/$MDEV /mnt; else umount /mnt; fi

7.
sda[1-9]+ 0:0 777 * /bin/add_remove_udisk.sh

add_remove_udisk.sh
#!/bin/sh
if [ $ACTION = "add" ];
then
mount /dev/$MDEV /mnt;
else
umount /mnt;
fi

23、uevent/hotplug热拔插机制的更多相关文章

  1. hotplug 热拔插机制框架

    框架入口源文件: mdev.c (可根据入口源文件,再按着框架到内核走一遍) 内核版本:linux_2.6.22.6     硬件平台:JZ2440 以下是驱动框架:

  2. [热拔插] 轻量级Winform插件式框架

    写在前面的话 对于大神,Winform这种“古董玩具”,实在没太多“技术性”可言了,然而『好用才是王道』,本文不以技术为卖点,纯属经验之谈,欢迎交流拍砖 朴素版UI 开发初衷 由于本人所在公司不定时需 ...

  3. centos-linux热拔插scsi硬盘

    自己配置虚拟机,需要添加一块虚拟硬盘存放数据.虚拟机在更新软件,不想停机.学习了下热拔插硬盘的知识点 1. 在虚拟机中创建虚拟磁盘并添加. 2. 查看目前的磁盘信息cat /proc/scsi/scs ...

  4. window 如何枚举设备并禁用该设备和启用该设备?如何注册设备热拔插消息通知?

    目前实现的功能: 1.设备枚举 2.设置设备禁用和启用 3.注册设备热拔插消息通知 4.获取设备 vid pid 数值 需要链接的库 SetupAPI.lib DeviceManager 类如下: D ...

  5. 【转】如何在VC下检测当前存在的串口及串口热拔插

    当我们在用VS进行串口编程时,在打开串口前,经常想知道当前PC上存在多少个串口,哪些串口可用?哪些串口已经打开了,最好是在一个Combo Box中列表系统当前所有可用的串口以供选择,然而如何获取系统当 ...

  6. Linux mdev 热拔插配置

    在嵌入式领域使用比较多的是用 mdev 进行热插拔的操作. 文件系统进行配置 # 首先对 /etc/fstab 进行配置 # <file system> <mount pt> ...

  7. 23.3.3 Web存储机制【JavaScript高级程序设计第三版】

    Web Storage 最早是在Web 超文本应用技术工作组(WHAT-WG)的Web 应用1.0 规范中描述的. 这个规范的最初的工作最终成为了HTML5 的一部分.Web Storage 的目的是 ...

  8. HDMI接口之HPD(热拔插)

    HDMI (Pin 19)/DVI(Pin16)的功能是热插拔检测(HPD),这个信号将作为HDMI 源端(Source)是否发起EDID读,是否开始发送TMDS信号的依据.HPD是从HDMI显示器端 ...

  9. Linux 设备模型浅析之 uevent 篇(2)

    Linux 设备模型浅析之 uevent 篇 本文属本人原创,欢迎转载,转载请注明出处.由于个人的见识和能力有限,不可能面 面俱到,也可能存在谬误,敬请网友指出,本人的邮箱是 yzq.seen@gma ...

随机推荐

  1. 转 SQL集合函数中利用case when then 技巧

    SQL集合函数中利用case when then 技巧 我们都知道SQL中适用case when then来转化数据库中的信息 比如  select (case sex when 0 then '男' ...

  2. 洛谷——P1498 南蛮图腾

    https://www.luogu.org/problem/show?pid=1498 题目描述 自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往 ...

  3. POJ 1442 Black Box treap求区间第k大

    题目来源:POJ 1442 Black Box 题意:输入xi 输出前xi个数的第i大的数 思路:试了下自己的treap模版 #include <cstdio> #include < ...

  4. UnrealEngine4针对游戏模式的思考

    游戏能够概括为三类:单进程联机(超级玛丽).小规模联机(魔兽争霸.CS),大规模联机(魔兽世界). watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmx1c ...

  5. fragment-实例创建跟使用

    今天接触到了fragment,在网上看到了它的使用方法.现在把它的创建跟使用记录下,方便以后查询. 1.创建一个自己的fragment,继承自fragment package com.android. ...

  6. 基于TC技术的网络流量控制实战

    本文转载在:http://server.it168.com/a2010/0426/878/000000878406.shtml 基于TC技术的网络流量控制实战 650) this.width=650; ...

  7. c#中文字符串与byte数组互相转化

    因为中文字符串一个字符占两个字节,所以不能用正常的方式与byte之间进行互相转化 中文字符串转成byte[] byte[] ping = Encoding.UTF8.GetBytes("你的 ...

  8. Wiz+360云盘,让你的知识库井井有条

    用了wiz快两年了,一些同事看到我在找资料时打开wiz,总会好奇的问这是什么,想到还有很多同仁在用文件夹管理知识库,于是想分享一下我的管理方法.(PS:鄙人愚见,如有高见,望指教) Wiz为知笔记下载 ...

  9. 【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 枚举最大量maxdep 在dfs里面传剩余的要凑的分子.分母 以及上一次枚举的值是多少. 然后找到最小的k,满足1/ ...

  10. 洛谷 P1287 盒子与球

    P1287 盒子与球 题目描述 现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子.问有多少种方法? 例如:有2个不同的盒子(分别编为1号和2号)和3个不同的球(分 ...