我知道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

android vold,android – vold和udevd之间的区别相关推荐

  1. android布局距边距,Android初学者填充和边距之间的区别

    Android初学者填充和边距之间的区别 这个问题已经在这里有了答案: 视图的填充和边距之间的区别 14个答案 我已经提到了有关SO的问题. 还检查了答案: 填充是边框内部,边框和实际视图内容之间的空 ...

  2. Android 9.0 Vold 流程分析(-)

    Vold 介绍 Vold(volume Daemon),即Volume守护进程,用来管理Android中存储类的热拔插事件,处于Kernel和Framework之间,是两个层级连接的桥梁.vold 代 ...

  3. ANDROID中的VOLD分析

    现在可能很少有人会用mknod这个命令了,也很少有使用它的机会,但就在几年前,这还是一项linux工程师的必备技能,在制作文件系统前或加载新的驱动前,我们必须小心翼翼的创建设备节点. 不需要使用mkn ...

  4. android vold 分析,vold流程分析

    前言 框架 VOLD分析.png 代码分析 init进程启动vold Android起来后会解析init.rc,init.rc中启动了vold,代码如下 service vold /system/bi ...

  5. Android 9.0 Vold 挂载流程分析

    在Android 系统中所有的热插拔设备都是通过Vold 进程挂载的.通过kernel–>vold–>StorageManagerService这样的架构去逐级上报热插拔事件. 一.Vol ...

  6. Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析...

    在前面一篇文章中,我们分析了Android应用程序与SurfaceFlinger服务的连接过程.Android应用程序成功连接上SurfaceFlinger服务之后,还需要一块匿名共享内存来和Surf ...

  7. android jni 将BYTE* 和 jbyteArray 之间的转换

     今天,简单讲讲如何在jni中将  BYTE* 转成 jbyteArray. 这个是我在做jni时碰到的问题.因为c传回的值是BYTE*,而返回给java代码是byte[],对应的jni的数据 ...

  8. Android JSON数据与实体类之间的相互转化-------GSON的简单用法

    Android JSON数据与实体类之间的相互转化-------GSON的用法 1_Gson的导入 1.1_方法一:直接导入jar包 1.2_方法二:引入依赖 2_json形式的字符串互转实体对象 2 ...

  9. html5+、ReactNative、Weex、Ionic之间的区别、(配置java、python、Android环境)、ReactNative(react-native-cli)、yarn、Weex

    html5+.ReactNative.Weex.Ionic之间的区别: html5+和Ionic: 在开发原理上基本相同,都是需要先开发出一个完整的网站,再通过html5+或Ionic提供的打包技术对 ...

最新文章

  1. 屏幕滚动控件Scrollview
  2. WCHAR,CHAR,TCHAR的区别
  3. 未能将网站配置为使用ASP.NET4.0,不能打开VS项目
  4. 淘宝 oracle mysql_Oracle 与 MySQL 的区别-阿里云开发者社区
  5. STL源码剖析 set
  6. 程序员如何自制酒店 Wi-Fi?
  7. SQL 修改主键约束
  8. mysql 创建用户并赋予用户权限
  9. SSIS中的字符映射表转换组件
  10. 微信小程序项目-出租屋管理系统
  11. 南丁格尔玫瑰图的Python
  12. C函数的参数中有取地址符
  13. 二等分计算机打印机尺寸,241两等分打印纸尺寸 电脑打印纸,规格241mm等份是2等份,是多大的纸呀?...
  14. Windows软件清单
  15. 播布客教学视频_C学习笔记_8.1_统计1到100中9的个数(分治)
  16. 校园网拨号上网一直掉线但实际网络通路是连接着的
  17. 13. 利用 条件运算符 的嵌套来完成此题: 学习成绩>=90分的同学A表示, 60-89分之间的用B表示, 60分以下的用C表示
  18. 阿里云服务器如何解析添加二级域名+阿里云服务器或者其他网站绑定域名方法+域名解析是什么意思【申明:来源于网络】
  19. Ubuntu搭建zhenxunbot聊天机器人
  20. [STM32CubeMax配置] 一、系统RCC配置

热门文章

  1. 抖音怎么上热门网红 火山小视频md5修改器
  2. P6035CDN打印机 kyocera_京瓷ECOSYS P6035cdn驱动
  3. c语言float转bcd码
  4. css解决文本间距不一样的问题
  5. @WebFilter和@Component一起使用导致urlPatterns不起作用
  6. 超详细的张飞硬件90天读书笔记02
  7. 深度揭秘年薪60W的阿里P7简历制作过程!
  8. IntelliJ IDEA修改项目名字
  9. 计算机通信技术知识大全网络,计算机通信技术
  10. 2.1.4 运算放大器的等效模型、理想运算放大器的特性