hotplug_uevent机制

来源:互联网 发布:网站授权码系统源码 编辑:程序博客网 时间:2024/05/22 09:04

1、驱动部分

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);                    //分配保存环境变量的内存                    /* enviroment  values*/                    buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);                    /*设置环境变量*/                    envp[i++] = "HOME=/";                    envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";                    /* default keys */                    scratch = buffer;                    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); //调用应用程序 "/sbin/mdev"

2、分析busybox mdev.c

//# insmod dma.ko 100ask uevent_helper = /sbin/mdevenvp[0]=HOME=/envp[1]=PATH=/sbin:/bin:/usr/sbin:/usr/binenvp[2]=ACTION=addenvp[3]=DEVPATH=/module/dmaenvp[4]=SUBSYSTEM=moduleenvp[5]=SEQNUM=719100ask uevent_helper = /sbin/mdevenvp[0]=HOME=/envp[1]=PATH=/sbin:/bin:/usr/sbin:/usr/binenvp[2]=ACTION=addenvp[3]=DEVPATH=/class/s3c_dma/dmaenvp[4]=SUBSYSTEM=s3c_dmaenvp[5]=SEQNUM=720envp[6]=MAJOR=252envp[7]=MINOR=0
mdev_main    tmp = /sys/class/net/vnet0    make_device    /*确定设备文件名,类型,主次设备号*/        device_name = bb_basename(path); =dma        'c' == > 字符设备节点        根据“/sys//class/s3c_dma/dma/dev” 的内容确定主次设备号        mknod(device_name, mode | type, makedev(major, minor))