Android vold与udevd的区别

Android vold与udevd的区别,android,linux-kernel,usb,udev,Android,Linux Kernel,Usb,Udev,我知道Android使用卷守护进程而不是udevd 由于这两个守护进程的行为类似于以下内容: void NetlinkHandler::onEvent(NetlinkEvent *evt) { VolumeManager *vm = VolumeManager::Instance(); const char *subsys = evt->getSubsystem(); if (!subsys) { SLOGW("No subsystem found

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

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

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);
    }
}
  • 使用netlink套接字接收从内核发送的UEVENT

  • 处理文件节点以进行进一步处理

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

    有人能提供反馈吗?这将是伟大的正反两方面

    谢谢

    看了之后,我只能说它只是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的主要区别,因为udevd处理所有子系统,而vold是一个简单的守护进程,用于处理存储卡之类的块设备

    良好的vold演示:

    在子系统上编辑

    子系统是内核作为一个整体的高级部分的表示。实际上,子系统只是内核的
    kset
    上的一个包装器。LDD3第14.1章——Kobjects、Ksets和子系统中有一篇很好的文章

    例如,让我们在插入U盘时监视事件

    $ 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)
    
    为了确定这个输出中的子系统是什么,让我们看看中的udev代码

    在第一个printf中,
    udev\u device\u get\u subsystem(device)
    将在括号中的最后一个字段中输出sybsystem

    因此,对于
    udevadm监视器
    输出,您可以看到以下子系统:

    • usb
    • scsi
    • scsi_主机
    • scsi磁盘
    • scsi\u设备
    • scsi_通用
    • bsg
    • bdi
    • 挡块
    udev将处理所有这些事件,例如在/dev下创建不同的条目

    • 将基于磁盘SCSI WWN创建
      /dev/disk/by id/
    • /dev/disk/by path/
      将根据PCI连接和SCSI主机信息创建
    • 等等

    相比之下,vold只对来自blocksybsystem的uevents感兴趣,它不关心scsi、usb或bdi内容。

    在android中没有udevd,它被称为ueventsd。Ueventsd和vold都出现在android中。Vold主要用于SD卡、pendrive等的拆卸存储。

    avd,您是否介意对模块和其他子系统进行更多解释?提供一些很好理解的例子。