gpt4 book ai didi

android - vold和udevd的区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:07 25 4
gpt4 key购买 nike

我知道 Android 使用 volume daemon 而不是 udevd。

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

  1. 使用netlink socket接收内核发来的uevents。

  2. 处理文件节点以进行进一步处理。

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

有人可以提供反馈吗?这将是有利有弊的。

谢谢

最佳答案

看了vold source code之后我只能说它只是 udevd 的简单替代品。

你是对的,vold 正在使用 netlink 套接字从内核接收 uevents。但我会说它处理 block 子系统事件而不是你所说的“文件节点”。

在 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 是一个简单的守护进程,用于处理存储卡等 block 设备。

关于 vold 的精彩介绍:http://www.slideshare.net/wiliwe/android-storage-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)

要确定此输出中的子系统是什么,让我们看一下 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_disk
  • scsi_设备
  • scsi_generic
  • 背景
  • bdi
  • 阻止

udev 将处理所有这些事件以在/dev 下创建不同的条目,例如

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

相比之下,vold 只对来自 block sybsystem 的 uevent 感兴趣,它不关心 scsi、usb 或 bdi 的东西。

关于android - vold和udevd的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23467050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com