mdev机制(二)————在Linux内核中的实现

来源:互联网 发布:mac如何强制删除程序 编辑:程序博客网 时间:2024/06/03 22:05
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/mdevenvp[0] = HOME=/envp[1] = PATH=/sbin:/bin:/usr/sbin:/usr/binenvp[2] = ACTION=addenvp[3] = DEVPATH=/class/sixth_drv/buttonsenvp[4] = SUBSYSTEM=sixth_drvenvp[5] = SEQNUM=720envp[6] = MAJOR=252envp[7] = MINOR=0mdev_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)
0 0
原创粉丝点击