zoukankan      html  css  js  c++  java
  • uevent

    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_to_string(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 [1] = (char *)subsystem;
    				argv [2] = NULL;
    				call_usermodehelper (argv[0], argv, envp, 0);
    

    分析: 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' == > 字符设备节点
    	根据"/sys/class/sixth_drv/buttons/dev"的内容确定主次设备号
    	
    	mknod(device_name, mode | type, makedev(major, minor)
    

    我接上U盘,想自动挂载,怎么办?
    mdev.conf的格式:
    : [<@|$|*> ]

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

    写mdev.conf
    1.
    leds 0:0 777
    led1 0:0 777
    led2 0:0 777
    led3 0:0 777

    leds?[123]? 0:0 777

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

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

    leds?[123]? 0:0 777 * /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

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

    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

    版权声明:本文为博主原创文章,转载请注明文章来源,有需要帮忙可加QQ:871263854
  • 相关阅读:
    用js实现cookie的读、写、全部删除和删除指定cookie值的删除---源码
    JS手机号码格式验证
    vuex
    解决“此图片来自微信公众平台未经允许不可引用”的方法
    二叉树
    剑指 Offer 10- II. 青蛙跳台阶问题
    logrotate处理Gunicorn日志
    Linux日志切割神器logrotate原理介绍和配置详解
    Jenkins任务启动的后台进程被自动kill
    Flex、Grid、媒体查询实现响应式布局
  • 原文地址:https://www.cnblogs.com/Dream998/p/8540764.html
Copyright © 2011-2022 走看看