我知道Android使用卷守护程序而不是udevd。

由于这两个守护程序的行为类似于以下内容:

  • 使用netlink套接字接收内核发送的uevent。
  • 处理文件节点以进行进一步处理。

  • 我不清楚这两个不同守护程序之间的区别。

    有人可以提供反馈吗?优点和缺点将很棒。

    谢谢

    最佳答案

    看完vold source code之后,我只能说这只是udevd的简单替代。

    没错,vold正在使用netlink套接字从内核接收uevent。但是我要说的是,它处理的是子系统事件,而不是您所说的“文件节点”。

    在NetlinkHandler.cpp中,您可以看到以下内容:

    void NetlinkHandler::onEvent(NetlinkEvent *evt) {
        VolumeManager *vm = VolumeManager::Instance();
        const char *subsys = evt->getSubsystem();
    
        if (!subsys) {
            SLOGW("No subsystem found in netlink event");
            return;
        }
    
        if (!strcmp(subsys, "block")) {
            vm->handleBlockEvent(evt);
        }
    }
    

    最后几行只是将uevent子系统字符串与“block”进行比较。据我所知,那是与udevd的主要区别,因为udevd处理所有子系统的,而vold是处理诸如存储卡之类的块设备的简单守护程序。

    关于vold的精彩演讲:http://www.slideshare.net/wiliwe/android-storage-vold

    在子系统上编辑

    子系统代表整个内核的高层部分。实际上,子系统只是内核的kset的包装。在LDD3的第14.1章-Kobjects,Ksets和Subsystems中有一篇很好的文章。

    例如,让我们监视插入USB内存棒时的事件。
    $ udevadm monitor -k
    KERNEL[82215.299677] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)
    KERNEL[82215.299921] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0 (usb)
    KERNEL[82215.300192] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10 (scsi)
    KERNEL[82215.300226] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/scsi_host/host10 (scsi_host)
    KERNEL[82216.339987] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0 (scsi)
    KERNEL[82216.340047] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0 (scsi)
    KERNEL[82216.340069] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/scsi_disk/10:0:0:0 (scsi_disk)
    KERNEL[82216.340088] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/scsi_device/10:0:0:0 (scsi_device)
    KERNEL[82216.340302] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/scsi_generic/sg2 (scsi_generic)
    KERNEL[82216.340445] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/bsg/10:0:0:0 (bsg)
    KERNEL[82217.110295] add      /devices/virtual/bdi/8:16 (bdi)
    KERNEL[82217.141629] add      /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/block/sdb (block)
    

    为了确定此输出中的子系统是什么,让我们看一下udevadm-monitor.c中的udev代码
    static void print_device(struct udev_device *device, const char *source, int prop)
    {
            struct timespec ts;
    
            clock_gettime(CLOCK_MONOTONIC, &ts);
            printf("%-6s[%llu.%06u] %-8s %s (%s)\n",
                   source,
                   (unsigned long long) ts.tv_sec, (unsigned int) ts.tv_nsec/1000,
                   udev_device_get_action(device),
                   udev_device_get_devpath(device),
                   udev_device_get_subsystem(device));
            if (prop) {
                    struct udev_list_entry *list_entry;
    
                    udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(device))
                            printf("%s=%s\n",
                                   udev_list_entry_get_name(list_entry),
                                   udev_list_entry_get_value(list_entry));
                    printf("\n");
            }
    }
    

    在第一个printf中,udev_device_get_subsystem(device)将在括号的最后一个字段中输出sybsystem。

    因此,对于udevadm monitor输出,您可以看到以下子系统:
  • USB
  • scsi
  • scsi_host
  • scsi_disk
  • scsi_device
  • scsi_通用
  • bsg
  • bdi
  • 阻止

  • udev将处理所有这些事件,以在/dev下创建不同的条目,例如
  • /dev/disk/by-id/<entry>将基于磁盘SCSI WWN
  • 创建
  • /dev/disk/by-path/<entry>将基于PCI连接和SCSI主机信息创建。

  • 相反, vold 只对 sybsystem中的事件感兴趣,它并不关心scsi,usb或bdi东西。

    10-06 06:52