Android vold与udevd的区别
我知道Android使用卷守护进程而不是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
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);
}
}
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
- 挡块
- 将基于磁盘SCSI WWN创建
/dev/disk/by id/
将根据PCI连接和SCSI主机信息创建/dev/disk/by path/
- 等等
相比之下,vold只对来自blocksybsystem的uevents感兴趣,它不关心scsi、usb或bdi内容。在android中没有udevd,它被称为ueventsd。Ueventsd和vold都出现在android中。Vold主要用于SD卡、pendrive等的拆卸存储。avd,您是否介意对模块和其他子系统进行更多解释?提供一些很好理解的例子。