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

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

>使用netlink socket接收从内核发送的uevents.

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

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

有人可以提供反馈吗?有利有弊的话会很棒.

谢谢

解决方法:

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

你是对的,vold正在使用netlink socket从内核接收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是一个简单的守护进程来处理像存储卡这样的块设备.

编辑子系统

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

例如,让我在插入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监视器输出,您可以看到以下子系统:

> usb

> scsi

> scsi_host

> scsi_disk

> scsi_device

> scsi_generic

> bsg

> bdi

>块

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

> / dev / disk / by-id /< entry>将基于磁盘SCSI WWN创建

> / dev / disk / by-path /< entry>将基于PCI连接和SCSI主机信息创建.

>依此类推

相比之下,vold只对来自块sybsystem的uevents感兴趣,它不关心scsi,usb或bdi的东西.

标签:android,linux-kernel,usb,udev

来源: https://codeday.me/bug/20190528/1174032.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐